Skip to content

Commit cc2e76c

Browse files
committed
Various bug and documentation fixes.
1 parent b1b86fd commit cc2e76c

File tree

16 files changed

+166
-51
lines changed

16 files changed

+166
-51
lines changed

.settings/language.settings.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
66
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
77
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
8-
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-83671587028944538" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
8+
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1260075713651328051" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
99
<language-scope id="org.eclipse.cdt.core.gcc"/>
1010
<language-scope id="org.eclipse.cdt.core.g++"/>
1111
</provider>
@@ -16,7 +16,7 @@
1616
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
1717
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
1818
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
19-
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-135027059527360970" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
19+
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1311694414646770483" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
2020
<language-scope id="org.eclipse.cdt.core.gcc"/>
2121
<language-scope id="org.eclipse.cdt.core.g++"/>
2222
</provider>
@@ -27,7 +27,7 @@
2727
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
2828
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
2929
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
30-
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-135027059527360970" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
30+
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1311694414646770483" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
3131
<language-scope id="org.eclipse.cdt.core.gcc"/>
3232
<language-scope id="org.eclipse.cdt.core.g++"/>
3333
</provider>
@@ -38,7 +38,7 @@
3838
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
3939
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
4040
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
41-
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-135027059527360970" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
41+
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1311694414646770483" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
4242
<language-scope id="org.eclipse.cdt.core.gcc"/>
4343
<language-scope id="org.eclipse.cdt.core.g++"/>
4444
</provider>
@@ -49,7 +49,7 @@
4949
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
5050
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
5151
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
52-
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-135027059527360970" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
52+
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-1311694414646770483" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
5353
<language-scope id="org.eclipse.cdt.core.gcc"/>
5454
<language-scope id="org.eclipse.cdt.core.g++"/>
5555
</provider>

include/calc/Ema.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ namespace calc {
3131
* #include <cstdio>
3232
*
3333
* //first initialize a filter with a value of 0 and with an averaging constant of 0.1
34-
* Ema_i32 filter(0, DSP_EMA_I32_ALPHA(0.1));
35-
* //Or do: Ema<u16, i32, i64> filter(0, DSP_EMA_I32_ALPHA(0.1));
34+
* Ema_s32 filter(0, DSP_EMA_I32_ALPHA(0.1));
35+
* //Or do: Ema<u16, s32, i64> filter(0, DSP_EMA_I32_ALPHA(0.1));
3636
*
3737
* //now use the ADC to get some data
3838
* Adc adc(0);
@@ -91,16 +91,16 @@ template<typename intsmall, typename intmedium, typename intlarge>class Ema {
9191
intsmall m_alpha;
9292
};
9393

94-
/*! \brief Exponential Moving Average class (i32) */
94+
/*! \brief Exponential Moving Average class (s32) */
9595
/*! \details See \ref Ema for details */
96-
class Ema_i32 : public Ema<u16, i32, i64> {
96+
class Ema_s32 : public Ema<u16, s32, i64> {
9797
public:
98-
Ema_i32(i32 start, u16 alpha) : Ema(start, alpha){}
98+
Ema_s32(s32 start, u16 alpha) : Ema(start, alpha){}
9999
};
100100

101101
/*! \brief Exponential Moving Average class (i16) */
102102
/*! \details See \ref Ema for details */
103-
class Ema_i16 : public Ema<u8, i16, i32> {
103+
class Ema_i16 : public Ema<u8, i16, s32> {
104104
public:
105105
Ema_i16(i16 start, u8 alpha) : Ema(start, alpha){}
106106
};

include/fmt/Bmp.hpp

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,52 @@ namespace fmt {
1212
/*! \brief BMP File format */
1313
class Bmp: public sys::File {
1414
public:
15+
16+
/*! \details Construct a bitmap from the file (readonly) */
1517
Bmp(const char * name);
18+
19+
/*! \details Construct an empty bitmap object */
1620
Bmp();
1721

18-
i32 w() const { return m_dib.width; }
19-
i32 h() const { return m_dib.height; }
22+
/*! \details Access the bitmap width (after bitmap has been opened) */
23+
s32 w() const { return m_dib.width; }
24+
/*! \details Access the bitmap height (after bitmap has been opened) */
25+
s32 h() const { return m_dib.height; }
26+
/*! \details Access the bitmap bits per pixel (after bitmap has been opened) */
2027
u16 bits_per_pixel() const { return m_dib.bits_per_pixel; }
28+
/*! \details Access the bitmap planes (after bitmap has been opened) */
2129
u16 planes() const { return m_dib.planes; }
2230

23-
31+
/*! \details Calculates the bytes needed to store one row of data (after bitmap has been opened) */
2432
unsigned int calc_row_size() const;
2533

26-
int create(const char * name, i32 width, i32 height, u16 planes, u16 bits_per_pixel);
27-
static int create_appfs(const char * name, i32 width, i32 height, u16 planes, u16 bits_per_pixel, char * img, size_t nbyte);
34+
/*! \details Open the specified bitmap as readonly */
35+
int open_readonly(const char * name);
36+
37+
/*! \details Open the specified bitmap as read write */
38+
int open_readwrite(const char * name);
39+
40+
/*! \details Open the specified bitmap with the specified access (e.g., Bmp::READONLY) */
41+
int open(const char * name, int access);
42+
43+
/*! \details Create a new bitmap using the specified parameters */
44+
int create(const char * name, s32 width, s32 height, u16 planes, u16 bits_per_pixel);
45+
46+
/*! \details Create a new bitmap and save it to the /app filesystem (flash memory) */
47+
static int create_appfs(const char * name, s32 width, s32 height, u16 planes, u16 bits_per_pixel, char * img, size_t nbyte);
2848

49+
/*! \details Move file pointer to the start of the bitmap data */
2950
void rewind(){ seek(m_offset); }
3051

31-
int seek_row(i32 y);
52+
/*! \details Seek the file to the data at the specified row */
53+
int seek_row(s32 y);
3254

55+
/*! \details Read a pixel from the bitmap (optionally convert to a mono value)
56+
* @param pixel Data pointing to destination
57+
* @param pixel_size
58+
* @param mono true to convert to a mono pixel
59+
* @param thres threshold brightness for a mono pixel to be on
60+
*/
3361
int read_pixel(u8 * pixel, ssize_t pixel_size, bool mono = false, u8 thres = 128);
3462

3563
typedef struct MCU_PACK {
@@ -42,8 +70,8 @@ class Bmp: public sys::File {
4270

4371
typedef struct MCU_PACK {
4472
u32 hdr_size;
45-
i32 width;
46-
i32 height;
73+
s32 width;
74+
s32 height;
4775
u16 planes;
4876
u16 bits_per_pixel;
4977
} bmp_dib_t;

include/fmt/Son.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,13 @@ template<int stacksize> class Son {
156156
}
157157
}
158158

159-
/*! \details Write a key/number pair to the file (i32)
159+
/*! \details Write a key/number pair to the file (s32)
160160
*
161161
* @param key The value key
162162
* @param v The number to write
163163
* @return Number of bytes stored (4) if successful
164164
*/
165-
int write(const char * key, i32 v){ return son_write_num(&m_son, key, v); }
165+
int write(const char * key, s32 v){ return son_write_num(&m_son, key, v); }
166166

167167
/*! \details Write a key/number pair to the file (u32)
168168
*
@@ -236,17 +236,17 @@ template<int stacksize> class Son {
236236
*/
237237
int read_str(const char * access, char * str, son_size_t capacity){ return son_read_str(&m_son, access, str, capacity); }
238238

239-
/*! \details Read the specified key as a number (i32). If the original
240-
* key was not written as a i32, it will be converted to one. A string
241-
* of "100" will be converted to (i32)100. Objects that cannot be converted will return 0.
239+
/*! \details Read the specified key as a number (s32). If the original
240+
* key was not written as a s32, it will be converted to one. A string
241+
* of "100" will be converted to (s32)100. Objects that cannot be converted will return 0.
242242
*
243243
* @param access Key parameters
244244
* @return The number
245245
*/
246-
i32 read_num(const char * access){ return son_read_num(&m_son, access); }
246+
s32 read_num(const char * access){ return son_read_num(&m_son, access); }
247247

248248
/*! \details Read the specified key as a number (u32). If the original
249-
* key was not written as a i32, it will be converted to one. A string
249+
* key was not written as a s32, it will be converted to one. A string
250250
* of "100" will be converted to (u32)100. Objects that cannot be converted will return 0.
251251
*
252252
* @param access Key parameters
@@ -255,7 +255,7 @@ template<int stacksize> class Son {
255255
u32 read_unum(const char * access){ return son_read_unum(&m_son, access); }
256256

257257
/*! \details Read the specified key as a number (float). If the original
258-
* key was not written as a i32, it will be converted to one. A string
258+
* key was not written as a s32, it will be converted to one. A string
259259
* of "100" will be converted to (float)100. Objects that cannot be converted will return 0.
260260
*
261261
* @param access Key parameters

include/hal.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace hal {};
99

1010
#include "hal/Dev.hpp"
1111
#include "hal/Adc.hpp"
12+
#include "hal/Dac.hpp"
1213
#include "hal/Core.hpp"
1314
#include "hal/Eint.hpp"
1415
#include "hal/I2C.hpp"

include/hal/I2C.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ class I2C : public Periph {
1818
/*! \details Initialize the instance with \a port */
1919
I2C(port_t port);
2020

21+
enum {
22+
SETUP_NORMAL_TRANSFER /*! \brief Normal I2C transfer writes 8-bit pointer then reads or writes data */ = I2C_TRANSFER_NORMAL,
23+
SETUP_NORMAL_16_TRANSFER /*! \brief Normal I2C transfer writes 16-bit pointer then reads or writes data */ = I2C_TRANSFER_NORMAL_16,
24+
SETUP_DATA_ONLY_TRANSFER /*! \brief I2C transfer that does not write a pointer (just reads or writes data) */ = I2C_TRANSFER_DATA_ONLY,
25+
SETUP_WRITE_PTR_TRANSFER /*! \brief I2C transfer that only writes the pointer (no data is transferred) */ = I2C_TRANSFER_WRITE_PTR
26+
};
27+
2128
/*! \details Get the I2C attributes */
2229
int get_attr(i2c_attr_t & attr);
2330
/*! \details Set the I2C attributes */
@@ -38,15 +45,15 @@ class I2C : public Periph {
3845

3946

4047
/*! \details Setup an I2C transaction using the slave addr and type */
41-
int setup(uint16_t slave_addr, i2c_transfer_t type = I2C_TRANSFER_NORMAL){
48+
int setup(u16 slave_addr, u8 type = SETUP_NORMAL_TRANSFER){
4249
i2c_reqattr_t req;
4350
req.slave_addr = slave_addr;
4451
req.transfer = type;
4552
return setup(req);
4653
}
4754

4855
/*! \details Set attributes using specified bitrate and pin assignment. */
49-
int set_attr(uint32_t bitrate = 100000, u8 pin_assign = 0){
56+
int set_attr(u32 bitrate = 100000, u8 pin_assign = 0){
5057
i2c_attr_t attr;
5158
attr.bitrate = bitrate;
5259
attr.pin_assign = pin_assign;
@@ -85,6 +92,7 @@ class I2C : public Periph {
8592
* @return Zero on success
8693
*/
8794
int set(int loc, int bit, bool high = true);
95+
8896
/*! \details Clear the bit in a register on an I2C device */
8997
inline int clear(int loc, int bit){ return set(loc, bit, false); }
9098

include/sys/Appfs.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@ class Appfs {
5454
* @return Zero on success or -1 with errno set accordingly
5555
*
5656
*/
57-
static int create(const char * name, const void * buf, int nbyte, const char * mount = "/app", int (*update)(void *, int, int) = 0, void * context = 0, link_transport_mdriver_t * driver = 0);
57+
static int create(const char * name,
58+
const void * buf,
59+
int nbyte,
60+
const char * mount = "/app",
61+
bool (*update)(void *, int, int) = 0,
62+
void * context = 0,
63+
link_transport_mdriver_t * driver = 0);
5864

5965

6066
/*! \details Returns the page size for writing data */

include/ui/Button.hpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Button {
2525
*/
2626
Button();
2727

28-
/*! \details This method access how long the user must hold the
28+
/*! \details This method accesses how long the user must hold the
2929
* button in the application before the ui::Event::BUTTON_HOLD is triggered
3030
* when calling event()
3131
*
@@ -40,22 +40,62 @@ class Button {
4040
/*! \details This method checks the state of the actuation and then returns
4141
* an Event if needed.
4242
*
43-
* @return
43+
* It will report the following events
44+
*
45+
* - ui::Event::BUTTON_PRESSED
46+
* - ui::Event::BUTTON_RELEASED
47+
* - ui::Event::BUTTON_ACTUATED
48+
* - ui::Event::BUTTON_HOLD
49+
*
4450
*/
4551
ui::Event event();
4652

4753
void set_event_id(enum ui::Event::button_id v){ m_event_id = v; }
4854
enum ui::Event::button_id event_id() const { return m_event_id; }
4955

56+
/*! \details Returns the duration of the last button press.
57+
* This method will only return a non-zero value once per button press.
58+
*/
5059
virtual u32 get_duration();
60+
61+
/*! \details Returns true if the button has been pressed. This will
62+
* only return true once per button press.
63+
*
64+
*/
5165
virtual bool get_pressed();
66+
67+
/*! \details Returns true if the button has been released.
68+
* This will only return true one time for each button press.
69+
*/
5270
virtual bool get_released();
71+
72+
/*! \details Returns true if the button was pressed then released
73+
* This will return true only once per button press.
74+
*/
5375
virtual bool get_actuated();
76+
77+
/*! \details Returns true if the button has been held for the specified duration
78+
* This will only return true once per button press.
79+
*
80+
*
81+
* @param msec The number of milliseconds the button has been held for
82+
*/
5483
virtual bool get_held(u32 msec);
84+
85+
/*! \details This will update the state of the button. This method
86+
* should be called periodically.
87+
*/
5588
virtual void update();
5689

90+
/*! \details Reset the state of the button */
5791
virtual void reset();
5892

93+
/*! \details Returns true if the button is currently in the active state.
94+
* The active state is updated each time Button::update() is called.
95+
*
96+
*/
97+
bool is_active(){ return m_timer.is_running(); }
98+
5999
protected:
60100

61101
virtual bool get_is_active() const = 0;

include/ui/ButtonPin.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class ButtonPin : public Button, public hal::Pin {
1515
public:
1616

1717
/*! \details Construct a new ButtonPin
18+
*
19+
* The pin must be initialized using Pin::init()
1820
*
1921
* @param port The port associated with the pin
2022
* @param pin The pin number on the port for the button input

include/ui/Event.hpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ class Event {
3333
SETUP /*! This event is called at startup after all object have been constructed */ = 1,
3434
ENTER /*! This event is called when the element becomes active */ = 2,
3535
UPDATE /*! This event is called in a loop while the element is active */ = 3,
36-
BUTTON_ACTUATION /*! This event is called when a button is actuated (pressed and released). Use button() to access button details. */ = BUTTON_FLAG | 4,
37-
BUTTON_HOLD /*! This event is called when a button is held. Use button() to access button details. */ = BUTTON_FLAG | 5,
36+
BUTTON_ACTUATED /*! This event is called when a button is actuated (pressed and released). Use button() to access button details. */ = BUTTON_FLAG | 4,
37+
BUTTON_ACTUATION = BUTTON_ACTUATED,
38+
BUTTON_HELD /*! This event is called when a button is held. Use button() to access button details. */ = BUTTON_FLAG | 5,
39+
BUTTON_HOLD = BUTTON_HELD,
3840
BUTTON_PRESSED /*! This event is called when a button is pressed. Use button() to access button details. */ = BUTTON_FLAG | 6,
3941
BUTTON_RELEASED /*! This event is called when a button is released. Use button() to access button details. */ = BUTTON_FLAG | 7,
4042
NETWORK_DATA /*! This event is called when data arrives on the network */ = 8,
@@ -51,9 +53,6 @@ class Event {
5153
TAB_LEFT /*! Slide to the tab on the left */ = 17,
5254
TAB_RIGHT /*! Slide to the tab on the left */ = 18,
5355

54-
55-
56-
5756
//EVENT_TYPE_TOTAL //omit TOTAL so that the compiler doesn't complain about not handling the case
5857

5958
};
@@ -68,6 +67,23 @@ class Event {
6867
SELECT_BUTTON /*! Select Button */,
6968
BACK_BUTTON /*! Back Button */,
7069
EXIT_BUTTON /*! Exit Button */,
70+
USER_BUTTON0 /*! User button 0 */,
71+
USER_BUTTON1 /*! User button 1 */,
72+
USER_BUTTON2 /*! User button 2 */,
73+
USER_BUTTON3 /*! User button 3 */,
74+
USER_BUTTON4 /*! User button 4 */,
75+
USER_BUTTON5 /*! User button 5 */,
76+
USER_BUTTON6 /*! User button 6 */,
77+
USER_BUTTON7 /*! User button 7 */,
78+
USER_BUTTON8 /*! User button 8 */,
79+
USER_BUTTON9 /*! User button 9 */,
80+
USER_BUTTON10 /*! User button 10 */,
81+
USER_BUTTON11 /*! User button 11 */,
82+
USER_BUTTON12 /*! User button 12 */,
83+
USER_BUTTON13 /*! User button 13 */,
84+
USER_BUTTON14 /*! User button 14 */,
85+
USER_BUTTON15 /*! User button 15 */,
86+
7187
//EVENT_BUTTON_TOTAL //omit TOTAL so that the compiler doesn't complain about not handling the case
7288
};
7389

0 commit comments

Comments
 (0)