Projekt

Allgemein

Profil

Wiki » Historie » Version 2

Maximilian Seesslen, 10.09.2025 11:37

1 2 Maximilian Seesslen
Small general purpose C++ library for microcontrollers like STM32 with flash sizes down to 16 KByte.
2
3
4
It provides classes 
5
* Lists
6
* Ring buffers
7
* Strings
8
* Checksums
9
* Logging
10
* Signaling
11
* Testing
12
13
Some functions are similar to Qt but very reduced to work on microcontrollers with down to 16KiB of flash.
14
15
(Naming is from 'Leptothorax', a small ant)
16 1 Maximilian Seesslen
h1. Wiki
17
18
Pending signals:
19
20
<pre><code class="cpp">
21
#include <stdlib.h>
22
#include <stdint.h>
23
#include <stdio.h>
24
25
#include "/home/deseessm/wp/src/canswitch/liblepto/include/lepto/signal.h"
26
27
class CEventLoop
28
{
29
   private:
30
      static CEventLoop* m_first;
31
      CEventLoop* m_next=nullptr;
32
33
   public:
34
      CEventLoop()
35
      {
36
         if(!m_first)
37
         {
38
            m_first=this;
39
         }
40
         else
41
         {
42
            CEventLoop* p=m_first;
43
            while( p->m_next)
44
            {
45
               p=p->m_next;
46
            }
47
            p->m_next=this;
48
         }
49
      }
50
      virtual void eventLoop()
51
      {
52
         printf("L %p\n", this);
53
      }
54
      static void allEventLoops()
55
      {
56
         CEventLoop* p=m_first;
57
         while(p)
58
         {
59
            p->eventLoop();
60
            p=p->m_next;
61
         }
62
      }
63
};
64
65
CEventLoop* CEventLoop::m_first = nullptr;
66
#if 0
67
template<class... T>
68
struct Store1
69
{
70
   T...[0] t;
71
};
72
73
template<typename... T>
74
class Store
75
{
76
   //struct { T...[0] t; }data;
77
   T...[0] t;
78
};
79
80
//consteval
81
auto first_plus_last(auto... args)
82
{
83
    return args...[0] + args...[sizeof...(args) - 1];
84
}
85
86
static_assert(first_plus_last(5) == 10);
87
static_assert(first_plus_last(5, 4) == 9);
88
static_assert(first_plus_last(5, 6, 2) == 7);
89
#endif
90
91
92
class CPendingSignal
93
{
94
   public:
95
      CPendingSignal()
96
      {};
97
      virtual void emitSignal(){};
98
};
99
100
template<typename T>
101
class CPendingSignal1: public CPendingSignal
102
{
103
      CSignal<void, T> &m_signal;
104
      T m_p1;
105
   public:
106
      CPendingSignal1(CSignal<void, T>& signal, T i1)
107
         :m_signal(signal)
108
         ,m_p1(i1)
109
      {
110
      }
111
      virtual void emitSignal();
112
};
113
114
template<typename T1, typename T2>
115
class CPendingSignal2: public CPendingSignal
116
{
117
      CSignal<void, T1, T2> &m_signal;
118
      T1 m_p1;
119
      T2 m_p2;
120
   public:
121
      constexpr CPendingSignal2(CSignal<void, T1, T2> &signal, T1 i1, T2 i2)
122
         :m_signal(signal)
123
         ,m_p1(i1)
124
         ,m_p2(i2)
125
      {
126
      }
127
      virtual void emitSignal()
128
      {
129
         m_signal.emitSignal(m_p1, m_p2);
130
      }
131
};
132
133
template<typename T1, typename T2, typename T3>
134
class CPendingSignal3: public CPendingSignal
135
{
136
      CSignal<void, T1, T2, T3> &m_signal;
137
      T1 m_p1;
138
      T2 m_p2;
139
      T3 m_p3;
140
   public:
141
      constexpr CPendingSignal3(CSignal<void, T1, T2, T3> &signal, T1 i1, T2 i2, T3 i3)
142
         :m_signal(signal)
143
         ,m_p1(i1)
144
         ,m_p2(i2)
145
         ,m_p3(i3)
146
      {
147
      }
148
      virtual void emitSignal()
149
      {
150
         m_signal.emitSignal(m_p1, m_p2, m_p3);
151
      }
152
};
153
154
template<typename T>
155
CPendingSignal* XcreatePendingSignal(T p1)
156
{
157
   return( new CPendingSignal1<T>(p1) );
158
};
159
160
template<typename T1, typename T2>
161
CPendingSignal* XcreatePendingSignal(CSignal<void, T1, T2> &sig, T1 p1, T2 p2)
162
{
163
   return( new CPendingSignal2<T1, T2>(sig, p1, p2) );
164
};
165
166
template<typename T1, typename T2, typename T3>
167
CPendingSignal* XcreatePendingSignal(CSignal<void, T1, T2, T3> &sig, T1 p1, T2 p2, T3 p3)
168
{
169
   return( new CPendingSignal3<T1, T2, T3>(sig, p1, p2, p3) );
170
};
171
172
enum EColor{
173
   white, black, grey, green,
174
};
175
176
void show(int i1, int i2, EColor col)
177
{
178
   printf("SIGNAL: %d/%d - %d\n", i1, i2, col);
179
}
180
181
int main( int argc, const char *argv[] )
182
{
183
   CEventLoop l1;
184
   CEventLoop l2;
185
   CEventLoop l3;
186
187
   printf( "Size: %d\n", sizeof(l1) );
188
   printf( "Size ptr: %d\n", sizeof(argv[0]) );
189
   printf( "Size pend: %d\n", sizeof(CPendingSignal2<int, int>) );
190
191
   CSignal<void, int, int, EColor> sig1;
192
   sig1.connect( &show );
193
   CPendingSignal* ps1=XcreatePendingSignal<int, int, EColor>(sig1, 1,2, black);
194
   //CPendingSignal* ps2=createPendingSignal(sig1, 123,456, 0);
195
   CPendingSignal* ps2 = sig1.createPendingSignal(123,456, white);
196
197
   printf("-------------------\n");
198
   ps1->emitSignal();
199
   ps2->emitSignal();
200
201
   CEventLoop::allEventLoops();
202
   return(0);
203
}
204
205
//---fin----------------------------------------------------------------------
206
207
</code></pre>