Projekt

Allgemein

Profil

Wiki » Historie » Version 4

Maximilian Seesslen, 10.09.2025 11:39

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 4 Maximilian Seesslen
[[Event loop chain]]
19
20 1 Maximilian Seesslen
h1. Wiki
21
22
Pending signals:
23
24
<pre><code class="cpp">
25
#if 0
26
template<class... T>
27
struct Store1
28
{
29
   T...[0] t;
30
};
31
32
template<typename... T>
33
class Store
34
{
35
   //struct { T...[0] t; }data;
36
   T...[0] t;
37
};
38
39
//consteval
40
auto first_plus_last(auto... args)
41
{
42
    return args...[0] + args...[sizeof...(args) - 1];
43
}
44
45
static_assert(first_plus_last(5) == 10);
46
static_assert(first_plus_last(5, 4) == 9);
47
static_assert(first_plus_last(5, 6, 2) == 7);
48
#endif
49
50
51
class CPendingSignal
52
{
53
   public:
54
      CPendingSignal()
55
      {};
56
      virtual void emitSignal(){};
57
};
58
59
template<typename T>
60
class CPendingSignal1: public CPendingSignal
61
{
62
      CSignal<void, T> &m_signal;
63
      T m_p1;
64
   public:
65
      CPendingSignal1(CSignal<void, T>& signal, T i1)
66
         :m_signal(signal)
67
         ,m_p1(i1)
68
      {
69
      }
70
      virtual void emitSignal();
71
};
72
73
template<typename T1, typename T2>
74
class CPendingSignal2: public CPendingSignal
75
{
76
      CSignal<void, T1, T2> &m_signal;
77
      T1 m_p1;
78
      T2 m_p2;
79
   public:
80
      constexpr CPendingSignal2(CSignal<void, T1, T2> &signal, T1 i1, T2 i2)
81
         :m_signal(signal)
82
         ,m_p1(i1)
83
         ,m_p2(i2)
84
      {
85
      }
86
      virtual void emitSignal()
87
      {
88
         m_signal.emitSignal(m_p1, m_p2);
89
      }
90
};
91
92
template<typename T1, typename T2, typename T3>
93
class CPendingSignal3: public CPendingSignal
94
{
95
      CSignal<void, T1, T2, T3> &m_signal;
96
      T1 m_p1;
97
      T2 m_p2;
98
      T3 m_p3;
99
   public:
100
      constexpr CPendingSignal3(CSignal<void, T1, T2, T3> &signal, T1 i1, T2 i2, T3 i3)
101
         :m_signal(signal)
102
         ,m_p1(i1)
103
         ,m_p2(i2)
104
         ,m_p3(i3)
105
      {
106
      }
107
      virtual void emitSignal()
108
      {
109
         m_signal.emitSignal(m_p1, m_p2, m_p3);
110
      }
111
};
112
113
template<typename T>
114
CPendingSignal* XcreatePendingSignal(T p1)
115
{
116
   return( new CPendingSignal1<T>(p1) );
117
};
118
119
template<typename T1, typename T2>
120
CPendingSignal* XcreatePendingSignal(CSignal<void, T1, T2> &sig, T1 p1, T2 p2)
121
{
122
   return( new CPendingSignal2<T1, T2>(sig, p1, p2) );
123
};
124
125
template<typename T1, typename T2, typename T3>
126
CPendingSignal* XcreatePendingSignal(CSignal<void, T1, T2, T3> &sig, T1 p1, T2 p2, T3 p3)
127
{
128
   return( new CPendingSignal3<T1, T2, T3>(sig, p1, p2, p3) );
129
};
130
131
enum EColor{
132
   white, black, grey, green,
133
};
134
135
void show(int i1, int i2, EColor col)
136
{
137
   printf("SIGNAL: %d/%d - %d\n", i1, i2, col);
138
}
139
140
int main( int argc, const char *argv[] )
141
{
142
   CEventLoop l1;
143
   CEventLoop l2;
144
   CEventLoop l3;
145
146
   printf( "Size: %d\n", sizeof(l1) );
147
   printf( "Size ptr: %d\n", sizeof(argv[0]) );
148
   printf( "Size pend: %d\n", sizeof(CPendingSignal2<int, int>) );
149
150
   CSignal<void, int, int, EColor> sig1;
151
   sig1.connect( &show );
152
   CPendingSignal* ps1=XcreatePendingSignal<int, int, EColor>(sig1, 1,2, black);
153
   //CPendingSignal* ps2=createPendingSignal(sig1, 123,456, 0);
154
   CPendingSignal* ps2 = sig1.createPendingSignal(123,456, white);
155
156
   printf("-------------------\n");
157
   ps1->emitSignal();
158
   ps2->emitSignal();
159
160
   CEventLoop::allEventLoops();
161
   return(0);
162
}
163
164
//---fin----------------------------------------------------------------------
165
166
</code></pre>