Modifications in 4DGL library. Added CDU_hw_sw.h for version info. Added pins.h for hardware pin remapping
Dependencies: 4DGL-UC MODSERIAL mbed mbos
Fork of CDU_Mbed_30 by
main.cpp@21:f348e6f0f7d4, 2014-10-10 (annotated)
- Committer:
- WillemBraat
- Date:
- Fri Oct 10 18:23:36 2014 +0000
- Revision:
- 21:f348e6f0f7d4
- Parent:
- 20:150afde94910
Additional files: CDU_Maintenance.cpp / mbps_def3.h
; Rewrite of main() function for power checks
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
LvdK | 7:6576a287e563 | 1 | // L. van der Kolk, W.Braat |
LvdK | 7:6576a287e563 | 2 | // File: main.cpp |
LvdK | 14:5767d651d624 | 3 | // CDU Mbed version 30 |
LvdK | 8:422544d24df3 | 4 | // ----------------------------------------- |
LvdK | 5:99594f4ab659 | 5 | |
LvdK | 0:6f71ca095e78 | 6 | #include "mbed.h" |
LvdK | 6:e0bf3b244d7c | 7 | #include "MODSERIAL.h" |
LvdK | 6:e0bf3b244d7c | 8 | #include "mbos.h" |
WillemBraat | 21:f348e6f0f7d4 | 9 | #include "mbos_def3.h" // : Mbos tasks, timer and resource definitions |
WillemBraat | 17:b3545e9d38f7 | 10 | #include "pins.h" |
LvdK | 6:e0bf3b244d7c | 11 | |
LvdK | 7:6576a287e563 | 12 | // Setup USB communication defined by Mbed USB TX and RX lines |
LvdK | 7:6576a287e563 | 13 | // with TX and RX ringbuffers : |
WillemBraat | 21:f348e6f0f7d4 | 14 | MODSERIAL USB(USBTX, USBRX, 256, 2048); |
WillemBraat | 17:b3545e9d38f7 | 15 | DigitalOut alive_led( HEARTBEAT ); // : LED 1 on Mbed board toggles when CDU is alive |
WillemBraat | 21:f348e6f0f7d4 | 16 | DigitalOut PWR_led( PWR_ON ); // : LED 4 on Mbed board is ON when external power applied to board |
WillemBraat | 21:f348e6f0f7d4 | 17 | InterruptIn PWR_MON( PWR_IN ); // : Power monitor: input is connected to +5V and indirect to +12V |
LvdK | 7:6576a287e563 | 18 | |
LvdK | 8:422544d24df3 | 19 | //void test_update_flags(); // << for testing only << !!!!!!! |
LvdK | 6:e0bf3b244d7c | 20 | |
LvdK | 8:422544d24df3 | 21 | // --- Debug only ---------------------------------------- |
LvdK | 7:6576a287e563 | 22 | // extra serial port to show debug info : |
WillemBraat | 17:b3545e9d38f7 | 23 | MODSERIAL SERIAL_DEBUG(MODSERIAL_TX, MODSERIAL_RX, 512, 64); //: tx, rx |
LvdK | 8:422544d24df3 | 24 | // ------------------------------------------------------- |
LvdK | 7:6576a287e563 | 25 | |
LvdK | 6:e0bf3b244d7c | 26 | int CDU_FS_interface = 0; // : defines interface to FS: 0 = USB, 1 = Ethernet |
LvdK | 7:6576a287e563 | 27 | extern int key_hit_ID; |
LvdK | 7:6576a287e563 | 28 | extern PwmOut BGL_LED; |
LvdK | 0:6f71ca095e78 | 29 | |
LvdK | 7:6576a287e563 | 30 | void init_USB(void); |
LvdK | 8:422544d24df3 | 31 | void set_initial_data(void); // : fill datastructures with initial data |
LvdK | 8:422544d24df3 | 32 | void Send_KEY_message(int key_nr); |
LvdK | 6:e0bf3b244d7c | 33 | void Send_ALIVE_message(int seconds); |
LvdK | 6:e0bf3b244d7c | 34 | void collect_FSdata(); |
LvdK | 6:e0bf3b244d7c | 35 | |
LvdK | 7:6576a287e563 | 36 | mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources) |
LvdK | 6:e0bf3b244d7c | 37 | |
LvdK | 7:6576a287e563 | 38 | // Task function prototypes: |
LvdK | 7:6576a287e563 | 39 | void ALIVE_TASK(void); |
LvdK | 7:6576a287e563 | 40 | void RECEIVE_DECODE_TASK(void); |
LvdK | 7:6576a287e563 | 41 | void SEND_KEYMESSAGE_TASK(void); |
LvdK | 7:6576a287e563 | 42 | void CDU_DSP_CSS_TASK(void); |
LvdK | 7:6576a287e563 | 43 | void READ_POT_TASK(void); |
LvdK | 6:e0bf3b244d7c | 44 | |
LvdK | 7:6576a287e563 | 45 | // keyboard function prototypes: |
LvdK | 7:6576a287e563 | 46 | void CDU_KB_COMM_INIT(void); |
LvdK | 7:6576a287e563 | 47 | void CDU_KB_INT_START(void); |
LvdK | 7:6576a287e563 | 48 | void CDU_KB_GET_KEY(void); |
LvdK | 7:6576a287e563 | 49 | void CDU_SET_BGL_INTENSITY(int); |
LvdK | 6:e0bf3b244d7c | 50 | |
LvdK | 8:422544d24df3 | 51 | // display function prototypes: |
LvdK | 7:6576a287e563 | 52 | void CDU_InitDisplay(void); |
LvdK | 7:6576a287e563 | 53 | void CDU_ScreenAlign(void); |
LvdK | 7:6576a287e563 | 54 | void CDU_StartScreen(void); |
WillemBraat | 20:150afde94910 | 55 | void CDU_LogoScreen(void); |
WillemBraat | 21:f348e6f0f7d4 | 56 | void CDU_Waiting(void); |
WillemBraat | 20:150afde94910 | 57 | void CDU_TVSCreen(void); |
LvdK | 7:6576a287e563 | 58 | void CDU_Page(void); |
LvdK | 7:6576a287e563 | 59 | void CDU_DSP_CSS(void); |
LvdK | 7:6576a287e563 | 60 | void CDU_displayclear(void); |
LvdK | 6:e0bf3b244d7c | 61 | |
WillemBraat | 21:f348e6f0f7d4 | 62 | void CDU_BOOT(); //reboot CDU |
WillemBraat | 21:f348e6f0f7d4 | 63 | |
LvdK | 8:422544d24df3 | 64 | //------ USB buffer overflow interrupt handling: ------------- |
LvdK | 7:6576a287e563 | 65 | void rx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 8:422544d24df3 | 66 | { // This functiom will be called when RX buffer overflows. |
LvdK | 7:6576a287e563 | 67 | // Blue-Leds-of-Death will be showed on Mbed board |
LvdK | 7:6576a287e563 | 68 | error("RX OVERFLOW !"); |
LvdK | 6:e0bf3b244d7c | 69 | } |
LvdK | 6:e0bf3b244d7c | 70 | |
LvdK | 7:6576a287e563 | 71 | void tx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 8:422544d24df3 | 72 | { // This functiom will be called when TX buffer overflows. |
LvdK | 7:6576a287e563 | 73 | // Blue-Leds-of-Death will be showed on Mbed board |
LvdK | 7:6576a287e563 | 74 | error("RX OVERFLOW !"); |
LvdK | 6:e0bf3b244d7c | 75 | } |
LvdK | 8:422544d24df3 | 76 | //------------------------------------------------------------ |
LvdK | 6:e0bf3b244d7c | 77 | |
LvdK | 6:e0bf3b244d7c | 78 | void init_USB() |
LvdK | 8:422544d24df3 | 79 | { // -- This function controls the setup for the CDU-FS USB communication -- |
LvdK | 7:6576a287e563 | 80 | // Function char_received() will be attached to RX interrupt. |
LvdK | 7:6576a287e563 | 81 | USB.baud(38400); // : set default baudrate to 38400 |
LvdK | 7:6576a287e563 | 82 | USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 83 | USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 84 | USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows |
LvdK | 7:6576a287e563 | 85 | USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows |
LvdK | 6:e0bf3b244d7c | 86 | } |
LvdK | 7:6576a287e563 | 87 | |
WillemBraat | 21:f348e6f0f7d4 | 88 | char CheckExtPower() |
WillemBraat | 21:f348e6f0f7d4 | 89 | { |
WillemBraat | 21:f348e6f0f7d4 | 90 | char ExtPower =0; |
WillemBraat | 21:f348e6f0f7d4 | 91 | |
WillemBraat | 21:f348e6f0f7d4 | 92 | ExtPower = PWR_MON; //check on power input: if +5V is ON return 1 else 0 |
WillemBraat | 21:f348e6f0f7d4 | 93 | PWR_led=1; |
WillemBraat | 21:f348e6f0f7d4 | 94 | alive_led=1; |
WillemBraat | 21:f348e6f0f7d4 | 95 | wait_ms(100); |
WillemBraat | 21:f348e6f0f7d4 | 96 | PWR_led=0; |
WillemBraat | 21:f348e6f0f7d4 | 97 | alive_led=0; |
WillemBraat | 21:f348e6f0f7d4 | 98 | wait_ms(100); |
WillemBraat | 21:f348e6f0f7d4 | 99 | PWR_led=PWR_MON; |
WillemBraat | 21:f348e6f0f7d4 | 100 | |
WillemBraat | 21:f348e6f0f7d4 | 101 | return ExtPower; |
WillemBraat | 21:f348e6f0f7d4 | 102 | } |
WillemBraat | 21:f348e6f0f7d4 | 103 | |
WillemBraat | 21:f348e6f0f7d4 | 104 | void EXT_PWR_DN() |
WillemBraat | 21:f348e6f0f7d4 | 105 | { |
WillemBraat | 21:f348e6f0f7d4 | 106 | //external power failed, reboot CDU after power up |
WillemBraat | 21:f348e6f0f7d4 | 107 | while (! CheckExtPower()); //wait for power up.... |
WillemBraat | 21:f348e6f0f7d4 | 108 | CDU_BOOT(); |
WillemBraat | 21:f348e6f0f7d4 | 109 | } |
WillemBraat | 21:f348e6f0f7d4 | 110 | |
LvdK | 7:6576a287e563 | 111 | main() // : MBOS main() |
LvdK | 0:6f71ca095e78 | 112 | { |
WillemBraat | 21:f348e6f0f7d4 | 113 | /* Check for a valid external power flag during boot sequence |
WillemBraat | 21:f348e6f0f7d4 | 114 | When no external power is applied the VGA board and Keyboard chip are not operational |
WillemBraat | 21:f348e6f0f7d4 | 115 | After initialization disconnecting external power will trigger interrupt to reboot. |
WillemBraat | 21:f348e6f0f7d4 | 116 | */ |
WillemBraat | 21:f348e6f0f7d4 | 117 | char PWR_OK=0; |
WillemBraat | 21:f348e6f0f7d4 | 118 | |
WillemBraat | 21:f348e6f0f7d4 | 119 | PWR_MON.mode( PullDown ); //create a solid 0 when no external power supplied |
WillemBraat | 21:f348e6f0f7d4 | 120 | PWR_MON.fall(&EXT_PWR_DN); //Bind function to handle interrupt when external power fails |
WillemBraat | 21:f348e6f0f7d4 | 121 | |
WillemBraat | 21:f348e6f0f7d4 | 122 | PWR_OK = PWR_MON; //use as boot flag |
WillemBraat | 21:f348e6f0f7d4 | 123 | |
WillemBraat | 21:f348e6f0f7d4 | 124 | if (! PWR_OK ) |
WillemBraat | 21:f348e6f0f7d4 | 125 | { |
WillemBraat | 21:f348e6f0f7d4 | 126 | while (! CheckExtPower() ); //wait for external power to come up |
WillemBraat | 21:f348e6f0f7d4 | 127 | CDU_BOOT(); |
WillemBraat | 21:f348e6f0f7d4 | 128 | } |
WillemBraat | 21:f348e6f0f7d4 | 129 | |
WillemBraat | 21:f348e6f0f7d4 | 130 | PWR_led = PWR_MON ; //switch on LED for external power indicator |
WillemBraat | 21:f348e6f0f7d4 | 131 | |
WillemBraat | 21:f348e6f0f7d4 | 132 | |
LvdK | 7:6576a287e563 | 133 | init_USB(); // : setup USB communication to FS |
LvdK | 7:6576a287e563 | 134 | |
LvdK | 8:422544d24df3 | 135 | // CDU keyboard initialisation and keyboard interrrupt setup: |
LvdK | 7:6576a287e563 | 136 | CDU_KB_COMM_INIT(); |
LvdK | 7:6576a287e563 | 137 | CDU_KB_INT_START(); |
LvdK | 7:6576a287e563 | 138 | BGL_LED.period(0.01); |
LvdK | 5:99594f4ab659 | 139 | |
LvdK | 8:422544d24df3 | 140 | // CDU display initialisation: |
LvdK | 7:6576a287e563 | 141 | CDU_InitDisplay(); |
WillemBraat | 20:150afde94910 | 142 | //CDU_StartScreen(); |
WillemBraat | 21:f348e6f0f7d4 | 143 | //CDU_LogoScreen(); |
LvdK | 8:422544d24df3 | 144 | wait(0.2); |
LvdK | 8:422544d24df3 | 145 | //CDU_Page(); |
WillemBraat | 21:f348e6f0f7d4 | 146 | //CDU_ScreenAlign(); |
WillemBraat | 21:f348e6f0f7d4 | 147 | CDU_Waiting(); |
LvdK | 8:422544d24df3 | 148 | |
LvdK | 8:422544d24df3 | 149 | set_initial_data(); //: fill FS datastructures with initial data |
LvdK | 7:6576a287e563 | 150 | |
LvdK | 8:422544d24df3 | 151 | // -- debug only ------------------------------------- |
LvdK | 7:6576a287e563 | 152 | SERIAL_DEBUG.baud(38400); // : set baudrate to 38400 |
LvdK | 14:5767d651d624 | 153 | SERIAL_DEBUG.printf("\n--- CDU_Mbed_30 ---\r\n"); |
LvdK | 8:422544d24df3 | 154 | // --------------------------------------------------- |
LvdK | 7:6576a287e563 | 155 | |
LvdK | 8:422544d24df3 | 156 | // Create all mbos tasks, timers and resources: |
LvdK | 8:422544d24df3 | 157 | // Tasks: |
LvdK | 7:6576a287e563 | 158 | CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK); |
LvdK | 7:6576a287e563 | 159 | CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK); |
LvdK | 7:6576a287e563 | 160 | CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK); |
LvdK | 7:6576a287e563 | 161 | CDU_OS.CreateTask(CDU_DSP_CSS_TASK_ID, CDU_DSP_CSS_TASK_PRIO, CDU_DSP_CSS_TASK_STACK_SZ, CDU_DSP_CSS_TASK ); |
LvdK | 7:6576a287e563 | 162 | CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK ); |
LvdK | 8:422544d24df3 | 163 | // Timers: |
LvdK | 7:6576a287e563 | 164 | CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT); |
LvdK | 8:422544d24df3 | 165 | CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT); |
LvdK | 8:422544d24df3 | 166 | CDU_OS.CreateTimer(DECODE_TIMER_ID, RECEIVE_DECODE_TASK_ID, DECODE_TIMER_EVENT); |
LvdK | 8:422544d24df3 | 167 | // Resources: |
LvdK | 7:6576a287e563 | 168 | CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO); |
LvdK | 8:422544d24df3 | 169 | CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO); |
LvdK | 7:6576a287e563 | 170 | |
LvdK | 7:6576a287e563 | 171 | // Start mbos O.S with a final statement in main() : |
LvdK | 7:6576a287e563 | 172 | CDU_OS.Start(); // : MBOS is running tasks now.... |
LvdK | 8:422544d24df3 | 173 | // end of main <<---- program never reaches this point ! |
LvdK | 7:6576a287e563 | 174 | } |
LvdK | 6:e0bf3b244d7c | 175 | |
LvdK | 6:e0bf3b244d7c | 176 | void RECEIVE_DECODE_TASK(void) |
LvdK | 8:422544d24df3 | 177 | { // Mbos task triggered by mbos timer to scan USB receive buffer every 100 msec. |
LvdK | 8:422544d24df3 | 178 | // Collects and decodes data received from USB. |
LvdK | 8:422544d24df3 | 179 | CDU_OS.SetTimer( DECODE_TIMER_ID, DECODE_TIMER_PERIOD, DECODE_TIMER_PERIOD ); |
LvdK | 7:6576a287e563 | 180 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 181 | CDU_OS.WaitEvent(DECODE_TIMER_EVENT ); // : wait for Mbos timer event |
LvdK | 8:422544d24df3 | 182 | // start collecting and decoding of received data: |
LvdK | 8:422544d24df3 | 183 | CDU_OS.LockResource(FS_DATA_RESOURCE); // : lock FS database |
LvdK | 6:e0bf3b244d7c | 184 | collect_FSdata(); |
LvdK | 8:422544d24df3 | 185 | CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS database |
LvdK | 7:6576a287e563 | 186 | } |
LvdK | 6:e0bf3b244d7c | 187 | } |
LvdK | 6:e0bf3b244d7c | 188 | |
LvdK | 7:6576a287e563 | 189 | void SEND_KEYMESSAGE_TASK(void) |
LvdK | 8:422544d24df3 | 190 | { // Mbos task triggered by a KEY_EVENT ( = "CDU key pressed" ) |
LvdK | 7:6576a287e563 | 191 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 192 | CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event |
LvdK | 7:6576a287e563 | 193 | CDU_KB_GET_KEY(); // : read key from CDU keyboard |
LvdK | 7:6576a287e563 | 194 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 195 | Send_KEY_message(key_hit_ID); |
LvdK | 8:422544d24df3 | 196 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 7:6576a287e563 | 197 | key_hit_ID = 0; // : reset key_hit_ID flag |
LvdK | 0:6f71ca095e78 | 198 | } |
LvdK | 6:e0bf3b244d7c | 199 | } |
LvdK | 6:e0bf3b244d7c | 200 | |
LvdK | 6:e0bf3b244d7c | 201 | void ALIVE_TASK(void) |
LvdK | 8:422544d24df3 | 202 | { // Mbos task triggered by mbos timer to send ALIVE message to FS every 5 sec. |
LvdK | 6:e0bf3b244d7c | 203 | CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD ); |
LvdK | 6:e0bf3b244d7c | 204 | static int seconds = 0; |
LvdK | 7:6576a287e563 | 205 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 6:e0bf3b244d7c | 206 | CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec) |
LvdK | 7:6576a287e563 | 207 | seconds += 5 ; // : increase seconds by 5 |
LvdK | 7:6576a287e563 | 208 | if (seconds >= 60) seconds = 0 ; // : overflow handling |
LvdK | 7:6576a287e563 | 209 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 210 | Send_ALIVE_message(seconds); |
LvdK | 7:6576a287e563 | 211 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 7:6576a287e563 | 212 | alive_led = !alive_led; // : toggle LED |
LvdK | 6:e0bf3b244d7c | 213 | } |
LvdK | 7:6576a287e563 | 214 | } |
LvdK | 6:e0bf3b244d7c | 215 | |
LvdK | 8:422544d24df3 | 216 | void CDU_DSP_CSS_TASK(void) |
LvdK | 8:422544d24df3 | 217 | { // Mbos task to read new screendata from FS datastructures and show on CDU screen. |
LvdK | 8:422544d24df3 | 218 | // Triggered by FS_DATA_EVENT ( = "new screendata available" ) |
LvdK | 7:6576a287e563 | 219 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 220 | |
LvdK | 8:422544d24df3 | 221 | if (CDU_OS.TestResource(FS_DATA_RESOURCE) == 0) { |
LvdK | 8:422544d24df3 | 222 | // FS_DATA_RESOURCE is free to access. |
LvdK | 8:422544d24df3 | 223 | // Lock it to get exclusive access and prevent intermediate updates: |
LvdK | 8:422544d24df3 | 224 | CDU_OS.LockResource(FS_DATA_RESOURCE); |
LvdK | 8:422544d24df3 | 225 | CDU_OS.WaitEvent(FS_DATA_EVENT); // wait for FS_DATA_EVENT |
LvdK | 8:422544d24df3 | 226 | //test_update_flags(); // : >>>>> debug ONLY !!! |
LvdK | 8:422544d24df3 | 227 | CDU_DSP_CSS(); // : get data and show on screen |
LvdK | 8:422544d24df3 | 228 | CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS_DATA_RESOURCE |
LvdK | 8:422544d24df3 | 229 | } |
LvdK | 8:422544d24df3 | 230 | else { |
LvdK | 8:422544d24df3 | 231 | // FS_DATA_RESOURCE is occupied, don’t read it ! |
LvdK | 8:422544d24df3 | 232 | } |
LvdK | 8:422544d24df3 | 233 | } |
LvdK | 6:e0bf3b244d7c | 234 | } |
LvdK | 7:6576a287e563 | 235 | |
LvdK | 8:422544d24df3 | 236 | |
LvdK | 7:6576a287e563 | 237 | void READ_POT_TASK(void) |
LvdK | 7:6576a287e563 | 238 | { // Mbos task started by mbos timer to scan potmeter every 100 msec |
LvdK | 8:422544d24df3 | 239 | CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD ); |
LvdK | 7:6576a287e563 | 240 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 241 | CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : wait for Mbos timer event |
LvdK | 7:6576a287e563 | 242 | CDU_SET_BGL_INTENSITY(255); |
LvdK | 7:6576a287e563 | 243 | } |
LvdK | 7:6576a287e563 | 244 | } |
LvdK | 7:6576a287e563 | 245 | |
LvdK | 8:422544d24df3 | 246 |