Display zeigt merkwürdige Zeichen
Dependencies: mbed PinDetect TextLCD
Fork of FWFSU_Start_28102013 by
main.cpp@24:9c0151db1f98, 2016-08-09 (annotated)
- Committer:
- manuelfederanko
- Date:
- Tue Aug 09 09:17:48 2016 +0000
- Revision:
- 24:9c0151db1f98
- Parent:
- 23:70780e8b6a2e
- Child:
- 26:5c92d4036a4f
Fixed some memory leaks which should've been the cause for the ic getting stuck.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manuelfederanko | 16:78da467a0609 | 1 | #include "main.h" |
joca89 | 0:097b334e1077 | 2 | |
manuelfederanko | 19:a06d764e4f64 | 3 | using namespace evtbus; |
manuelfederanko | 19:a06d764e4f64 | 4 | using namespace evt; |
manuelfederanko | 20:e809ca4de724 | 5 | using namespace msg; |
joca89 | 0:097b334e1077 | 6 | |
manuelfederanko | 17:ce5a80e8fc8e | 7 | struct linked_list *times; |
manuelfederanko | 19:a06d764e4f64 | 8 | EventBus ebus; |
fox46 | 7:016281ea7be6 | 9 | |
manuelfederanko | 20:e809ca4de724 | 10 | time_100us ping_flag = 0; |
manuelfederanko | 20:e809ca4de724 | 11 | |
manuelfederanko | 13:a45461fbb77f | 12 | /** |
manuelfederanko | 15:16d4e268cb84 | 13 | * Synchronize with the slave |
manuelfederanko | 15:16d4e268cb84 | 14 | */ |
manuelfederanko | 15:16d4e268cb84 | 15 | void resync( void ) { |
manuelfederanko | 20:e809ca4de724 | 16 | Message *m = new Message(MSG_CODE_TOTAL_RESET, ""); |
manuelfederanko | 20:e809ca4de724 | 17 | ser.putMsg(m); |
manuelfederanko | 15:16d4e268cb84 | 18 | ser.flush(); |
manuelfederanko | 20:e809ca4de724 | 19 | |
manuelfederanko | 15:16d4e268cb84 | 20 | btn_cnt = 0; |
manuelfederanko | 15:16d4e268cb84 | 21 | comm_flags = 0; |
manuelfederanko | 15:16d4e268cb84 | 22 | buzzer_state = 0; |
manuelfederanko | 15:16d4e268cb84 | 23 | button_state = 0; |
manuelfederanko | 17:ce5a80e8fc8e | 24 | D = MIN_ROUND_CNT; |
manuelfederanko | 17:ce5a80e8fc8e | 25 | |
manuelfederanko | 17:ce5a80e8fc8e | 26 | if (times != NULL) { |
manuelfederanko | 17:ce5a80e8fc8e | 27 | deleteList(times); |
manuelfederanko | 19:a06d764e4f64 | 28 | times = initNode(); |
manuelfederanko | 17:ce5a80e8fc8e | 29 | } |
manuelfederanko | 17:ce5a80e8fc8e | 30 | } |
manuelfederanko | 17:ce5a80e8fc8e | 31 | |
manuelfederanko | 17:ce5a80e8fc8e | 32 | void reinit_list( void ) { |
manuelfederanko | 17:ce5a80e8fc8e | 33 | struct run_time *rt = (struct run_time *)malloc(sizeof(struct run_time)); |
manuelfederanko | 17:ce5a80e8fc8e | 34 | times = getLast(times); |
manuelfederanko | 17:ce5a80e8fc8e | 35 | rt->start = start_tm; |
manuelfederanko | 17:ce5a80e8fc8e | 36 | rt->snap0 = snapshot0; |
manuelfederanko | 17:ce5a80e8fc8e | 37 | rt->snap1 = snapshot1; |
manuelfederanko | 17:ce5a80e8fc8e | 38 | rt->end = end_tm; |
manuelfederanko | 17:ce5a80e8fc8e | 39 | times->data = (void *) rt; |
manuelfederanko | 17:ce5a80e8fc8e | 40 | appendNode(times, initNode()); |
manuelfederanko | 15:16d4e268cb84 | 41 | } |
manuelfederanko | 15:16d4e268cb84 | 42 | |
manuelfederanko | 19:a06d764e4f64 | 43 | /******************************************************************************************** |
manuelfederanko | 19:a06d764e4f64 | 44 | INTERRUPT SERVICE ROUTINES (those raise all events!) |
manuelfederanko | 19:a06d764e4f64 | 45 | ********************************************************************************************/ |
joca89 | 0:097b334e1077 | 46 | |
manuelfederanko | 13:a45461fbb77f | 47 | void bzr_pressed( void ) { |
manuelfederanko | 24:9c0151db1f98 | 48 | //cprintf("case"); |
manuelfederanko | 24:9c0151db1f98 | 49 | //display(); |
manuelfederanko | 24:9c0151db1f98 | 50 | //wait(1); |
manuelfederanko | 19:a06d764e4f64 | 51 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 52 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 53 | ebus.raiseEvent(1, 0, ts, NULL); |
manuelfederanko | 13:a45461fbb77f | 54 | } |
fox46 | 6:79bc3888c88c | 55 | |
manuelfederanko | 13:a45461fbb77f | 56 | void bzr_held_pressed( void ) { |
manuelfederanko | 19:a06d764e4f64 | 57 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 58 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 59 | ebus.raiseEvent(2, 0, ts, NULL); |
manuelfederanko | 13:a45461fbb77f | 60 | } |
manuelfederanko | 13:a45461fbb77f | 61 | |
manuelfederanko | 13:a45461fbb77f | 62 | void btn_pressed( void ) { |
manuelfederanko | 19:a06d764e4f64 | 63 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 64 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 65 | ebus.raiseEvent(3, 0, ts, NULL); |
manuelfederanko | 13:a45461fbb77f | 66 | } |
manuelfederanko | 13:a45461fbb77f | 67 | |
manuelfederanko | 13:a45461fbb77f | 68 | void btn_held_released( void ) { |
manuelfederanko | 19:a06d764e4f64 | 69 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 70 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 71 | ebus.raiseEvent(4, 0, ts, NULL); |
manuelfederanko | 19:a06d764e4f64 | 72 | } |
manuelfederanko | 19:a06d764e4f64 | 73 | |
manuelfederanko | 19:a06d764e4f64 | 74 | void beam_pressed(void) { |
manuelfederanko | 19:a06d764e4f64 | 75 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 76 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 77 | ebus.raiseEvent(5, 0, ts, NULL); |
manuelfederanko | 19:a06d764e4f64 | 78 | } |
manuelfederanko | 19:a06d764e4f64 | 79 | |
manuelfederanko | 19:a06d764e4f64 | 80 | void hdl_rec( void ) { |
manuelfederanko | 19:a06d764e4f64 | 81 | time_100us ts = systime; |
manuelfederanko | 24:9c0151db1f98 | 82 | ebus.setInterruptContext(); |
manuelfederanko | 19:a06d764e4f64 | 83 | ebus.raiseEvent(6, 0, ts, NULL); |
manuelfederanko | 19:a06d764e4f64 | 84 | } |
manuelfederanko | 19:a06d764e4f64 | 85 | |
manuelfederanko | 19:a06d764e4f64 | 86 | |
manuelfederanko | 19:a06d764e4f64 | 87 | /******************************************************************************************** |
manuelfederanko | 19:a06d764e4f64 | 88 | EVENT BUS FUNCTIONS |
manuelfederanko | 19:a06d764e4f64 | 89 | ********************************************************************************************/ |
manuelfederanko | 19:a06d764e4f64 | 90 | |
manuelfederanko | 19:a06d764e4f64 | 91 | char handleEvent_01_BuzzerPressed(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 92 | if ((comm_flags & FLAG_START) == 0) |
manuelfederanko | 19:a06d764e4f64 | 93 | ebus.raiseEvent(7, 0, e->timestamp, NULL); |
manuelfederanko | 22:642cfa0cebcb | 94 | else if ((comm_flags & FLAG_STOP) == 0 && (comm_flags & FLAG_SNAP_0) == 0) //only when stop has not been pressed |
manuelfederanko | 19:a06d764e4f64 | 95 | ebus.raiseEvent(8, 0, e->timestamp, NULL); |
manuelfederanko | 22:642cfa0cebcb | 96 | else if ((comm_flags & FLAG_STOP) == 0 && (comm_flags & FLAG_SNAP_1) == 0) |
manuelfederanko | 19:a06d764e4f64 | 97 | ebus.raiseEvent(9, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 98 | else if ((comm_flags & FLAG_STOP) == 0) |
manuelfederanko | 19:a06d764e4f64 | 99 | ebus.raiseEvent(10, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 100 | |
manuelfederanko | 19:a06d764e4f64 | 101 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 102 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 103 | } |
manuelfederanko | 19:a06d764e4f64 | 104 | |
manuelfederanko | 19:a06d764e4f64 | 105 | char handleEvent_02_StartNextRun(Event *e) { |
manuelfederanko | 24:9c0151db1f98 | 106 | if (comm_flags & FLAG_START && (comm_flags & FLAG_STOP) == 0) {//cant reset if we didnt stop |
manuelfederanko | 24:9c0151db1f98 | 107 | delete e; |
manuelfederanko | 21:5fb0832693d1 | 108 | return 1; |
manuelfederanko | 24:9c0151db1f98 | 109 | } |
manuelfederanko | 19:a06d764e4f64 | 110 | reinit_list(); |
manuelfederanko | 19:a06d764e4f64 | 111 | reset(); |
manuelfederanko | 21:5fb0832693d1 | 112 | |
manuelfederanko | 19:a06d764e4f64 | 113 | ebus.raiseEvent(11, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 114 | |
manuelfederanko | 19:a06d764e4f64 | 115 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 116 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 117 | } |
manuelfederanko | 19:a06d764e4f64 | 118 | |
manuelfederanko | 19:a06d764e4f64 | 119 | char handleEvent_03_Resync(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 120 | resync(); |
manuelfederanko | 19:a06d764e4f64 | 121 | |
manuelfederanko | 19:a06d764e4f64 | 122 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 123 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 124 | } |
manuelfederanko | 19:a06d764e4f64 | 125 | |
manuelfederanko | 19:a06d764e4f64 | 126 | char handleEvent_04_Shutdown(Event *e) { |
manuelfederanko | 17:ce5a80e8fc8e | 127 | deleteList(times); |
manuelfederanko | 13:a45461fbb77f | 128 | shutdown_seq(); |
manuelfederanko | 19:a06d764e4f64 | 129 | |
manuelfederanko | 19:a06d764e4f64 | 130 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 131 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 132 | } |
manuelfederanko | 19:a06d764e4f64 | 133 | |
manuelfederanko | 19:a06d764e4f64 | 134 | char handleEvent_05_BeamPressed(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 135 | ebus.raiseEvent(7, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 136 | |
manuelfederanko | 19:a06d764e4f64 | 137 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 138 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 139 | } |
manuelfederanko | 19:a06d764e4f64 | 140 | |
manuelfederanko | 19:a06d764e4f64 | 141 | char handleEvent_06_Receive(Event *e) { |
manuelfederanko | 20:e809ca4de724 | 142 | Message *m; |
manuelfederanko | 19:a06d764e4f64 | 143 | char e_b[EVENT_DATA_LENGTH] = { 0 }; |
manuelfederanko | 19:a06d764e4f64 | 144 | |
manuelfederanko | 24:9c0151db1f98 | 145 | if (ser.available() == 0) { |
manuelfederanko | 24:9c0151db1f98 | 146 | delete e; |
fox46 | 23:70780e8b6a2e | 147 | return 0; |
manuelfederanko | 24:9c0151db1f98 | 148 | } |
fox46 | 23:70780e8b6a2e | 149 | |
manuelfederanko | 22:642cfa0cebcb | 150 | switch (ser.msgAvailable()) { |
manuelfederanko | 22:642cfa0cebcb | 151 | case MSG_AV_FLAG_NONE: |
manuelfederanko | 22:642cfa0cebcb | 152 | delete e; |
manuelfederanko | 22:642cfa0cebcb | 153 | return 2; |
manuelfederanko | 22:642cfa0cebcb | 154 | case MSG_AV_FLAG_MSG: |
manuelfederanko | 22:642cfa0cebcb | 155 | goto PROCESS_MSG; |
manuelfederanko | 22:642cfa0cebcb | 156 | case MSG_AV_FLAG_RESEND: |
manuelfederanko | 22:642cfa0cebcb | 157 | ser.resendMsg(); |
manuelfederanko | 22:642cfa0cebcb | 158 | ser.flush(); |
manuelfederanko | 22:642cfa0cebcb | 159 | delete e; |
manuelfederanko | 22:642cfa0cebcb | 160 | return 1; |
manuelfederanko | 19:a06d764e4f64 | 161 | } |
manuelfederanko | 19:a06d764e4f64 | 162 | |
manuelfederanko | 22:642cfa0cebcb | 163 | PROCESS_MSG: |
manuelfederanko | 20:e809ca4de724 | 164 | m = ser.getMsg(); |
manuelfederanko | 20:e809ca4de724 | 165 | if (m == NULL) { |
manuelfederanko | 20:e809ca4de724 | 166 | delete e; |
manuelfederanko | 20:e809ca4de724 | 167 | return 2; |
manuelfederanko | 20:e809ca4de724 | 168 | } |
manuelfederanko | 20:e809ca4de724 | 169 | int_to_str(m->code, e_b); |
manuelfederanko | 20:e809ca4de724 | 170 | strcat(e_b, m->data); |
manuelfederanko | 19:a06d764e4f64 | 171 | ebus.raiseEvent(12, 0, e->timestamp, e_b); |
manuelfederanko | 19:a06d764e4f64 | 172 | |
manuelfederanko | 19:a06d764e4f64 | 173 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 174 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 175 | } |
manuelfederanko | 19:a06d764e4f64 | 176 | |
manuelfederanko | 19:a06d764e4f64 | 177 | char handleEvent_07_Start(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 178 | char b[9]; |
manuelfederanko | 20:e809ca4de724 | 179 | Message *m; |
manuelfederanko | 19:a06d764e4f64 | 180 | |
manuelfederanko | 19:a06d764e4f64 | 181 | if ((comm_flags & FLAG_START) == 0) { |
manuelfederanko | 19:a06d764e4f64 | 182 | start_tm = e->timestamp; |
manuelfederanko | 19:a06d764e4f64 | 183 | comm_flags |= FLAG_START; |
manuelfederanko | 21:5fb0832693d1 | 184 | |
manuelfederanko | 19:a06d764e4f64 | 185 | int_to_str(start_tm, b); |
manuelfederanko | 20:e809ca4de724 | 186 | m = new Message(MSG_CODE_TMS, b); |
manuelfederanko | 20:e809ca4de724 | 187 | ser.putMsg(m); |
manuelfederanko | 19:a06d764e4f64 | 188 | ser.flush(); |
manuelfederanko | 21:5fb0832693d1 | 189 | |
manuelfederanko | 21:5fb0832693d1 | 190 | #ifdef DEBUG |
manuelfederanko | 21:5fb0832693d1 | 191 | cprintf("start"); |
manuelfederanko | 21:5fb0832693d1 | 192 | display(); |
manuelfederanko | 21:5fb0832693d1 | 193 | wait(DBUG_MSG_TIME); |
manuelfederanko | 21:5fb0832693d1 | 194 | #endif |
manuelfederanko | 19:a06d764e4f64 | 195 | } |
manuelfederanko | 19:a06d764e4f64 | 196 | |
manuelfederanko | 19:a06d764e4f64 | 197 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 198 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 199 | } |
manuelfederanko | 19:a06d764e4f64 | 200 | |
manuelfederanko | 19:a06d764e4f64 | 201 | char handleEvent_08_Snap0(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 202 | char b[9]; |
manuelfederanko | 20:e809ca4de724 | 203 | Message *m; |
manuelfederanko | 19:a06d764e4f64 | 204 | |
manuelfederanko | 19:a06d764e4f64 | 205 | if ((comm_flags & FLAG_SNAP_0) == 0) { |
manuelfederanko | 19:a06d764e4f64 | 206 | snapshot0 = e->timestamp; |
manuelfederanko | 19:a06d764e4f64 | 207 | comm_flags |= FLAG_SNAP_0; |
manuelfederanko | 21:5fb0832693d1 | 208 | |
manuelfederanko | 19:a06d764e4f64 | 209 | int_to_str(snapshot0, b); |
manuelfederanko | 20:e809ca4de724 | 210 | m = new Message(MSG_CODE_TML0, b); |
manuelfederanko | 20:e809ca4de724 | 211 | ser.putMsg(m); |
manuelfederanko | 19:a06d764e4f64 | 212 | ser.flush(); |
manuelfederanko | 21:5fb0832693d1 | 213 | |
manuelfederanko | 21:5fb0832693d1 | 214 | #ifdef DEBUG |
manuelfederanko | 21:5fb0832693d1 | 215 | cprintf("snap0"); |
manuelfederanko | 21:5fb0832693d1 | 216 | display(); |
manuelfederanko | 21:5fb0832693d1 | 217 | wait(DBUG_MSG_TIME); |
manuelfederanko | 21:5fb0832693d1 | 218 | #endif |
manuelfederanko | 19:a06d764e4f64 | 219 | } |
manuelfederanko | 19:a06d764e4f64 | 220 | |
manuelfederanko | 19:a06d764e4f64 | 221 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 222 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 223 | } |
manuelfederanko | 19:a06d764e4f64 | 224 | |
manuelfederanko | 19:a06d764e4f64 | 225 | char handleEvent_09_Snap1(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 226 | char b[9]; |
manuelfederanko | 20:e809ca4de724 | 227 | Message *m; |
manuelfederanko | 19:a06d764e4f64 | 228 | |
manuelfederanko | 19:a06d764e4f64 | 229 | if ((comm_flags & FLAG_SNAP_1) == 0) { |
manuelfederanko | 19:a06d764e4f64 | 230 | snapshot1 = e->timestamp; |
manuelfederanko | 19:a06d764e4f64 | 231 | comm_flags |= FLAG_SNAP_1; |
manuelfederanko | 19:a06d764e4f64 | 232 | |
manuelfederanko | 19:a06d764e4f64 | 233 | int_to_str(snapshot1, b); |
manuelfederanko | 20:e809ca4de724 | 234 | m = new Message(MSG_CODE_TML1, b); |
manuelfederanko | 20:e809ca4de724 | 235 | ser.putMsg(m); |
manuelfederanko | 19:a06d764e4f64 | 236 | ser.flush(); |
manuelfederanko | 21:5fb0832693d1 | 237 | |
manuelfederanko | 21:5fb0832693d1 | 238 | #ifdef DEBUG |
manuelfederanko | 21:5fb0832693d1 | 239 | cprintf("snap1"); |
manuelfederanko | 21:5fb0832693d1 | 240 | display(); |
manuelfederanko | 21:5fb0832693d1 | 241 | wait(DBUG_MSG_TIME); |
manuelfederanko | 21:5fb0832693d1 | 242 | #endif |
manuelfederanko | 19:a06d764e4f64 | 243 | } |
manuelfederanko | 19:a06d764e4f64 | 244 | |
manuelfederanko | 19:a06d764e4f64 | 245 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 246 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 247 | } |
manuelfederanko | 19:a06d764e4f64 | 248 | |
manuelfederanko | 19:a06d764e4f64 | 249 | char handleEvent_10_Stop(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 250 | char b[9]; |
manuelfederanko | 20:e809ca4de724 | 251 | Message *m; |
manuelfederanko | 19:a06d764e4f64 | 252 | |
manuelfederanko | 19:a06d764e4f64 | 253 | if ((comm_flags & FLAG_STOP) == 0) { |
manuelfederanko | 19:a06d764e4f64 | 254 | end_tm = e->timestamp; |
manuelfederanko | 19:a06d764e4f64 | 255 | comm_flags |= FLAG_STOP; |
manuelfederanko | 19:a06d764e4f64 | 256 | |
manuelfederanko | 19:a06d764e4f64 | 257 | int_to_str(end_tm, b); |
manuelfederanko | 20:e809ca4de724 | 258 | m = new Message(MSG_CODE_TMP, b); |
manuelfederanko | 20:e809ca4de724 | 259 | ser.putMsg(m); |
manuelfederanko | 19:a06d764e4f64 | 260 | ser.flush(); |
manuelfederanko | 21:5fb0832693d1 | 261 | |
manuelfederanko | 21:5fb0832693d1 | 262 | #ifdef DEBUG |
manuelfederanko | 21:5fb0832693d1 | 263 | cprintf("stop"); |
manuelfederanko | 21:5fb0832693d1 | 264 | display(); |
manuelfederanko | 21:5fb0832693d1 | 265 | wait(DBUG_MSG_TIME); |
manuelfederanko | 21:5fb0832693d1 | 266 | #endif |
manuelfederanko | 19:a06d764e4f64 | 267 | } |
manuelfederanko | 19:a06d764e4f64 | 268 | |
manuelfederanko | 19:a06d764e4f64 | 269 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 270 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 271 | } |
manuelfederanko | 19:a06d764e4f64 | 272 | |
manuelfederanko | 19:a06d764e4f64 | 273 | char handleEvent_11_SendReset(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 274 | char b[9]; |
manuelfederanko | 20:e809ca4de724 | 275 | Message *m; |
manuelfederanko | 20:e809ca4de724 | 276 | |
manuelfederanko | 19:a06d764e4f64 | 277 | int_to_str(D, b); |
manuelfederanko | 20:e809ca4de724 | 278 | m = new Message(MSG_CODE_RESET, b); |
manuelfederanko | 20:e809ca4de724 | 279 | ser.putMsg(m); |
manuelfederanko | 19:a06d764e4f64 | 280 | ser.flush(); |
manuelfederanko | 19:a06d764e4f64 | 281 | |
manuelfederanko | 21:5fb0832693d1 | 282 | //that here for not delaying the msg transfere |
manuelfederanko | 21:5fb0832693d1 | 283 | #ifdef DEBUG |
manuelfederanko | 21:5fb0832693d1 | 284 | cprintf("reset"); |
manuelfederanko | 21:5fb0832693d1 | 285 | display(); |
manuelfederanko | 21:5fb0832693d1 | 286 | wait(DBUG_MSG_TIME); |
manuelfederanko | 21:5fb0832693d1 | 287 | #endif |
manuelfederanko | 21:5fb0832693d1 | 288 | |
manuelfederanko | 19:a06d764e4f64 | 289 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 290 | return 0; |
manuelfederanko | 19:a06d764e4f64 | 291 | } |
manuelfederanko | 19:a06d764e4f64 | 292 | |
manuelfederanko | 19:a06d764e4f64 | 293 | char handleEvent_12_MessageReceived(Event *e) { |
manuelfederanko | 19:a06d764e4f64 | 294 | tcode c = str_to_int(e->data); |
manuelfederanko | 19:a06d764e4f64 | 295 | char *msg = &e->data[8]; |
manuelfederanko | 19:a06d764e4f64 | 296 | |
manuelfederanko | 19:a06d764e4f64 | 297 | switch(c) { |
manuelfederanko | 19:a06d764e4f64 | 298 | case MSG_CODE_KILL: |
manuelfederanko | 19:a06d764e4f64 | 299 | ebus.raiseEvent(4, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 300 | break; |
manuelfederanko | 19:a06d764e4f64 | 301 | case MSG_CODE_RESET: |
manuelfederanko | 19:a06d764e4f64 | 302 | ebus.raiseEvent(2, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 303 | break; |
manuelfederanko | 19:a06d764e4f64 | 304 | case MSG_CODE_STOP: |
manuelfederanko | 19:a06d764e4f64 | 305 | ebus.raiseEvent(10, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 306 | break; |
manuelfederanko | 19:a06d764e4f64 | 307 | case MSG_CODE_REQ_RES: |
manuelfederanko | 19:a06d764e4f64 | 308 | ebus.raiseEvent(2, 0, e->timestamp, NULL); |
manuelfederanko | 19:a06d764e4f64 | 309 | break; |
manuelfederanko | 20:e809ca4de724 | 310 | case MSG_CODE_PING: |
manuelfederanko | 20:e809ca4de724 | 311 | ebus.raiseEvent(14, 0, e->timestamp, NULL); |
fox46 | 23:70780e8b6a2e | 312 | break; |
fox46 | 23:70780e8b6a2e | 313 | case MSG_CODE_TOTAL_RESET: |
fox46 | 23:70780e8b6a2e | 314 | ebus.raiseEvent(3, 0, e->timestamp, NULL); |
fox46 | 23:70780e8b6a2e | 315 | break; |
manuelfederanko | 20:e809ca4de724 | 316 | } |
manuelfederanko | 20:e809ca4de724 | 317 | |
manuelfederanko | 20:e809ca4de724 | 318 | delete e; |
manuelfederanko | 20:e809ca4de724 | 319 | return 0; |
manuelfederanko | 20:e809ca4de724 | 320 | } |
manuelfederanko | 20:e809ca4de724 | 321 | |
manuelfederanko | 20:e809ca4de724 | 322 | char handleEvent_13_YouThere(Event *e) { |
manuelfederanko | 20:e809ca4de724 | 323 | Message *m; |
manuelfederanko | 20:e809ca4de724 | 324 | ping_flag = systime; |
manuelfederanko | 20:e809ca4de724 | 325 | |
manuelfederanko | 20:e809ca4de724 | 326 | m = new Message(MSG_CODE_PING, ""); |
manuelfederanko | 20:e809ca4de724 | 327 | ser.putMsg(m); |
manuelfederanko | 20:e809ca4de724 | 328 | ser.flush(); |
manuelfederanko | 20:e809ca4de724 | 329 | |
manuelfederanko | 20:e809ca4de724 | 330 | delete e; |
manuelfederanko | 20:e809ca4de724 | 331 | return 0; |
manuelfederanko | 20:e809ca4de724 | 332 | } |
manuelfederanko | 20:e809ca4de724 | 333 | |
manuelfederanko | 20:e809ca4de724 | 334 | char handleEvent_14_Hello(Event *e) { |
manuelfederanko | 20:e809ca4de724 | 335 | Message *m; |
manuelfederanko | 20:e809ca4de724 | 336 | if (ping_flag) { |
manuelfederanko | 21:5fb0832693d1 | 337 | if ((comm_flags & FLAG_BROTHER_HERE) == 0) { |
manuelfederanko | 21:5fb0832693d1 | 338 | cprintf("reconnected"); |
manuelfederanko | 21:5fb0832693d1 | 339 | display(); |
manuelfederanko | 21:5fb0832693d1 | 340 | wait(0.5); |
manuelfederanko | 21:5fb0832693d1 | 341 | comm_flags |= FLAG_BROTHER_HERE; |
manuelfederanko | 21:5fb0832693d1 | 342 | } |
manuelfederanko | 20:e809ca4de724 | 343 | ping_flag = 0; |
manuelfederanko | 20:e809ca4de724 | 344 | } else { |
manuelfederanko | 20:e809ca4de724 | 345 | m = new Message(MSG_CODE_PING, ""); |
manuelfederanko | 20:e809ca4de724 | 346 | ser.putMsg(m); |
manuelfederanko | 20:e809ca4de724 | 347 | ser.flush(); |
manuelfederanko | 19:a06d764e4f64 | 348 | } |
manuelfederanko | 19:a06d764e4f64 | 349 | |
manuelfederanko | 19:a06d764e4f64 | 350 | delete e; |
manuelfederanko | 19:a06d764e4f64 | 351 | return 0; |
manuelfederanko | 13:a45461fbb77f | 352 | } |
manuelfederanko | 13:a45461fbb77f | 353 | |
manuelfederanko | 13:a45461fbb77f | 354 | int main() { |
manuelfederanko | 13:a45461fbb77f | 355 | //| Element 0 | Element 1 | Element 2 | Element 3 | |
manuelfederanko | 13:a45461fbb77f | 356 | //|-----------|-----------|-----------|-----------| |
manuelfederanko | 21:5fb0832693d1 | 357 | //| Akkucheck | LED blink | Disp-Rate | Ping | |
manuelfederanko | 13:a45461fbb77f | 358 | time_100us prev[5]; |
fox46 | 12:3f53322a5270 | 359 | |
manuelfederanko | 13:a45461fbb77f | 360 | //init |
manuelfederanko | 13:a45461fbb77f | 361 | init_io(); |
manuelfederanko | 13:a45461fbb77f | 362 | init_values(); |
manuelfederanko | 17:ce5a80e8fc8e | 363 | times = NULL; |
manuelfederanko | 17:ce5a80e8fc8e | 364 | tick.attach_us(&handle_systime, 100); //every 100 us |
manuelfederanko | 17:ce5a80e8fc8e | 365 | pb1.attach_asserted(&bzr_pressed); |
manuelfederanko | 17:ce5a80e8fc8e | 366 | pb1.attach_asserted_held(&bzr_held_pressed); |
manuelfederanko | 19:a06d764e4f64 | 367 | pb1.setSamplesTillHeld(1000); //1000 samples ---> 1ms ---> 1 second |
manuelfederanko | 17:ce5a80e8fc8e | 368 | pb1.setSampleFrequency(1000); //1ms |
manuelfederanko | 17:ce5a80e8fc8e | 369 | |
fox46 | 23:70780e8b6a2e | 370 | pb2.attach_deasserted(&btn_pressed); |
manuelfederanko | 17:ce5a80e8fc8e | 371 | pb2.attach_deasserted_held(&btn_held_released); |
manuelfederanko | 17:ce5a80e8fc8e | 372 | pb2.setSamplesTillHeld(200); |
manuelfederanko | 17:ce5a80e8fc8e | 373 | pb2.setSampleFrequency(); |
manuelfederanko | 17:ce5a80e8fc8e | 374 | |
manuelfederanko | 19:a06d764e4f64 | 375 | beam.attach_asserted(&beam_pressed); |
manuelfederanko | 19:a06d764e4f64 | 376 | beam.setSampleFrequency(1000); |
manuelfederanko | 19:a06d764e4f64 | 377 | |
manuelfederanko | 19:a06d764e4f64 | 378 | //register event handlers |
manuelfederanko | 19:a06d764e4f64 | 379 | ebus.registerEvent(1, &handleEvent_01_BuzzerPressed); |
manuelfederanko | 19:a06d764e4f64 | 380 | ebus.registerEvent(2, &handleEvent_02_StartNextRun); |
manuelfederanko | 19:a06d764e4f64 | 381 | ebus.registerEvent(3, &handleEvent_03_Resync); |
manuelfederanko | 19:a06d764e4f64 | 382 | ebus.registerEvent(4, &handleEvent_04_Shutdown); |
manuelfederanko | 19:a06d764e4f64 | 383 | ebus.registerEvent(5, &handleEvent_05_BeamPressed); |
manuelfederanko | 19:a06d764e4f64 | 384 | ebus.registerEvent(6, &handleEvent_06_Receive); |
manuelfederanko | 19:a06d764e4f64 | 385 | ebus.registerEvent(7, &handleEvent_07_Start); |
manuelfederanko | 19:a06d764e4f64 | 386 | ebus.registerEvent(8, &handleEvent_08_Snap0); |
manuelfederanko | 19:a06d764e4f64 | 387 | ebus.registerEvent(9, &handleEvent_09_Snap1); |
manuelfederanko | 19:a06d764e4f64 | 388 | ebus.registerEvent(10, &handleEvent_10_Stop); |
manuelfederanko | 19:a06d764e4f64 | 389 | ebus.registerEvent(11, &handleEvent_11_SendReset); |
manuelfederanko | 19:a06d764e4f64 | 390 | ebus.registerEvent(12, &handleEvent_12_MessageReceived); |
manuelfederanko | 20:e809ca4de724 | 391 | ebus.registerEvent(13, &handleEvent_13_YouThere); |
manuelfederanko | 20:e809ca4de724 | 392 | ebus.registerEvent(14, &handleEvent_14_Hello); |
manuelfederanko | 19:a06d764e4f64 | 393 | |
manuelfederanko | 17:ce5a80e8fc8e | 394 | //info |
manuelfederanko | 17:ce5a80e8fc8e | 395 | cprintf(RUNMODE_SERVER); |
manuelfederanko | 17:ce5a80e8fc8e | 396 | display(); |
manuelfederanko | 17:ce5a80e8fc8e | 397 | wait(WAIT_INFO_TM); |
manuelfederanko | 17:ce5a80e8fc8e | 398 | |
manuelfederanko | 17:ce5a80e8fc8e | 399 | //config |
manuelfederanko | 17:ce5a80e8fc8e | 400 | config_buttons(); |
manuelfederanko | 17:ce5a80e8fc8e | 401 | config_rf_mod(); |
manuelfederanko | 17:ce5a80e8fc8e | 402 | |
manuelfederanko | 17:ce5a80e8fc8e | 403 | //start |
manuelfederanko | 17:ce5a80e8fc8e | 404 | lowbatt(); |
manuelfederanko | 20:e809ca4de724 | 405 | ser.registerRcFc(&hdl_rec); |
manuelfederanko | 17:ce5a80e8fc8e | 406 | |
manuelfederanko | 17:ce5a80e8fc8e | 407 | prev[0] = prev[1] = prev[2] = prev[3] = prev[4] = systime; |
manuelfederanko | 17:ce5a80e8fc8e | 408 | |
manuelfederanko | 17:ce5a80e8fc8e | 409 | times = initNode(); |
manuelfederanko | 17:ce5a80e8fc8e | 410 | |
manuelfederanko | 19:a06d764e4f64 | 411 | memset(bl0, 0, LCD_BUFFERLEN); |
manuelfederanko | 19:a06d764e4f64 | 412 | memset(bl1, 0, LCD_BUFFERLEN); |
manuelfederanko | 19:a06d764e4f64 | 413 | memset(bl0_, 0, LCD_BUFFERLEN); |
manuelfederanko | 19:a06d764e4f64 | 414 | memset(bl1_, 0, LCD_BUFFERLEN); |
manuelfederanko | 19:a06d764e4f64 | 415 | |
manuelfederanko | 19:a06d764e4f64 | 416 | ebus.raiseEvent(3, 0, systime, NULL); |
manuelfederanko | 19:a06d764e4f64 | 417 | |
manuelfederanko | 17:ce5a80e8fc8e | 418 | while(1) { |
manuelfederanko | 17:ce5a80e8fc8e | 419 | if (systime - prev[2] >= RATE_DISPLAY) { |
manuelfederanko | 17:ce5a80e8fc8e | 420 | prev[2] = systime; |
manuelfederanko | 17:ce5a80e8fc8e | 421 | render_time(); |
manuelfederanko | 17:ce5a80e8fc8e | 422 | display(); |
manuelfederanko | 17:ce5a80e8fc8e | 423 | } |
manuelfederanko | 17:ce5a80e8fc8e | 424 | if (systime - prev[1] >= ((akku_state >= AKKU_1)? RATE_LED_NOK : RATE_LED_OK)) { |
manuelfederanko | 17:ce5a80e8fc8e | 425 | prev[1] = systime; |
manuelfederanko | 17:ce5a80e8fc8e | 426 | stoppled.write(!stoppled.read()); |
manuelfederanko | 17:ce5a80e8fc8e | 427 | } |
manuelfederanko | 20:e809ca4de724 | 428 | if (systime - prev[3] >= 50000) { //every 5 secs ping |
manuelfederanko | 20:e809ca4de724 | 429 | prev[3] = systime; |
manuelfederanko | 21:5fb0832693d1 | 430 | //ebus.raiseEvent(13, 0, systime, NULL); |
manuelfederanko | 20:e809ca4de724 | 431 | } |
manuelfederanko | 17:ce5a80e8fc8e | 432 | if (comm_flags & FLAG_INFO_LOCK && systime - info_tm >= RATE_SHOW_INFO) { |
manuelfederanko | 17:ce5a80e8fc8e | 433 | //if the flag is set it means, that we wanna show something and the time has been set --> if the difference bigger than the rate, then clear the flag |
manuelfederanko | 17:ce5a80e8fc8e | 434 | //the flag gets checked in the render_time function, to prevent that from overwriting the info text |
manuelfederanko | 17:ce5a80e8fc8e | 435 | comm_flags &= ~FLAG_INFO_LOCK; |
manuelfederanko | 17:ce5a80e8fc8e | 436 | } |
manuelfederanko | 17:ce5a80e8fc8e | 437 | if (systime - prev[0] >= RATE_CHECK_AKKU) { |
manuelfederanko | 17:ce5a80e8fc8e | 438 | prev[0] = systime; |
manuelfederanko | 17:ce5a80e8fc8e | 439 | akkucheck(); |
manuelfederanko | 17:ce5a80e8fc8e | 440 | |
manuelfederanko | 17:ce5a80e8fc8e | 441 | if (akku_state == AKKU_CRITICAL) { |
manuelfederanko | 17:ce5a80e8fc8e | 442 | shutdown_seq(); |
manuelfederanko | 17:ce5a80e8fc8e | 443 | } |
manuelfederanko | 17:ce5a80e8fc8e | 444 | } |
manuelfederanko | 20:e809ca4de724 | 445 | if (ping_flag != 0 && systime - ping_flag >= 30000) { //3 secs |
manuelfederanko | 21:5fb0832693d1 | 446 | if (comm_flags & FLAG_BROTHER_HERE) { |
manuelfederanko | 21:5fb0832693d1 | 447 | cprintf("connection lost"); |
manuelfederanko | 21:5fb0832693d1 | 448 | display(); |
manuelfederanko | 21:5fb0832693d1 | 449 | wait(0.5); |
manuelfederanko | 21:5fb0832693d1 | 450 | } |
manuelfederanko | 21:5fb0832693d1 | 451 | comm_flags &= ~FLAG_BROTHER_HERE; |
manuelfederanko | 20:e809ca4de724 | 452 | ping_flag = 0; |
manuelfederanko | 20:e809ca4de724 | 453 | } |
manuelfederanko | 24:9c0151db1f98 | 454 | |
manuelfederanko | 24:9c0151db1f98 | 455 | //if (systime - prev[4] > 100) { |
manuelfederanko | 24:9c0151db1f98 | 456 | // prev[4] = systime; |
manuelfederanko | 24:9c0151db1f98 | 457 | ebus.run(); |
manuelfederanko | 24:9c0151db1f98 | 458 | //} |
manuelfederanko | 17:ce5a80e8fc8e | 459 | } |
manuelfederanko | 19:a06d764e4f64 | 460 | } |