Projekt

Allgemein

Profil

Wiki » Historie » Version 3

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