Mobile Security System - Revision 1.0

Dependencies:   FXOS8700Q N5110 SDFileSystem SRF02 mbed

Committer:
el14dg
Date:
Wed May 04 15:33:54 2016 +0000
Revision:
9:a5614f53d435
Parent:
8:8a3d1c07bdec
FINISHED v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el14dg 6:dc1229224d8e 1 /* ELEC2645 Project */
el14dg 2:e504a3cfe113 2
el14dg 1:3ae4192d0c25 3 #include "main.h"
el14dg 0:12ae42019e9f 4
el14dg 0:12ae42019e9f 5 int main()
el14dg 0:12ae42019e9f 6 {
el14dg 6:dc1229224d8e 7
el14dg 6:dc1229224d8e 8 init_serial(); // set up UART connection with PC for debugging
el14dg 6:dc1229224d8e 9 init_K64F(); // set up K64F on board LEDs and switches
el14dg 6:dc1229224d8e 10 init_buttons(); // set up the three external buttons
el14dg 6:dc1229224d8e 11 init_variables(); // initialise all variables to 0
el14dg 6:dc1229224d8e 12 lcd.init(); // initialise the Nokia 5110 LCD
el14dg 3:70a7b64fbd98 13
el14dg 6:dc1229224d8e 14 read_pin(); // read current pin from the SD card to the set_pin array
el14dg 6:dc1229224d8e 15
el14dg 6:dc1229224d8e 16 buzzer.period(1.0/500.0); // set the buzzer period - 500 Hz
el14dg 6:dc1229224d8e 17
el14dg 6:dc1229224d8e 18 buzzer.write(0.5); // duty cycle = 0.5 ----> Square Wave
el14dg 6:dc1229224d8e 19
el14dg 6:dc1229224d8e 20 wait(2); // wait two seconds to allow LCD to initialise
el14dg 6:dc1229224d8e 21
el14dg 6:dc1229224d8e 22 screen_selection(); // initial screen
el14dg 2:e504a3cfe113 23
el14dg 2:e504a3cfe113 24 wait(4);
el14dg 2:e504a3cfe113 25
el14dg 3:70a7b64fbd98 26 g_next_state = 1;
el14dg 6:dc1229224d8e 27
el14dg 6:dc1229224d8e 28 screen_selection(); // menu screen
el14dg 6:dc1229224d8e 29
el14dg 5:41cb88f47f42 30 g_current_state = 1;
el14dg 3:70a7b64fbd98 31
el14dg 3:70a7b64fbd98 32
el14dg 0:12ae42019e9f 33 while (1) {
el14dg 0:12ae42019e9f 34
el14dg 3:70a7b64fbd98 35
el14dg 6:dc1229224d8e 36 if (g_button_0_flag) { // if button_0 is pressed
el14dg 3:70a7b64fbd98 37
el14dg 3:70a7b64fbd98 38 pc.printf("g_button_0_flag = %d \n", g_button_0_flag);
el14dg 2:e504a3cfe113 39
el14dg 2:e504a3cfe113 40 g_button_0_flag = 0;
el14dg 2:e504a3cfe113 41
el14dg 3:70a7b64fbd98 42 button_0_protocol();
el14dg 2:e504a3cfe113 43
el14dg 0:12ae42019e9f 44 }
el14dg 3:70a7b64fbd98 45
el14dg 6:dc1229224d8e 46 if (g_button_1_flag) { // if button_1 is pressed
el14dg 3:70a7b64fbd98 47
el14dg 3:70a7b64fbd98 48 pc.printf("g_button_1_flag = %d \n", g_button_1_flag);
el14dg 2:e504a3cfe113 49
el14dg 2:e504a3cfe113 50 g_button_1_flag = 0;
el14dg 6:dc1229224d8e 51
el14dg 3:70a7b64fbd98 52 button_1_protocol();
el14dg 0:12ae42019e9f 53
el14dg 2:e504a3cfe113 54 }
el14dg 2:e504a3cfe113 55
el14dg 6:dc1229224d8e 56 if (g_button_c_flag) { // if button_c is pressed
el14dg 3:70a7b64fbd98 57
el14dg 3:70a7b64fbd98 58 pc.printf("g_button_c_flag = %d \n", g_button_c_flag);
el14dg 2:e504a3cfe113 59
el14dg 2:e504a3cfe113 60 g_button_c_flag = 0;
el14dg 5:41cb88f47f42 61
el14dg 3:70a7b64fbd98 62 button_c_protocol();
el14dg 5:41cb88f47f42 63
el14dg 3:70a7b64fbd98 64 }
el14dg 3:70a7b64fbd98 65
el14dg 6:dc1229224d8e 66 if (g_setting_distance_flag) { // state 4 - initial setting distance
el14dg 3:70a7b64fbd98 67
el14dg 3:70a7b64fbd98 68 g_setting_distance_flag = 0;
el14dg 3:70a7b64fbd98 69
el14dg 3:70a7b64fbd98 70 get_setting_distance();
el14dg 3:70a7b64fbd98 71
el14dg 3:70a7b64fbd98 72 }
el14dg 3:70a7b64fbd98 73
el14dg 6:dc1229224d8e 74 if (g_intruder_distance_flag) { // state 5 - current distance compared to initial setting distance
el14dg 9:a5614f53d435 75
el14dg 9:a5614f53d435 76 if (g_current_state == 5) {
el14dg 9:a5614f53d435 77
el14dg 9:a5614f53d435 78 g_setting_distance_flag = 0;
el14dg 3:70a7b64fbd98 79
el14dg 9:a5614f53d435 80 get_intruder_distance();
el14dg 9:a5614f53d435 81
el14dg 9:a5614f53d435 82 }
el14dg 3:70a7b64fbd98 83
el14dg 5:41cb88f47f42 84 }
el14dg 6:dc1229224d8e 85
el14dg 6:dc1229224d8e 86 if (g_setting_screen_flag) { // state 4 loading bar and percentage animation
el14dg 6:dc1229224d8e 87
el14dg 5:41cb88f47f42 88 g_setting_screen_flag = 0;
el14dg 6:dc1229224d8e 89
el14dg 6:dc1229224d8e 90 setting_animation();
el14dg 3:70a7b64fbd98 91
el14dg 6:dc1229224d8e 92 }
el14dg 6:dc1229224d8e 93
el14dg 6:dc1229224d8e 94 if (g_led_buzzer_flag) { // toggles LED and buzzer
el14dg 9:a5614f53d435 95
el14dg 5:41cb88f47f42 96 g_led_buzzer_flag = 0;
el14dg 3:70a7b64fbd98 97
el14dg 5:41cb88f47f42 98 led_alarm = !led_alarm;
el14dg 6:dc1229224d8e 99
el14dg 5:41cb88f47f42 100 if (buzzer == 0) {
el14dg 6:dc1229224d8e 101
el14dg 5:41cb88f47f42 102 buzzer = 0.5;
el14dg 6:dc1229224d8e 103
el14dg 5:41cb88f47f42 104 }
el14dg 6:dc1229224d8e 105
el14dg 5:41cb88f47f42 106 else {
el14dg 6:dc1229224d8e 107
el14dg 5:41cb88f47f42 108 buzzer = 0;
el14dg 6:dc1229224d8e 109
el14dg 8:8a3d1c07bdec 110 }
el14dg 0:12ae42019e9f 111
el14dg 2:e504a3cfe113 112 }
el14dg 8:8a3d1c07bdec 113
el14dg 8:8a3d1c07bdec 114 if (g_acc_flag) {
el14dg 8:8a3d1c07bdec 115
el14dg 8:8a3d1c07bdec 116 g_acc_flag = 0;
el14dg 8:8a3d1c07bdec 117
el14dg 8:8a3d1c07bdec 118 if (g_current_state == 4) {
el14dg 8:8a3d1c07bdec 119
el14dg 8:8a3d1c07bdec 120 compare_axis_data();
el14dg 8:8a3d1c07bdec 121
el14dg 8:8a3d1c07bdec 122 }
el14dg 8:8a3d1c07bdec 123
el14dg 8:8a3d1c07bdec 124 }
el14dg 3:70a7b64fbd98 125
el14dg 6:dc1229224d8e 126 if (g_pin_timeout_flag) { // state 7 - 20 second timeout
el14dg 3:70a7b64fbd98 127
el14dg 5:41cb88f47f42 128 g_pin_timeout_flag = 0;
el14dg 3:70a7b64fbd98 129
el14dg 5:41cb88f47f42 130 timeout_protocol();
el14dg 6:dc1229224d8e 131
el14dg 5:41cb88f47f42 132 }
el14dg 6:dc1229224d8e 133
el14dg 3:70a7b64fbd98 134 if (g_next_state != g_current_state) {
el14dg 6:dc1229224d8e 135
el14dg 5:41cb88f47f42 136 pc.printf("TRANSITION \n");
el14dg 3:70a7b64fbd98 137
el14dg 6:dc1229224d8e 138 screen_selection(); // the screen is determined by the value of g_next_state
el14dg 6:dc1229224d8e 139
el14dg 5:41cb88f47f42 140 g_current_state = g_next_state;
el14dg 6:dc1229224d8e 141
el14dg 5:41cb88f47f42 142 pc.printf("Current State = %d \n",g_current_state);
el14dg 6:dc1229224d8e 143
el14dg 3:70a7b64fbd98 144 }
el14dg 3:70a7b64fbd98 145
el14dg 2:e504a3cfe113 146 sleep();
el14dg 6:dc1229224d8e 147
el14dg 2:e504a3cfe113 148
el14dg 0:12ae42019e9f 149 }
el14dg 2:e504a3cfe113 150
el14dg 0:12ae42019e9f 151 }
el14dg 0:12ae42019e9f 152
el14dg 2:e504a3cfe113 153
el14dg 7:8ac5aee0c13e 154 // Initialisation Functions
el14dg 7:8ac5aee0c13e 155
el14dg 0:12ae42019e9f 156 void init_serial()
el14dg 0:12ae42019e9f 157 {
el14dg 2:e504a3cfe113 158 // Ensure terminal software matches
el14dg 3:70a7b64fbd98 159 pc.baud(115200);
el14dg 0:12ae42019e9f 160 }
el14dg 0:12ae42019e9f 161
el14dg 0:12ae42019e9f 162 void init_K64F()
el14dg 0:12ae42019e9f 163 {
el14dg 6:dc1229224d8e 164 // on-board LEDs are active-low, so they are set high to turn them off.
el14dg 0:12ae42019e9f 165 r_led = 1;
el14dg 0:12ae42019e9f 166 g_led = 1;
el14dg 0:12ae42019e9f 167 b_led = 1;
el14dg 0:12ae42019e9f 168
el14dg 0:12ae42019e9f 169 // since the on-board switches have external pull-ups, we should disable the internal pull-down
el14dg 0:12ae42019e9f 170 // resistors that are enabled by default using InterruptIn
el14dg 0:12ae42019e9f 171 sw2.mode(PullNone);
el14dg 0:12ae42019e9f 172 sw3.mode(PullNone);
el14dg 0:12ae42019e9f 173
el14dg 0:12ae42019e9f 174 }
el14dg 2:e504a3cfe113 175
el14dg 2:e504a3cfe113 176 void init_buttons()
el14dg 2:e504a3cfe113 177 {
el14dg 6:dc1229224d8e 178 // all external buttons trigger the relevant ISR when the voltage at the K64F pin falls
el14dg 2:e504a3cfe113 179 button_0.fall(&button_0_isr);
el14dg 2:e504a3cfe113 180 button_1.fall(&button_1_isr);
el14dg 2:e504a3cfe113 181 button_c.fall(&button_c_isr);
el14dg 2:e504a3cfe113 182
el14dg 6:dc1229224d8e 183 // enable the internal pull-down resistors
el14dg 2:e504a3cfe113 184 button_0.mode(PullDown);
el14dg 2:e504a3cfe113 185 button_1.mode(PullDown);
el14dg 2:e504a3cfe113 186 button_c.mode(PullDown);
el14dg 2:e504a3cfe113 187
el14dg 2:e504a3cfe113 188 }
el14dg 2:e504a3cfe113 189
el14dg 5:41cb88f47f42 190 void init_variables()
el14dg 5:41cb88f47f42 191 {
el14dg 5:41cb88f47f42 192
el14dg 5:41cb88f47f42 193 one_second_distance = 0;
el14dg 5:41cb88f47f42 194 one_second_avg_distance = 0;
el14dg 5:41cb88f47f42 195 initial_setting_distance = 0;
el14dg 5:41cb88f47f42 196
el14dg 5:41cb88f47f42 197 pin_counter = 0;
el14dg 5:41cb88f47f42 198 incorrect_pin_flag = 0;
el14dg 5:41cb88f47f42 199
el14dg 5:41cb88f47f42 200 setting_distance_counter = 0;
el14dg 5:41cb88f47f42 201 intruder_distance_counter = 0;
el14dg 5:41cb88f47f42 202
el14dg 5:41cb88f47f42 203 g_button_0_flag = 0;
el14dg 5:41cb88f47f42 204 g_button_1_flag = 0;
el14dg 5:41cb88f47f42 205 g_button_c_flag = 0;
el14dg 5:41cb88f47f42 206 g_setting_distance_flag = 0;
el14dg 5:41cb88f47f42 207 g_intruder_distance_flag = 0;
el14dg 5:41cb88f47f42 208 g_pin_timeout_flag = 0;
el14dg 5:41cb88f47f42 209
el14dg 5:41cb88f47f42 210 g_current_state = 0;
el14dg 5:41cb88f47f42 211
el14dg 6:dc1229224d8e 212 reset_entered_pin();
el14dg 8:8a3d1c07bdec 213
el14dg 8:8a3d1c07bdec 214 acc.enable();
el14dg 6:dc1229224d8e 215
el14dg 5:41cb88f47f42 216 }
el14dg 5:41cb88f47f42 217
el14dg 7:8ac5aee0c13e 218 // Interrupt Service Routines (ISRs)
el14dg 7:8ac5aee0c13e 219
el14dg 3:70a7b64fbd98 220 void setting_distance_isr()
el14dg 2:e504a3cfe113 221 {
el14dg 3:70a7b64fbd98 222 g_setting_distance_flag = 1;
el14dg 3:70a7b64fbd98 223
el14dg 3:70a7b64fbd98 224 }
el14dg 3:70a7b64fbd98 225
el14dg 3:70a7b64fbd98 226 void intruder_distance_isr()
el14dg 3:70a7b64fbd98 227 {
el14dg 3:70a7b64fbd98 228 g_intruder_distance_flag = 1;
el14dg 2:e504a3cfe113 229
el14dg 2:e504a3cfe113 230 }
el14dg 2:e504a3cfe113 231
el14dg 2:e504a3cfe113 232 void button_0_isr()
el14dg 2:e504a3cfe113 233 {
el14dg 2:e504a3cfe113 234 g_button_0_flag = 1;
el14dg 2:e504a3cfe113 235
el14dg 2:e504a3cfe113 236 }
el14dg 2:e504a3cfe113 237
el14dg 2:e504a3cfe113 238 void button_1_isr()
el14dg 2:e504a3cfe113 239 {
el14dg 2:e504a3cfe113 240 g_button_1_flag = 1;
el14dg 2:e504a3cfe113 241
el14dg 2:e504a3cfe113 242 }
el14dg 2:e504a3cfe113 243
el14dg 2:e504a3cfe113 244 void button_c_isr()
el14dg 2:e504a3cfe113 245 {
el14dg 2:e504a3cfe113 246 g_button_c_flag = 1;
el14dg 2:e504a3cfe113 247
el14dg 2:e504a3cfe113 248 }
el14dg 2:e504a3cfe113 249
el14dg 7:8ac5aee0c13e 250 void led_buzzer_isr()
el14dg 7:8ac5aee0c13e 251 {
el14dg 7:8ac5aee0c13e 252 g_led_buzzer_flag = 1;
el14dg 7:8ac5aee0c13e 253
el14dg 7:8ac5aee0c13e 254 }
el14dg 7:8ac5aee0c13e 255
el14dg 8:8a3d1c07bdec 256 void acc_isr()
el14dg 8:8a3d1c07bdec 257 {
el14dg 8:8a3d1c07bdec 258 g_acc_flag = 1;
el14dg 8:8a3d1c07bdec 259
el14dg 8:8a3d1c07bdec 260 }
el14dg 8:8a3d1c07bdec 261
el14dg 5:41cb88f47f42 262 void pin_timeout_isr()
el14dg 5:41cb88f47f42 263 {
el14dg 5:41cb88f47f42 264 g_pin_timeout_flag = 1;
el14dg 5:41cb88f47f42 265
el14dg 5:41cb88f47f42 266 }
el14dg 5:41cb88f47f42 267
el14dg 7:8ac5aee0c13e 268 void setting_screen_isr()
el14dg 5:41cb88f47f42 269 {
el14dg 7:8ac5aee0c13e 270 g_setting_screen_flag = 1;
el14dg 6:dc1229224d8e 271
el14dg 7:8ac5aee0c13e 272 }
el14dg 6:dc1229224d8e 273
el14dg 7:8ac5aee0c13e 274 // Button Functions
el14dg 5:41cb88f47f42 275
el14dg 3:70a7b64fbd98 276 void button_0_protocol()
el14dg 2:e504a3cfe113 277 {
el14dg 6:dc1229224d8e 278
el14dg 6:dc1229224d8e 279 // states 2, 3, 6 and 7 require a pin to be entered
el14dg 6:dc1229224d8e 280
el14dg 3:70a7b64fbd98 281 if (g_current_state == 2) {
el14dg 3:70a7b64fbd98 282
el14dg 6:dc1229224d8e 283 if (pin_counter < 4) { // entered_pin has four elements
el14dg 3:70a7b64fbd98 284
el14dg 3:70a7b64fbd98 285 entered_pin[pin_counter] = 0;
el14dg 3:70a7b64fbd98 286
el14dg 3:70a7b64fbd98 287 pin_counter++;
el14dg 3:70a7b64fbd98 288
el14dg 3:70a7b64fbd98 289 }
el14dg 5:41cb88f47f42 290
el14dg 9:a5614f53d435 291 enter_pin(); // enter_pin() prints '*' to the LCD
el14dg 3:70a7b64fbd98 292
el14dg 3:70a7b64fbd98 293 }
el14dg 3:70a7b64fbd98 294
el14dg 3:70a7b64fbd98 295 else if (g_current_state == 3) {
el14dg 3:70a7b64fbd98 296
el14dg 6:dc1229224d8e 297 if (pin_counter < 4) { // entered_pin has four elements
el14dg 3:70a7b64fbd98 298
el14dg 3:70a7b64fbd98 299 entered_pin[pin_counter] = 0;
el14dg 3:70a7b64fbd98 300
el14dg 3:70a7b64fbd98 301 pin_counter++;
el14dg 3:70a7b64fbd98 302
el14dg 3:70a7b64fbd98 303 }
el14dg 5:41cb88f47f42 304
el14dg 9:a5614f53d435 305 enter_pin(); // Prints '*' to the LCD
el14dg 3:70a7b64fbd98 306
el14dg 3:70a7b64fbd98 307 }
el14dg 2:e504a3cfe113 308
el14dg 3:70a7b64fbd98 309 else if (g_current_state == 6) {
el14dg 3:70a7b64fbd98 310
el14dg 6:dc1229224d8e 311 if (pin_counter < 4) { // entered_pin has four elements
el14dg 6:dc1229224d8e 312
el14dg 6:dc1229224d8e 313 entered_pin[pin_counter] = 0;
el14dg 6:dc1229224d8e 314
el14dg 6:dc1229224d8e 315 pin_counter++;
el14dg 6:dc1229224d8e 316
el14dg 6:dc1229224d8e 317 }
el14dg 6:dc1229224d8e 318
el14dg 9:a5614f53d435 319 enter_pin(); // Prints '*' to the LCD
el14dg 6:dc1229224d8e 320
el14dg 6:dc1229224d8e 321 }
el14dg 6:dc1229224d8e 322
el14dg 6:dc1229224d8e 323 else if (g_current_state == 7) { // entered_pin has four elements
el14dg 6:dc1229224d8e 324
el14dg 3:70a7b64fbd98 325 if (pin_counter < 4) {
el14dg 3:70a7b64fbd98 326
el14dg 3:70a7b64fbd98 327 entered_pin[pin_counter] = 0;
el14dg 3:70a7b64fbd98 328
el14dg 3:70a7b64fbd98 329 pin_counter++;
el14dg 3:70a7b64fbd98 330
el14dg 3:70a7b64fbd98 331 }
el14dg 5:41cb88f47f42 332
el14dg 9:a5614f53d435 333 enter_pin(); // Prints '*' to the LCD
el14dg 3:70a7b64fbd98 334
el14dg 3:70a7b64fbd98 335 }
el14dg 3:70a7b64fbd98 336
el14dg 3:70a7b64fbd98 337 else {
el14dg 2:e504a3cfe113 338
el14dg 9:a5614f53d435 339 g_next_state = fsm[g_current_state].nextState[0]; // Filters through fsm to find the next state
el14dg 3:70a7b64fbd98 340
el14dg 3:70a7b64fbd98 341 }
el14dg 3:70a7b64fbd98 342
el14dg 3:70a7b64fbd98 343 }
el14dg 3:70a7b64fbd98 344
el14dg 3:70a7b64fbd98 345 void button_1_protocol()
el14dg 3:70a7b64fbd98 346 {
el14dg 3:70a7b64fbd98 347
el14dg 9:a5614f53d435 348 // States 2, 3, 6 and 7 require a pin to be entered
el14dg 6:dc1229224d8e 349
el14dg 3:70a7b64fbd98 350 if (g_current_state == 2) {
el14dg 3:70a7b64fbd98 351
el14dg 6:dc1229224d8e 352 if (pin_counter < 4) { // entered_pin has four elements
el14dg 3:70a7b64fbd98 353
el14dg 3:70a7b64fbd98 354 entered_pin[pin_counter] = 1;
el14dg 3:70a7b64fbd98 355
el14dg 3:70a7b64fbd98 356 pin_counter++;
el14dg 3:70a7b64fbd98 357
el14dg 3:70a7b64fbd98 358 }
el14dg 5:41cb88f47f42 359
el14dg 9:a5614f53d435 360 enter_pin(); // enter_pin() prints '*' to the LCD
el14dg 3:70a7b64fbd98 361
el14dg 3:70a7b64fbd98 362 }
el14dg 3:70a7b64fbd98 363
el14dg 3:70a7b64fbd98 364 else if (g_current_state == 3) {
el14dg 3:70a7b64fbd98 365
el14dg 6:dc1229224d8e 366 if (pin_counter < 4) { // entered_pin has four elements
el14dg 2:e504a3cfe113 367
el14dg 3:70a7b64fbd98 368 entered_pin[pin_counter] = 1;
el14dg 3:70a7b64fbd98 369
el14dg 3:70a7b64fbd98 370 pin_counter++;
el14dg 3:70a7b64fbd98 371
el14dg 3:70a7b64fbd98 372 }
el14dg 5:41cb88f47f42 373
el14dg 9:a5614f53d435 374 enter_pin(); // Prints '*' to the LCD
el14dg 3:70a7b64fbd98 375
el14dg 3:70a7b64fbd98 376 }
el14dg 3:70a7b64fbd98 377
el14dg 3:70a7b64fbd98 378 else if (g_current_state == 6) {
el14dg 3:70a7b64fbd98 379
el14dg 6:dc1229224d8e 380 if (pin_counter < 4) { // entered_pin has four elements
el14dg 3:70a7b64fbd98 381
el14dg 3:70a7b64fbd98 382 entered_pin[pin_counter] = 1;
el14dg 2:e504a3cfe113 383
el14dg 3:70a7b64fbd98 384 pin_counter++;
el14dg 3:70a7b64fbd98 385
el14dg 3:70a7b64fbd98 386 }
el14dg 5:41cb88f47f42 387
el14dg 9:a5614f53d435 388 enter_pin(); // Prints '*' to the LCD
el14dg 3:70a7b64fbd98 389
el14dg 3:70a7b64fbd98 390 }
el14dg 3:70a7b64fbd98 391
el14dg 3:70a7b64fbd98 392 else if (g_current_state == 7) {
el14dg 3:70a7b64fbd98 393
el14dg 6:dc1229224d8e 394 if (pin_counter < 4) { // entered_pin has four elements
el14dg 3:70a7b64fbd98 395
el14dg 3:70a7b64fbd98 396 entered_pin[pin_counter] = 1;
el14dg 3:70a7b64fbd98 397
el14dg 3:70a7b64fbd98 398 pin_counter++;
el14dg 2:e504a3cfe113 399
el14dg 2:e504a3cfe113 400 }
el14dg 5:41cb88f47f42 401
el14dg 9:a5614f53d435 402 enter_pin(); // Prints '*' to the LCD
el14dg 5:41cb88f47f42 403
el14dg 3:70a7b64fbd98 404 }
el14dg 3:70a7b64fbd98 405
el14dg 3:70a7b64fbd98 406 else {
el14dg 3:70a7b64fbd98 407
el14dg 9:a5614f53d435 408 g_next_state = fsm[g_current_state].nextState[1]; // Filters through fsm to find the next state
el14dg 3:70a7b64fbd98 409
el14dg 3:70a7b64fbd98 410 }
el14dg 3:70a7b64fbd98 411
el14dg 3:70a7b64fbd98 412 }
el14dg 3:70a7b64fbd98 413
el14dg 3:70a7b64fbd98 414 void button_c_protocol()
el14dg 3:70a7b64fbd98 415 {
el14dg 3:70a7b64fbd98 416
el14dg 9:a5614f53d435 417 // States 2, 3, 6 and 7 require a pin to be entered
el14dg 9:a5614f53d435 418 // The screen only progresses if the correct pin is entered
el14dg 6:dc1229224d8e 419
el14dg 3:70a7b64fbd98 420 if (g_current_state == 2) {
el14dg 3:70a7b64fbd98 421
el14dg 4:9cac024c057c 422 screen_progression();
el14dg 3:70a7b64fbd98 423
el14dg 3:70a7b64fbd98 424 }
el14dg 3:70a7b64fbd98 425
el14dg 3:70a7b64fbd98 426 else if (g_current_state == 3) {
el14dg 3:70a7b64fbd98 427
el14dg 4:9cac024c057c 428 screen_progression();
el14dg 3:70a7b64fbd98 429
el14dg 3:70a7b64fbd98 430 }
el14dg 3:70a7b64fbd98 431
el14dg 3:70a7b64fbd98 432 else if (g_current_state == 6) {
el14dg 3:70a7b64fbd98 433
el14dg 4:9cac024c057c 434 screen_progression();
el14dg 2:e504a3cfe113 435
el14dg 3:70a7b64fbd98 436 }
el14dg 3:70a7b64fbd98 437
el14dg 3:70a7b64fbd98 438 else if (g_current_state == 7) {
el14dg 3:70a7b64fbd98 439
el14dg 4:9cac024c057c 440 screen_progression();
el14dg 3:70a7b64fbd98 441
el14dg 3:70a7b64fbd98 442 }
el14dg 3:70a7b64fbd98 443
el14dg 3:70a7b64fbd98 444 else {
el14dg 3:70a7b64fbd98 445
el14dg 6:dc1229224d8e 446 g_next_state = fsm[g_current_state].nextState[2]; // filters through fsm to find the next state
el14dg 3:70a7b64fbd98 447
el14dg 3:70a7b64fbd98 448 }
el14dg 2:e504a3cfe113 449
el14dg 3:70a7b64fbd98 450 }
el14dg 3:70a7b64fbd98 451
el14dg 7:8ac5aee0c13e 452 // State Functions
el14dg 3:70a7b64fbd98 453
el14dg 2:e504a3cfe113 454 void state_0_screen()
el14dg 2:e504a3cfe113 455 {
el14dg 2:e504a3cfe113 456 lcd.clear();
el14dg 2:e504a3cfe113 457
el14dg 6:dc1229224d8e 458 // print the screen
el14dg 6:dc1229224d8e 459
el14dg 5:41cb88f47f42 460 lcd.printString("Mobile",27,1);
el14dg 6:dc1229224d8e 461
el14dg 5:41cb88f47f42 462 lcd.printString("Security",18,2);
el14dg 2:e504a3cfe113 463
el14dg 5:41cb88f47f42 464 lcd.printString("System",27,3);
el14dg 6:dc1229224d8e 465
el14dg 5:41cb88f47f42 466 lcd_border();
el14dg 6:dc1229224d8e 467
el14dg 6:dc1229224d8e 468 // set LED and buzzer
el14dg 6:dc1229224d8e 469
el14dg 6:dc1229224d8e 470 led_alarm = 0;
el14dg 6:dc1229224d8e 471
el14dg 5:41cb88f47f42 472 buzzer.write(0.0);
el14dg 6:dc1229224d8e 473
el14dg 2:e504a3cfe113 474 lcd.refresh();
el14dg 2:e504a3cfe113 475
el14dg 2:e504a3cfe113 476 }
el14dg 2:e504a3cfe113 477
el14dg 2:e504a3cfe113 478 void state_1_screen()
el14dg 2:e504a3cfe113 479 {
el14dg 2:e504a3cfe113 480 lcd.clear();
el14dg 2:e504a3cfe113 481
el14dg 6:dc1229224d8e 482 // print the screen
el14dg 6:dc1229224d8e 483
el14dg 2:e504a3cfe113 484 lcd.printString("Set Alarm",15,1);
el14dg 2:e504a3cfe113 485
el14dg 2:e504a3cfe113 486 lcd.printString("Set New Pin",9,4);
el14dg 6:dc1229224d8e 487
el14dg 5:41cb88f47f42 488 lcd_border();
el14dg 6:dc1229224d8e 489
el14dg 5:41cb88f47f42 490 for (int i = 0; i < WIDTH; i++) {
el14dg 6:dc1229224d8e 491
el14dg 5:41cb88f47f42 492 lcd.setPixel(i,24);
el14dg 6:dc1229224d8e 493
el14dg 6:dc1229224d8e 494 }
el14dg 6:dc1229224d8e 495
el14dg 6:dc1229224d8e 496 // detach tickers
el14dg 6:dc1229224d8e 497
el14dg 6:dc1229224d8e 498 pin_timeout.detach();
el14dg 8:8a3d1c07bdec 499
el14dg 8:8a3d1c07bdec 500 accelerometer.detach();
el14dg 8:8a3d1c07bdec 501
el14dg 8:8a3d1c07bdec 502 intruder_distance.detach();
el14dg 8:8a3d1c07bdec 503
el14dg 5:41cb88f47f42 504 alerts.detach();
el14dg 6:dc1229224d8e 505
el14dg 6:dc1229224d8e 506 // set LED and buzzer
el14dg 6:dc1229224d8e 507
el14dg 6:dc1229224d8e 508 led_alarm = 0;
el14dg 6:dc1229224d8e 509
el14dg 9:a5614f53d435 510 buzzer.write(0.0);
el14dg 6:dc1229224d8e 511
el14dg 6:dc1229224d8e 512 // reset counter
el14dg 6:dc1229224d8e 513
el14dg 5:41cb88f47f42 514 pin_timeout_counter = 0;
el14dg 6:dc1229224d8e 515
el14dg 2:e504a3cfe113 516 lcd.refresh();
el14dg 2:e504a3cfe113 517
el14dg 2:e504a3cfe113 518 }
el14dg 2:e504a3cfe113 519
el14dg 5:41cb88f47f42 520 void state_2_screen()
el14dg 2:e504a3cfe113 521 {
el14dg 2:e504a3cfe113 522 lcd.clear();
el14dg 2:e504a3cfe113 523
el14dg 6:dc1229224d8e 524 // print the screen
el14dg 6:dc1229224d8e 525
el14dg 2:e504a3cfe113 526 lcd.printString("Enter 4 Digit",3,1);
el14dg 2:e504a3cfe113 527
el14dg 2:e504a3cfe113 528 lcd.printString("Pin Below",15,2);
el14dg 6:dc1229224d8e 529
el14dg 5:41cb88f47f42 530 pin_text_box();
el14dg 6:dc1229224d8e 531
el14dg 5:41cb88f47f42 532 lcd_border();
el14dg 6:dc1229224d8e 533
el14dg 6:dc1229224d8e 534 // set the LED and buzzer
el14dg 6:dc1229224d8e 535
el14dg 6:dc1229224d8e 536 led_alarm = 0;
el14dg 6:dc1229224d8e 537
el14dg 5:41cb88f47f42 538 buzzer.write(0.0);
el14dg 6:dc1229224d8e 539
el14dg 2:e504a3cfe113 540 lcd.refresh();
el14dg 2:e504a3cfe113 541
el14dg 2:e504a3cfe113 542 }
el14dg 2:e504a3cfe113 543
el14dg 3:70a7b64fbd98 544 void state_3_screen()
el14dg 3:70a7b64fbd98 545 {
el14dg 3:70a7b64fbd98 546 lcd.clear();
el14dg 3:70a7b64fbd98 547
el14dg 6:dc1229224d8e 548 // print the screen
el14dg 6:dc1229224d8e 549
el14dg 3:70a7b64fbd98 550 lcd.printString("Enter New 4",9,1);
el14dg 3:70a7b64fbd98 551
el14dg 3:70a7b64fbd98 552 lcd.printString("Digit Pin",15,2);
el14dg 6:dc1229224d8e 553
el14dg 5:41cb88f47f42 554 pin_text_box();
el14dg 3:70a7b64fbd98 555
el14dg 5:41cb88f47f42 556 lcd_border();
el14dg 6:dc1229224d8e 557
el14dg 6:dc1229224d8e 558 // set the LED and buzzer
el14dg 6:dc1229224d8e 559
el14dg 6:dc1229224d8e 560 led_alarm = 0;
el14dg 6:dc1229224d8e 561
el14dg 5:41cb88f47f42 562 buzzer.write(0.0);
el14dg 6:dc1229224d8e 563
el14dg 3:70a7b64fbd98 564 lcd.refresh();
el14dg 3:70a7b64fbd98 565
el14dg 3:70a7b64fbd98 566 }
el14dg 3:70a7b64fbd98 567
el14dg 2:e504a3cfe113 568 void state_4_screen()
el14dg 2:e504a3cfe113 569 {
el14dg 2:e504a3cfe113 570 lcd.clear();
el14dg 2:e504a3cfe113 571
el14dg 6:dc1229224d8e 572 // print the screen
el14dg 6:dc1229224d8e 573
el14dg 2:e504a3cfe113 574 lcd.printString("Setting",21,1);
el14dg 6:dc1229224d8e 575
el14dg 5:41cb88f47f42 576 lcd_border();
el14dg 6:dc1229224d8e 577
el14dg 6:dc1229224d8e 578 lcd.drawRect(0,20,84,5,0); // blank setting bar
el14dg 6:dc1229224d8e 579
el14dg 6:dc1229224d8e 580 lcd.printString("0%",41,4); // 0% of setting complete
el14dg 6:dc1229224d8e 581
el14dg 6:dc1229224d8e 582 // reset counter
el14dg 6:dc1229224d8e 583
el14dg 5:41cb88f47f42 584 setting_alarm_counter = 0;
el14dg 6:dc1229224d8e 585
el14dg 6:dc1229224d8e 586 // set LED and buzzer
el14dg 6:dc1229224d8e 587
el14dg 5:41cb88f47f42 588 led_alarm = 0;
el14dg 6:dc1229224d8e 589
el14dg 5:41cb88f47f42 590 buzzer.write(0.0);
el14dg 6:dc1229224d8e 591
el14dg 6:dc1229224d8e 592 // attach tickers
el14dg 6:dc1229224d8e 593
el14dg 5:41cb88f47f42 594 alerts.attach(&led_buzzer_isr,0.5);
el14dg 8:8a3d1c07bdec 595
el14dg 8:8a3d1c07bdec 596 setting_distance.attach(&setting_distance_isr,0.1);
el14dg 8:8a3d1c07bdec 597
el14dg 8:8a3d1c07bdec 598 accelerometer.attach(&acc_isr,0.1);
el14dg 6:dc1229224d8e 599
el14dg 8:8a3d1c07bdec 600 setting_screen.attach(&setting_screen_isr,0.28);
el14dg 8:8a3d1c07bdec 601
el14dg 8:8a3d1c07bdec 602 // get setting accelerometer data
el14dg 8:8a3d1c07bdec 603
el14dg 8:8a3d1c07bdec 604 get_axis_data();
el14dg 8:8a3d1c07bdec 605
el14dg 8:8a3d1c07bdec 606 pc.printf("Printing setting accelerometer data....\n");
el14dg 8:8a3d1c07bdec 607
el14dg 8:8a3d1c07bdec 608 setting_acc_X = acc_X;
el14dg 8:8a3d1c07bdec 609
el14dg 8:8a3d1c07bdec 610 setting_acc_Y = acc_Y;
el14dg 8:8a3d1c07bdec 611
el14dg 8:8a3d1c07bdec 612 setting_acc_Z = acc_Z;
el14dg 8:8a3d1c07bdec 613
el14dg 8:8a3d1c07bdec 614 pc.printf("X = %.4f \nY = %.4f \nZ = %.4f \n",setting_acc_X,setting_acc_Y,setting_acc_Z);
el14dg 8:8a3d1c07bdec 615
el14dg 2:e504a3cfe113 616 lcd.refresh();
el14dg 2:e504a3cfe113 617
el14dg 2:e504a3cfe113 618 }
el14dg 2:e504a3cfe113 619
el14dg 2:e504a3cfe113 620 void state_5_screen()
el14dg 2:e504a3cfe113 621 {
el14dg 2:e504a3cfe113 622 lcd.clear();
el14dg 2:e504a3cfe113 623
el14dg 6:dc1229224d8e 624 // print the screen
el14dg 6:dc1229224d8e 625
el14dg 2:e504a3cfe113 626 lcd.printString("Alarm Set",15,1);
el14dg 2:e504a3cfe113 627
el14dg 2:e504a3cfe113 628 lcd.printString("DEACTIVATE?",9,4);
el14dg 6:dc1229224d8e 629
el14dg 5:41cb88f47f42 630 lcd_border();
el14dg 6:dc1229224d8e 631
el14dg 5:41cb88f47f42 632 for (int i = 0; i < WIDTH; i++) {
el14dg 6:dc1229224d8e 633
el14dg 5:41cb88f47f42 634 lcd.setPixel(i,20);
el14dg 6:dc1229224d8e 635
el14dg 6:dc1229224d8e 636 }
el14dg 6:dc1229224d8e 637
el14dg 6:dc1229224d8e 638 // detach tickers
el14dg 6:dc1229224d8e 639
el14dg 5:41cb88f47f42 640 alerts.detach();
el14dg 8:8a3d1c07bdec 641
el14dg 8:8a3d1c07bdec 642 accelerometer.detach();
el14dg 6:dc1229224d8e 643
el14dg 5:41cb88f47f42 644 setting_screen.detach();
el14dg 8:8a3d1c07bdec 645
el14dg 8:8a3d1c07bdec 646 // attach ticker
el14dg 8:8a3d1c07bdec 647
el14dg 8:8a3d1c07bdec 648 intruder_distance.attach(&intruder_distance_isr,0.1);
el14dg 6:dc1229224d8e 649
el14dg 6:dc1229224d8e 650 // set LED and buzzer
el14dg 6:dc1229224d8e 651
el14dg 5:41cb88f47f42 652 led_alarm = 1;
el14dg 6:dc1229224d8e 653
el14dg 5:41cb88f47f42 654 buzzer.write(0.5);
el14dg 6:dc1229224d8e 655
el14dg 6:dc1229224d8e 656 // turn off buzzer after 1 second
el14dg 6:dc1229224d8e 657
el14dg 5:41cb88f47f42 658 buzz.attach(&alarm_setting_buzz,1);
el14dg 5:41cb88f47f42 659
el14dg 5:41cb88f47f42 660 lcd.refresh();
el14dg 6:dc1229224d8e 661
el14dg 5:41cb88f47f42 662 }
el14dg 5:41cb88f47f42 663
el14dg 5:41cb88f47f42 664 void state_6_screen()
el14dg 5:41cb88f47f42 665 {
el14dg 5:41cb88f47f42 666 lcd.clear();
el14dg 5:41cb88f47f42 667
el14dg 6:dc1229224d8e 668 // print the screen
el14dg 6:dc1229224d8e 669
el14dg 5:41cb88f47f42 670 lcd.printString("DEACTIVATE",12,1);
el14dg 5:41cb88f47f42 671
el14dg 5:41cb88f47f42 672 lcd.printString("Enter Pin",15,2);
el14dg 6:dc1229224d8e 673
el14dg 5:41cb88f47f42 674 lcd_border();
el14dg 6:dc1229224d8e 675
el14dg 5:41cb88f47f42 676 pin_text_box();
el14dg 6:dc1229224d8e 677
el14dg 6:dc1229224d8e 678 // set the LED and buzzer
el14dg 6:dc1229224d8e 679
el14dg 5:41cb88f47f42 680 led_alarm = 0;
el14dg 6:dc1229224d8e 681
el14dg 5:41cb88f47f42 682 buzzer.write(0.0);
el14dg 6:dc1229224d8e 683
el14dg 6:dc1229224d8e 684 // attach ticker
el14dg 6:dc1229224d8e 685
el14dg 5:41cb88f47f42 686 alerts.attach(&led_buzzer_isr,0.5);
el14dg 8:8a3d1c07bdec 687
el14dg 8:8a3d1c07bdec 688 // detach ticker
el14dg 8:8a3d1c07bdec 689
el14dg 8:8a3d1c07bdec 690 intruder_distance.detach();
el14dg 5:41cb88f47f42 691 lcd.refresh();
el14dg 5:41cb88f47f42 692
el14dg 5:41cb88f47f42 693 }
el14dg 5:41cb88f47f42 694
el14dg 5:41cb88f47f42 695 void state_7_screen()
el14dg 5:41cb88f47f42 696 {
el14dg 5:41cb88f47f42 697 lcd.clear();
el14dg 5:41cb88f47f42 698
el14dg 6:dc1229224d8e 699 // print the screen
el14dg 6:dc1229224d8e 700
el14dg 5:41cb88f47f42 701 lcd.printString("INTRUDER",18,1);
el14dg 5:41cb88f47f42 702
el14dg 5:41cb88f47f42 703 lcd.printString("Enter Pin",15,2);
el14dg 6:dc1229224d8e 704
el14dg 5:41cb88f47f42 705 lcd_border();
el14dg 6:dc1229224d8e 706
el14dg 5:41cb88f47f42 707 pin_text_box();
el14dg 6:dc1229224d8e 708
el14dg 6:dc1229224d8e 709 // set the LED and buzzer
el14dg 6:dc1229224d8e 710
el14dg 5:41cb88f47f42 711 led_alarm = 0;
el14dg 6:dc1229224d8e 712
el14dg 5:41cb88f47f42 713 buzzer.write(0.0);
el14dg 6:dc1229224d8e 714
el14dg 6:dc1229224d8e 715 // attach tickers
el14dg 6:dc1229224d8e 716
el14dg 5:41cb88f47f42 717 alerts.attach(&led_buzzer_isr,0.5);
el14dg 6:dc1229224d8e 718
el14dg 5:41cb88f47f42 719 pin_timeout.attach(&pin_timeout_isr,1);
el14dg 8:8a3d1c07bdec 720
el14dg 8:8a3d1c07bdec 721 // detach ticker
el14dg 8:8a3d1c07bdec 722
el14dg 8:8a3d1c07bdec 723 intruder_distance.detach();
el14dg 2:e504a3cfe113 724
el14dg 2:e504a3cfe113 725 lcd.refresh();
el14dg 2:e504a3cfe113 726
el14dg 2:e504a3cfe113 727 }
el14dg 2:e504a3cfe113 728
el14dg 2:e504a3cfe113 729 void state_8_screen()
el14dg 2:e504a3cfe113 730 {
el14dg 2:e504a3cfe113 731 lcd.clear();
el14dg 2:e504a3cfe113 732
el14dg 6:dc1229224d8e 733 // print the screen
el14dg 6:dc1229224d8e 734
el14dg 2:e504a3cfe113 735 lcd.printString("ALARM",27,1);
el14dg 2:e504a3cfe113 736
el14dg 2:e504a3cfe113 737 lcd.printString("TRIGGERED",15,2);
el14dg 6:dc1229224d8e 738
el14dg 5:41cb88f47f42 739 lcd.printString("Menu?",27,4);
el14dg 6:dc1229224d8e 740
el14dg 5:41cb88f47f42 741 lcd_border();
el14dg 6:dc1229224d8e 742
el14dg 6:dc1229224d8e 743 // set the LED and buzzer
el14dg 6:dc1229224d8e 744
el14dg 5:41cb88f47f42 745 led_alarm = 0;
el14dg 6:dc1229224d8e 746
el14dg 5:41cb88f47f42 747 buzzer.write(0.0);
el14dg 6:dc1229224d8e 748
el14dg 6:dc1229224d8e 749 // detach tickers
el14dg 6:dc1229224d8e 750
el14dg 5:41cb88f47f42 751 alerts.detach();
el14dg 6:dc1229224d8e 752
el14dg 5:41cb88f47f42 753 pin_timeout.detach();
el14dg 6:dc1229224d8e 754
el14dg 6:dc1229224d8e 755 // attach ticker
el14dg 6:dc1229224d8e 756
el14dg 5:41cb88f47f42 757 alerts.attach(&led_buzzer_isr,0.2);
el14dg 2:e504a3cfe113 758
el14dg 2:e504a3cfe113 759 lcd.refresh();
el14dg 2:e504a3cfe113 760 }
el14dg 2:e504a3cfe113 761
el14dg 7:8ac5aee0c13e 762 void lcd_border()
el14dg 7:8ac5aee0c13e 763 {
el14dg 7:8ac5aee0c13e 764 lcd.drawRect(0,0,83,47,0);
el14dg 7:8ac5aee0c13e 765
el14dg 7:8ac5aee0c13e 766 lcd.drawRect(1,1,81,45,0);
el14dg 7:8ac5aee0c13e 767
el14dg 7:8ac5aee0c13e 768 }
el14dg 7:8ac5aee0c13e 769
el14dg 7:8ac5aee0c13e 770 void pin_text_box()
el14dg 7:8ac5aee0c13e 771 {
el14dg 9:a5614f53d435 772 if (g_current_state == 7) {
el14dg 9:a5614f53d435 773
el14dg 9:a5614f53d435 774 lcd.drawRect(1,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 775 lcd.drawRect(15,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 776 lcd.drawRect(29,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 777 lcd.drawRect(43,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 778 lcd.drawRect(57,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 779 lcd.drawRect(71,30,15,10,1); // filled box
el14dg 9:a5614f53d435 780
el14dg 9:a5614f53d435 781 }
el14dg 9:a5614f53d435 782
el14dg 9:a5614f53d435 783 else {
el14dg 9:a5614f53d435 784
el14dg 9:a5614f53d435 785 lcd.drawRect(1,30,15,10,1); // filled box
el14dg 9:a5614f53d435 786 lcd.drawRect(15,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 787 lcd.drawRect(29,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 788 lcd.drawRect(43,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 789 lcd.drawRect(57,30,15,10,0); // transparent box
el14dg 9:a5614f53d435 790 lcd.drawRect(71,30,15,10,1); // filled box
el14dg 9:a5614f53d435 791
el14dg 9:a5614f53d435 792 }
el14dg 9:a5614f53d435 793
el14dg 7:8ac5aee0c13e 794 }
el14dg 7:8ac5aee0c13e 795
el14dg 8:8a3d1c07bdec 796 void screen_progression()
el14dg 8:8a3d1c07bdec 797 {
el14dg 8:8a3d1c07bdec 798 if (g_current_state == 3) { // set new pin state
el14dg 8:8a3d1c07bdec 799
el14dg 8:8a3d1c07bdec 800 if (pin_counter > 3) { // if a four digit pin has been entered
el14dg 8:8a3d1c07bdec 801
el14dg 8:8a3d1c07bdec 802 change_pin(); // save entered_pin to the SD card
el14dg 8:8a3d1c07bdec 803
el14dg 8:8a3d1c07bdec 804 read_pin(); // read the pin from the SD card to the set_pin array
el14dg 8:8a3d1c07bdec 805
el14dg 8:8a3d1c07bdec 806 g_next_state = fsm[g_current_state].nextState[2];
el14dg 8:8a3d1c07bdec 807
el14dg 8:8a3d1c07bdec 808 }
el14dg 8:8a3d1c07bdec 809
el14dg 8:8a3d1c07bdec 810 else {
el14dg 8:8a3d1c07bdec 811
el14dg 8:8a3d1c07bdec 812 g_next_state = fsm[g_current_state].nextState[3];
el14dg 8:8a3d1c07bdec 813
el14dg 8:8a3d1c07bdec 814 }
el14dg 8:8a3d1c07bdec 815
el14dg 8:8a3d1c07bdec 816 }
el14dg 8:8a3d1c07bdec 817
el14dg 8:8a3d1c07bdec 818 else { // if the current state is either 2, 6 or 7
el14dg 8:8a3d1c07bdec 819
el14dg 8:8a3d1c07bdec 820 check_pin(); // sets incorrect_pin_flag to 1 if entered pin doesn't match set_pin
el14dg 8:8a3d1c07bdec 821
el14dg 8:8a3d1c07bdec 822 if (incorrect_pin_flag == 1) {
el14dg 8:8a3d1c07bdec 823
el14dg 8:8a3d1c07bdec 824 incorrect_pin_flag = 0;
el14dg 8:8a3d1c07bdec 825
el14dg 8:8a3d1c07bdec 826 g_next_state = fsm[g_current_state].nextState[3]; // go to previous state or alarm triggered state
el14dg 8:8a3d1c07bdec 827
el14dg 8:8a3d1c07bdec 828 pc.printf("g_next_state = %d\n",g_next_state);
el14dg 8:8a3d1c07bdec 829
el14dg 8:8a3d1c07bdec 830 }
el14dg 8:8a3d1c07bdec 831
el14dg 8:8a3d1c07bdec 832 else {
el14dg 8:8a3d1c07bdec 833
el14dg 8:8a3d1c07bdec 834 g_next_state = fsm[g_current_state].nextState[2]; // proceed
el14dg 8:8a3d1c07bdec 835
el14dg 8:8a3d1c07bdec 836 pc.printf("g_next_state = %d\n",g_next_state);
el14dg 8:8a3d1c07bdec 837
el14dg 8:8a3d1c07bdec 838 }
el14dg 8:8a3d1c07bdec 839
el14dg 8:8a3d1c07bdec 840 }
el14dg 8:8a3d1c07bdec 841
el14dg 8:8a3d1c07bdec 842 }
el14dg 8:8a3d1c07bdec 843
el14dg 2:e504a3cfe113 844 void screen_selection()
el14dg 2:e504a3cfe113 845 {
el14dg 6:dc1229224d8e 846
el14dg 6:dc1229224d8e 847 reset_entered_pin(); // re-set each element of the entered pin array to -1
el14dg 3:70a7b64fbd98 848
el14dg 3:70a7b64fbd98 849 if (g_next_state == 0) {
el14dg 2:e504a3cfe113 850
el14dg 2:e504a3cfe113 851 state_0_screen();
el14dg 2:e504a3cfe113 852
el14dg 2:e504a3cfe113 853 }
el14dg 3:70a7b64fbd98 854
el14dg 3:70a7b64fbd98 855 else if (g_next_state == 1) {
el14dg 2:e504a3cfe113 856
el14dg 2:e504a3cfe113 857 state_1_screen();
el14dg 2:e504a3cfe113 858
el14dg 2:e504a3cfe113 859 }
el14dg 2:e504a3cfe113 860
el14dg 3:70a7b64fbd98 861 else if (g_next_state == 2) {
el14dg 2:e504a3cfe113 862
el14dg 5:41cb88f47f42 863 state_2_screen();
el14dg 2:e504a3cfe113 864
el14dg 2:e504a3cfe113 865 }
el14dg 2:e504a3cfe113 866
el14dg 3:70a7b64fbd98 867 else if (g_next_state == 3) {
el14dg 2:e504a3cfe113 868
el14dg 3:70a7b64fbd98 869 state_3_screen();
el14dg 2:e504a3cfe113 870
el14dg 2:e504a3cfe113 871 }
el14dg 2:e504a3cfe113 872
el14dg 3:70a7b64fbd98 873 else if (g_next_state == 4) {
el14dg 2:e504a3cfe113 874
el14dg 2:e504a3cfe113 875 state_4_screen();
el14dg 2:e504a3cfe113 876
el14dg 2:e504a3cfe113 877 }
el14dg 2:e504a3cfe113 878
el14dg 3:70a7b64fbd98 879 else if (g_next_state == 5) {
el14dg 2:e504a3cfe113 880
el14dg 2:e504a3cfe113 881 state_5_screen();
el14dg 2:e504a3cfe113 882
el14dg 2:e504a3cfe113 883 }
el14dg 2:e504a3cfe113 884
el14dg 3:70a7b64fbd98 885 else if (g_next_state == 6) {
el14dg 2:e504a3cfe113 886
el14dg 5:41cb88f47f42 887 state_6_screen();
el14dg 2:e504a3cfe113 888
el14dg 2:e504a3cfe113 889 }
el14dg 2:e504a3cfe113 890
el14dg 3:70a7b64fbd98 891 else if (g_next_state == 7) {
el14dg 2:e504a3cfe113 892
el14dg 5:41cb88f47f42 893 state_7_screen();
el14dg 2:e504a3cfe113 894
el14dg 2:e504a3cfe113 895 }
el14dg 2:e504a3cfe113 896
el14dg 2:e504a3cfe113 897 else {
el14dg 2:e504a3cfe113 898
el14dg 2:e504a3cfe113 899 state_8_screen();
el14dg 2:e504a3cfe113 900
el14dg 2:e504a3cfe113 901 }
el14dg 6:dc1229224d8e 902
el14dg 2:e504a3cfe113 903 }
el14dg 3:70a7b64fbd98 904
el14dg 7:8ac5aee0c13e 905 // Screen Animation Functions
el14dg 7:8ac5aee0c13e 906
el14dg 7:8ac5aee0c13e 907 void setting_animation()
el14dg 7:8ac5aee0c13e 908 {
el14dg 7:8ac5aee0c13e 909 setting_alarm_counter = setting_alarm_counter + 5; // increment setting_alarm_counter in steps of five
el14dg 7:8ac5aee0c13e 910
el14dg 7:8ac5aee0c13e 911 if (setting_alarm_counter < 101) {
el14dg 7:8ac5aee0c13e 912
el14dg 7:8ac5aee0c13e 913 lcd.drawRect(0,20,setting_alarm_counter,5,1); // prints the loading bar to the LCD
el14dg 7:8ac5aee0c13e 914
el14dg 7:8ac5aee0c13e 915 // format how the percentage is displayed depending on its value
el14dg 7:8ac5aee0c13e 916 if (setting_alarm_counter < 10) {
el14dg 7:8ac5aee0c13e 917
el14dg 7:8ac5aee0c13e 918 length = sprintf(buffer,"0%d%%",setting_alarm_counter);
el14dg 7:8ac5aee0c13e 919
el14dg 7:8ac5aee0c13e 920 }
el14dg 7:8ac5aee0c13e 921
el14dg 7:8ac5aee0c13e 922 else {
el14dg 7:8ac5aee0c13e 923
el14dg 7:8ac5aee0c13e 924 length = sprintf(buffer,"%d%%",setting_alarm_counter);
el14dg 7:8ac5aee0c13e 925
el14dg 7:8ac5aee0c13e 926 }
el14dg 7:8ac5aee0c13e 927
el14dg 7:8ac5aee0c13e 928 if (length <= 14) { // if length of string will fit on the screen ( WIDTH = 6 * 24 = 84 pixels )
el14dg 7:8ac5aee0c13e 929
el14dg 7:8ac5aee0c13e 930 if (setting_alarm_counter < 100) {
el14dg 7:8ac5aee0c13e 931
el14dg 7:8ac5aee0c13e 932 lcd.printString(buffer,33,4);
el14dg 7:8ac5aee0c13e 933
el14dg 7:8ac5aee0c13e 934 }
el14dg 7:8ac5aee0c13e 935
el14dg 7:8ac5aee0c13e 936 else {
el14dg 7:8ac5aee0c13e 937
el14dg 7:8ac5aee0c13e 938 lcd.printString(buffer,30,4); // this string is four characters long and is therefore shifted to the left of the screen
el14dg 7:8ac5aee0c13e 939
el14dg 7:8ac5aee0c13e 940 }
el14dg 7:8ac5aee0c13e 941
el14dg 7:8ac5aee0c13e 942 }
el14dg 7:8ac5aee0c13e 943
el14dg 7:8ac5aee0c13e 944 lcd.refresh(); // refresh screen
el14dg 7:8ac5aee0c13e 945
el14dg 7:8ac5aee0c13e 946 }
el14dg 7:8ac5aee0c13e 947 }
el14dg 7:8ac5aee0c13e 948
el14dg 7:8ac5aee0c13e 949 void timeout_protocol()
el14dg 7:8ac5aee0c13e 950 {
el14dg 7:8ac5aee0c13e 951
el14dg 7:8ac5aee0c13e 952 pin_timeout_counter++;
el14dg 7:8ac5aee0c13e 953
el14dg 7:8ac5aee0c13e 954 seconds_till_timeout = 21 - pin_timeout_counter; // timeout counts down from 20
el14dg 7:8ac5aee0c13e 955
el14dg 7:8ac5aee0c13e 956 if (seconds_till_timeout == 0) { // if 20 seconds passes
el14dg 7:8ac5aee0c13e 957
el14dg 7:8ac5aee0c13e 958 g_next_state = 8;
el14dg 7:8ac5aee0c13e 959
el14dg 7:8ac5aee0c13e 960 pin_timeout_counter = 0;
el14dg 7:8ac5aee0c13e 961
el14dg 7:8ac5aee0c13e 962 }
el14dg 7:8ac5aee0c13e 963
el14dg 7:8ac5aee0c13e 964 else { // less than 20 seconds has passed
el14dg 7:8ac5aee0c13e 965
el14dg 7:8ac5aee0c13e 966 // These if statements manage the formatting of the number of seconds remaining
el14dg 7:8ac5aee0c13e 967
el14dg 7:8ac5aee0c13e 968 if (seconds_till_timeout >= 10) {
el14dg 7:8ac5aee0c13e 969
el14dg 7:8ac5aee0c13e 970 length = sprintf(buffer,"%d",seconds_till_timeout);
el14dg 7:8ac5aee0c13e 971
el14dg 7:8ac5aee0c13e 972 }
el14dg 7:8ac5aee0c13e 973
el14dg 7:8ac5aee0c13e 974 else {
el14dg 7:8ac5aee0c13e 975
el14dg 7:8ac5aee0c13e 976 length = sprintf(buffer,"0%d",seconds_till_timeout);
el14dg 7:8ac5aee0c13e 977
el14dg 7:8ac5aee0c13e 978 }
el14dg 7:8ac5aee0c13e 979
el14dg 7:8ac5aee0c13e 980 // if the length of the formatted string will fit on the screen print it ( WIDTH = 14 * 6 = 84 pixels )
el14dg 7:8ac5aee0c13e 981
el14dg 7:8ac5aee0c13e 982 if (length <= 14)
el14dg 7:8ac5aee0c13e 983 lcd.printString(buffer,3,4);
el14dg 7:8ac5aee0c13e 984
el14dg 7:8ac5aee0c13e 985 lcd.refresh();
el14dg 7:8ac5aee0c13e 986
el14dg 7:8ac5aee0c13e 987 }
el14dg 7:8ac5aee0c13e 988
el14dg 7:8ac5aee0c13e 989 }
el14dg 7:8ac5aee0c13e 990
el14dg 7:8ac5aee0c13e 991 // Read Distance Functions
el14dg 7:8ac5aee0c13e 992
el14dg 7:8ac5aee0c13e 993 void get_setting_distance()
el14dg 7:8ac5aee0c13e 994 {
el14dg 7:8ac5aee0c13e 995 distance[setting_distance_counter] = srf02.getDistanceCm(); // distance array stores 10 distance readings
el14dg 7:8ac5aee0c13e 996
el14dg 7:8ac5aee0c13e 997 setting_distance_counter++;
el14dg 7:8ac5aee0c13e 998
el14dg 7:8ac5aee0c13e 999 if (setting_distance_counter == 10) { // if distance array has 10 new readings (arrays are zero indexed)
el14dg 7:8ac5aee0c13e 1000
el14dg 7:8ac5aee0c13e 1001 setting_distance.detach();
el14dg 7:8ac5aee0c13e 1002
el14dg 7:8ac5aee0c13e 1003 calculate_setting_distance(); // find the average of the 10 distance readings
el14dg 7:8ac5aee0c13e 1004
el14dg 7:8ac5aee0c13e 1005 }
el14dg 7:8ac5aee0c13e 1006
el14dg 7:8ac5aee0c13e 1007 }
el14dg 7:8ac5aee0c13e 1008
el14dg 7:8ac5aee0c13e 1009 void get_intruder_distance()
el14dg 7:8ac5aee0c13e 1010 {
el14dg 7:8ac5aee0c13e 1011
el14dg 7:8ac5aee0c13e 1012 distance[intruder_distance_counter] = srf02.getDistanceCm(); // distance array stores 10 distance readings
el14dg 7:8ac5aee0c13e 1013
el14dg 7:8ac5aee0c13e 1014 intruder_distance_counter++;
el14dg 7:8ac5aee0c13e 1015
el14dg 7:8ac5aee0c13e 1016 if (intruder_distance_counter == 10) { // if distance array has 10 new readings (arrays are zero indexed)
el14dg 7:8ac5aee0c13e 1017
el14dg 7:8ac5aee0c13e 1018 intruder_distance.detach();
el14dg 7:8ac5aee0c13e 1019
el14dg 7:8ac5aee0c13e 1020 calculate_intruder_distance(); // find the average of the 10 distance readings
el14dg 7:8ac5aee0c13e 1021
el14dg 7:8ac5aee0c13e 1022 }
el14dg 7:8ac5aee0c13e 1023
el14dg 7:8ac5aee0c13e 1024 }
el14dg 7:8ac5aee0c13e 1025
el14dg 7:8ac5aee0c13e 1026 void calculate_setting_distance()
el14dg 7:8ac5aee0c13e 1027 {
el14dg 7:8ac5aee0c13e 1028
el14dg 7:8ac5aee0c13e 1029 for (int i = 0; i < 10; i++) {
el14dg 7:8ac5aee0c13e 1030
el14dg 7:8ac5aee0c13e 1031 one_second_distance = one_second_distance + distance[i]; // add all 10 readings together
el14dg 7:8ac5aee0c13e 1032
el14dg 7:8ac5aee0c13e 1033 }
el14dg 7:8ac5aee0c13e 1034
el14dg 7:8ac5aee0c13e 1035 initial_setting_distance = (one_second_distance / 10);
el14dg 7:8ac5aee0c13e 1036
el14dg 7:8ac5aee0c13e 1037 pc.printf("Initial Setting Distance = %.2f cm\n",initial_setting_distance);
el14dg 7:8ac5aee0c13e 1038
el14dg 7:8ac5aee0c13e 1039 setting_distance_counter = 0;
el14dg 7:8ac5aee0c13e 1040
el14dg 7:8ac5aee0c13e 1041 one_second_distance = 0;
el14dg 7:8ac5aee0c13e 1042
el14dg 7:8ac5aee0c13e 1043 transition.attach(&screen_5_transition,5); // transition to the set screen in five seconds
el14dg 7:8ac5aee0c13e 1044
el14dg 7:8ac5aee0c13e 1045 }
el14dg 7:8ac5aee0c13e 1046
el14dg 7:8ac5aee0c13e 1047 void calculate_intruder_distance()
el14dg 7:8ac5aee0c13e 1048 {
el14dg 7:8ac5aee0c13e 1049
el14dg 7:8ac5aee0c13e 1050 for (int i = 0; i < 10; i++) {
el14dg 7:8ac5aee0c13e 1051
el14dg 7:8ac5aee0c13e 1052 one_second_distance = one_second_distance + distance[i]; // add all 10 distance readings together
el14dg 7:8ac5aee0c13e 1053
el14dg 7:8ac5aee0c13e 1054 }
el14dg 7:8ac5aee0c13e 1055
el14dg 7:8ac5aee0c13e 1056 one_second_avg_distance = one_second_distance / 10;
el14dg 7:8ac5aee0c13e 1057
el14dg 7:8ac5aee0c13e 1058 pc.printf("Intruder Distance = %.2f cm\n",one_second_avg_distance);
el14dg 7:8ac5aee0c13e 1059
el14dg 7:8ac5aee0c13e 1060 intruder_distance_counter = 0;
el14dg 7:8ac5aee0c13e 1061
el14dg 7:8ac5aee0c13e 1062 one_second_distance = 0;
el14dg 7:8ac5aee0c13e 1063
el14dg 7:8ac5aee0c13e 1064
el14dg 7:8ac5aee0c13e 1065 if (one_second_avg_distance > (1.1*initial_setting_distance)) { // if the current average distance is 10% greater than the initial_setting_distance set off the alarm
el14dg 7:8ac5aee0c13e 1066
el14dg 7:8ac5aee0c13e 1067 g_next_state = 7;
el14dg 7:8ac5aee0c13e 1068
el14dg 7:8ac5aee0c13e 1069 g_current_state = 7;
el14dg 7:8ac5aee0c13e 1070
el14dg 7:8ac5aee0c13e 1071 screen_selection();
el14dg 7:8ac5aee0c13e 1072
el14dg 7:8ac5aee0c13e 1073 }
el14dg 7:8ac5aee0c13e 1074
el14dg 7:8ac5aee0c13e 1075 else if (one_second_avg_distance < (0.9 * initial_setting_distance)) { // if the current average distance is 10% smaller than the initial_setting_distance set off the alarm
el14dg 7:8ac5aee0c13e 1076
el14dg 7:8ac5aee0c13e 1077 g_next_state = 7;
el14dg 7:8ac5aee0c13e 1078
el14dg 7:8ac5aee0c13e 1079 g_current_state = 7;
el14dg 7:8ac5aee0c13e 1080
el14dg 7:8ac5aee0c13e 1081 screen_selection();
el14dg 7:8ac5aee0c13e 1082
el14dg 7:8ac5aee0c13e 1083 }
el14dg 7:8ac5aee0c13e 1084
el14dg 7:8ac5aee0c13e 1085 else { // if the current distance is within 10% of the initial_setting_distance carry on reading distance
el14dg 7:8ac5aee0c13e 1086
el14dg 7:8ac5aee0c13e 1087 intruder_distance.attach(&intruder_distance_isr,0.1);
el14dg 7:8ac5aee0c13e 1088
el14dg 7:8ac5aee0c13e 1089 }
el14dg 8:8a3d1c07bdec 1090
el14dg 7:8ac5aee0c13e 1091 }
el14dg 7:8ac5aee0c13e 1092
el14dg 7:8ac5aee0c13e 1093 // Timeout Functions
el14dg 7:8ac5aee0c13e 1094
el14dg 3:70a7b64fbd98 1095 void screen_5_transition()
el14dg 3:70a7b64fbd98 1096 {
el14dg 4:9cac024c057c 1097 g_next_state = 5;
el14dg 8:8a3d1c07bdec 1098
el14dg 8:8a3d1c07bdec 1099 accelerometer.detach();
el14dg 6:dc1229224d8e 1100
el14dg 6:dc1229224d8e 1101 screen_selection(); // sets the LCD to screen 5
el14dg 3:70a7b64fbd98 1102
el14dg 3:70a7b64fbd98 1103 g_current_state = 5;
el14dg 6:dc1229224d8e 1104
el14dg 3:70a7b64fbd98 1105 }
el14dg 3:70a7b64fbd98 1106
el14dg 6:dc1229224d8e 1107 void pin_confirm()
el14dg 6:dc1229224d8e 1108 {
el14dg 6:dc1229224d8e 1109 lcd.clear();
el14dg 6:dc1229224d8e 1110
el14dg 6:dc1229224d8e 1111 lcd_border();
el14dg 6:dc1229224d8e 1112
el14dg 6:dc1229224d8e 1113 lcd.printString("Press C",24,1);
el14dg 6:dc1229224d8e 1114
el14dg 6:dc1229224d8e 1115 lcd.printString("to",36,2);
el14dg 6:dc1229224d8e 1116
el14dg 6:dc1229224d8e 1117 lcd.printString("Confirm",24,3);
el14dg 8:8a3d1c07bdec 1118
el14dg 7:8ac5aee0c13e 1119 if (g_current_state == 7) {
el14dg 8:8a3d1c07bdec 1120
el14dg 7:8ac5aee0c13e 1121 lcd.drawRect(1,30,15,10,0);
el14dg 8:8a3d1c07bdec 1122
el14dg 8:8a3d1c07bdec 1123 }
el14dg 6:dc1229224d8e 1124
el14dg 6:dc1229224d8e 1125 lcd.refresh();
el14dg 6:dc1229224d8e 1126
el14dg 6:dc1229224d8e 1127 }
el14dg 5:41cb88f47f42 1128
el14dg 9:a5614f53d435 1129 void state_1_transition()
el14dg 8:8a3d1c07bdec 1130 {
el14dg 8:8a3d1c07bdec 1131 g_next_state = 1;
el14dg 8:8a3d1c07bdec 1132
el14dg 8:8a3d1c07bdec 1133 screen_selection();
el14dg 8:8a3d1c07bdec 1134
el14dg 8:8a3d1c07bdec 1135 g_current_state = 1;
el14dg 9:a5614f53d435 1136
el14dg 9:a5614f53d435 1137 alerts.detach();
el14dg 8:8a3d1c07bdec 1138
el14dg 8:8a3d1c07bdec 1139 }
el14dg 8:8a3d1c07bdec 1140
el14dg 8:8a3d1c07bdec 1141 void alarm_setting_buzz()
el14dg 8:8a3d1c07bdec 1142 {
el14dg 8:8a3d1c07bdec 1143
el14dg 8:8a3d1c07bdec 1144 buzzer.write(0.0); // turn off buzzer
el14dg 8:8a3d1c07bdec 1145
el14dg 8:8a3d1c07bdec 1146 }
el14dg 8:8a3d1c07bdec 1147
el14dg 8:8a3d1c07bdec 1148 // Accelerometer Function
el14dg 8:8a3d1c07bdec 1149
el14dg 8:8a3d1c07bdec 1150 void get_axis_data()
el14dg 8:8a3d1c07bdec 1151 {
el14dg 8:8a3d1c07bdec 1152
el14dg 8:8a3d1c07bdec 1153 acc.getX(acc_X);
el14dg 8:8a3d1c07bdec 1154 acc.getY(acc_Y);
el14dg 8:8a3d1c07bdec 1155 acc.getZ(acc_Z);
el14dg 8:8a3d1c07bdec 1156
el14dg 8:8a3d1c07bdec 1157 }
el14dg 8:8a3d1c07bdec 1158
el14dg 8:8a3d1c07bdec 1159 void compare_axis_data()
el14dg 8:8a3d1c07bdec 1160 {
el14dg 8:8a3d1c07bdec 1161 get_axis_data();
el14dg 8:8a3d1c07bdec 1162
el14dg 8:8a3d1c07bdec 1163 pc.printf("X1 = %.4f \nY1 = %.4f \nZ1 = %.4f \n",acc_X,acc_Y,acc_Z);
el14dg 8:8a3d1c07bdec 1164
el14dg 9:a5614f53d435 1165 if (abs(acc_X) < 0.2f*abs(setting_acc_X)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1166
el14dg 8:8a3d1c07bdec 1167 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1168
el14dg 8:8a3d1c07bdec 1169 pc.printf("acc_X < setting_acc_X\n");
el14dg 8:8a3d1c07bdec 1170
el14dg 8:8a3d1c07bdec 1171 }
el14dg 8:8a3d1c07bdec 1172
el14dg 9:a5614f53d435 1173 else if (abs(acc_X) > 5.0f*abs(setting_acc_X)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1174
el14dg 8:8a3d1c07bdec 1175 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1176
el14dg 8:8a3d1c07bdec 1177 pc.printf("acc_X > setting_acc_X\n");
el14dg 8:8a3d1c07bdec 1178
el14dg 8:8a3d1c07bdec 1179 }
el14dg 8:8a3d1c07bdec 1180
el14dg 9:a5614f53d435 1181 else if (abs(acc_Y) < 0.2f*abs(setting_acc_Y)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1182
el14dg 8:8a3d1c07bdec 1183 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1184
el14dg 8:8a3d1c07bdec 1185 pc.printf("acc_Y < setting_acc_Y\n");
el14dg 8:8a3d1c07bdec 1186
el14dg 8:8a3d1c07bdec 1187 }
el14dg 8:8a3d1c07bdec 1188
el14dg 9:a5614f53d435 1189 else if (abs(acc_Y) > 5.0f*abs(setting_acc_Y)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1190
el14dg 8:8a3d1c07bdec 1191 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1192
el14dg 8:8a3d1c07bdec 1193 pc.printf("acc_Y > setting_acc_Y\n");
el14dg 8:8a3d1c07bdec 1194
el14dg 8:8a3d1c07bdec 1195 }
el14dg 8:8a3d1c07bdec 1196
el14dg 9:a5614f53d435 1197 else if (abs(acc_Z) < 0.2f*abs(setting_acc_Z)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1198
el14dg 8:8a3d1c07bdec 1199 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1200
el14dg 8:8a3d1c07bdec 1201 pc.printf("acc_Z < setting_acc_Z\n");
el14dg 8:8a3d1c07bdec 1202
el14dg 8:8a3d1c07bdec 1203 }
el14dg 8:8a3d1c07bdec 1204
el14dg 9:a5614f53d435 1205 else if (abs(acc_Z) > 5.0f*abs(setting_acc_Z)) { // Uses abs() due to possibility of axis dat being negative
el14dg 8:8a3d1c07bdec 1206
el14dg 8:8a3d1c07bdec 1207 device_tampered_protocol();
el14dg 8:8a3d1c07bdec 1208
el14dg 8:8a3d1c07bdec 1209 pc.printf("acc_Z > setting_acc_Z\n");
el14dg 8:8a3d1c07bdec 1210
el14dg 8:8a3d1c07bdec 1211 }
el14dg 8:8a3d1c07bdec 1212
el14dg 8:8a3d1c07bdec 1213 else {
el14dg 8:8a3d1c07bdec 1214
el14dg 9:a5614f53d435 1215 // Do nothing
el14dg 9:a5614f53d435 1216
el14dg 8:8a3d1c07bdec 1217 }
el14dg 8:8a3d1c07bdec 1218
el14dg 8:8a3d1c07bdec 1219 }
el14dg 8:8a3d1c07bdec 1220
el14dg 8:8a3d1c07bdec 1221 void device_tampered_protocol()
el14dg 8:8a3d1c07bdec 1222 {
el14dg 9:a5614f53d435 1223 setting_distance.detach(); // stop reading distance
el14dg 8:8a3d1c07bdec 1224
el14dg 9:a5614f53d435 1225 setting_screen.detach(); // stop setting screen animation
el14dg 8:8a3d1c07bdec 1226
el14dg 9:a5614f53d435 1227 accelerometer.detach(); // stop taking readings from the accelerometer
el14dg 8:8a3d1c07bdec 1228
el14dg 9:a5614f53d435 1229 transition.detach(); // cancel scheduled transition to state 5
el14dg 9:a5614f53d435 1230
el14dg 9:a5614f53d435 1231 alerts.detach(); // turn off LED and Buzzer
el14dg 8:8a3d1c07bdec 1232
el14dg 8:8a3d1c07bdec 1233 lcd.clear();
el14dg 8:8a3d1c07bdec 1234
el14dg 8:8a3d1c07bdec 1235 lcd.printString("DEVICE MOVED",6,1);
el14dg 8:8a3d1c07bdec 1236
el14dg 8:8a3d1c07bdec 1237 lcd.printString("SETTING",21,3);
el14dg 8:8a3d1c07bdec 1238
el14dg 8:8a3d1c07bdec 1239 lcd.printString("INCOMPLETE",12,4);
el14dg 8:8a3d1c07bdec 1240
el14dg 8:8a3d1c07bdec 1241 lcd_border();
el14dg 8:8a3d1c07bdec 1242
el14dg 8:8a3d1c07bdec 1243 lcd.refresh();
el14dg 9:a5614f53d435 1244
el14dg 9:a5614f53d435 1245 alerts.attach(&led_buzzer_isr,0.35);
el14dg 9:a5614f53d435 1246
el14dg 9:a5614f53d435 1247 tamper_transition.attach(&state_1_transition,3); // transition to state 1 due to the device been tampered with whilst setting
el14dg 8:8a3d1c07bdec 1248
el14dg 8:8a3d1c07bdec 1249 }
el14dg 8:8a3d1c07bdec 1250
el14dg 8:8a3d1c07bdec 1251 // Pin Functions
el14dg 8:8a3d1c07bdec 1252
el14dg 4:9cac024c057c 1253 void enter_pin()
el14dg 4:9cac024c057c 1254 {
el14dg 6:dc1229224d8e 1255
el14dg 6:dc1229224d8e 1256 // current value of the pin_counter determines where '*' is printed
el14dg 6:dc1229224d8e 1257
el14dg 4:9cac024c057c 1258 if (pin_counter == 1) {
el14dg 6:dc1229224d8e 1259
el14dg 5:41cb88f47f42 1260 lcd.printString("*",20,4);
el14dg 6:dc1229224d8e 1261
el14dg 4:9cac024c057c 1262 }
el14dg 6:dc1229224d8e 1263
el14dg 4:9cac024c057c 1264 else if (pin_counter == 2) {
el14dg 6:dc1229224d8e 1265
el14dg 4:9cac024c057c 1266 lcd.printString("*",34,4);
el14dg 6:dc1229224d8e 1267
el14dg 4:9cac024c057c 1268 }
el14dg 6:dc1229224d8e 1269
el14dg 4:9cac024c057c 1270 else if (pin_counter == 3) {
el14dg 6:dc1229224d8e 1271
el14dg 5:41cb88f47f42 1272 lcd.printString("*",48,4);
el14dg 6:dc1229224d8e 1273
el14dg 4:9cac024c057c 1274 }
el14dg 6:dc1229224d8e 1275
el14dg 4:9cac024c057c 1276 else if (pin_counter == 4) {
el14dg 6:dc1229224d8e 1277
el14dg 5:41cb88f47f42 1278 lcd.printString("*",62,4);
el14dg 6:dc1229224d8e 1279
el14dg 6:dc1229224d8e 1280 confirm.attach(&pin_confirm,0.5); // 'Press C to Confirm' screen
el14dg 6:dc1229224d8e 1281
el14dg 6:dc1229224d8e 1282 }
el14dg 6:dc1229224d8e 1283
el14dg 6:dc1229224d8e 1284 }
el14dg 4:9cac024c057c 1285
el14dg 7:8ac5aee0c13e 1286 void reset_entered_pin()
el14dg 7:8ac5aee0c13e 1287 {
el14dg 7:8ac5aee0c13e 1288 for (int i = 0; i < 4; i++) {
el14dg 7:8ac5aee0c13e 1289
el14dg 9:a5614f53d435 1290 entered_pin[i] = -1; // sets each element of entered_pin to -1
el14dg 7:8ac5aee0c13e 1291
el14dg 7:8ac5aee0c13e 1292 }
el14dg 7:8ac5aee0c13e 1293
el14dg 7:8ac5aee0c13e 1294 pin_counter = 0;
el14dg 7:8ac5aee0c13e 1295
el14dg 7:8ac5aee0c13e 1296 }
el14dg 7:8ac5aee0c13e 1297
el14dg 4:9cac024c057c 1298 void check_pin()
el14dg 4:9cac024c057c 1299 {
el14dg 4:9cac024c057c 1300 for (int i = 0; i < 4; i++) {
el14dg 6:dc1229224d8e 1301
el14dg 6:dc1229224d8e 1302 if (entered_pin[i] != set_pin[i]) { // if any element of entered_pin doesn't match set_pin
el14dg 6:dc1229224d8e 1303
el14dg 4:9cac024c057c 1304 pc.printf("entered pin doesn't match set pin...");
el14dg 6:dc1229224d8e 1305
el14dg 4:9cac024c057c 1306 incorrect_pin_flag = 1;
el14dg 6:dc1229224d8e 1307
el14dg 4:9cac024c057c 1308 break;
el14dg 6:dc1229224d8e 1309
el14dg 4:9cac024c057c 1310 }
el14dg 6:dc1229224d8e 1311
el14dg 4:9cac024c057c 1312 }
el14dg 6:dc1229224d8e 1313
el14dg 5:41cb88f47f42 1314 }
el14dg 5:41cb88f47f42 1315
el14dg 3:70a7b64fbd98 1316 void change_pin()
el14dg 3:70a7b64fbd98 1317 {
el14dg 3:70a7b64fbd98 1318 delete_file("/sd/test.txt");
el14dg 3:70a7b64fbd98 1319
el14dg 3:70a7b64fbd98 1320 pin = fopen("/sd/test.txt", "a");
el14dg 3:70a7b64fbd98 1321
el14dg 3:70a7b64fbd98 1322 if (pin == NULL) { // if it can't open the file then print error message
el14dg 3:70a7b64fbd98 1323
el14dg 3:70a7b64fbd98 1324 pc.printf("Error! Unable to open file!\n");
el14dg 3:70a7b64fbd98 1325
el14dg 3:70a7b64fbd98 1326 }
el14dg 3:70a7b64fbd98 1327
el14dg 3:70a7b64fbd98 1328 else {
el14dg 3:70a7b64fbd98 1329
el14dg 4:9cac024c057c 1330 pc.printf("Writing to file....\n");
el14dg 3:70a7b64fbd98 1331
el14dg 3:70a7b64fbd98 1332 for(int i = 0; i < 4; i++) {
el14dg 3:70a7b64fbd98 1333
el14dg 6:dc1229224d8e 1334 int pin_element = entered_pin[i];; // pin_element takes on the value of each element in the entered_pin array
el14dg 3:70a7b64fbd98 1335
el14dg 6:dc1229224d8e 1336 fprintf(pin, "%d,%d\n",i,pin_element); // pin element is printed to SD card file (CSV)
el14dg 3:70a7b64fbd98 1337 }
el14dg 3:70a7b64fbd98 1338
el14dg 3:70a7b64fbd98 1339 for(int i = 0; i < 4; i++) {
el14dg 3:70a7b64fbd98 1340
el14dg 6:dc1229224d8e 1341 pc.printf("[%d] %d\n",i,entered_pin[i]); // print to PC for debugging purposes
el14dg 3:70a7b64fbd98 1342 }
el14dg 3:70a7b64fbd98 1343
el14dg 3:70a7b64fbd98 1344 pc.printf("Done.\n");
el14dg 3:70a7b64fbd98 1345
el14dg 6:dc1229224d8e 1346 fclose(pin); // close the file after writing
el14dg 3:70a7b64fbd98 1347
el14dg 3:70a7b64fbd98 1348 }
el14dg 3:70a7b64fbd98 1349
el14dg 3:70a7b64fbd98 1350 }
el14dg 3:70a7b64fbd98 1351
el14dg 3:70a7b64fbd98 1352 void read_pin()
el14dg 3:70a7b64fbd98 1353 {
el14dg 3:70a7b64fbd98 1354 pin = fopen("/sd/test.txt", "r");
el14dg 6:dc1229224d8e 1355
el14dg 3:70a7b64fbd98 1356 int i = 0;
el14dg 3:70a7b64fbd98 1357
el14dg 3:70a7b64fbd98 1358 pc.printf("Reading into set_pin array...\n");
el14dg 3:70a7b64fbd98 1359
el14dg 6:dc1229224d8e 1360 while (fscanf(pin, "%d,%d",&index_array[i],&set_pin[i]) != EOF) { // EOF ---> End of File
el14dg 3:70a7b64fbd98 1361 i++; // read data into array and increment index
el14dg 3:70a7b64fbd98 1362 }
el14dg 3:70a7b64fbd98 1363
el14dg 6:dc1229224d8e 1364 fclose(pin); // close the file after reading
el14dg 3:70a7b64fbd98 1365
el14dg 3:70a7b64fbd98 1366 for(int i = 0; i < 4 ; i++) {
el14dg 3:70a7b64fbd98 1367
el14dg 6:dc1229224d8e 1368 pc.printf("[%d] %d\n",i,set_pin[i]); // print to PC for debugging purposes
el14dg 3:70a7b64fbd98 1369
el14dg 3:70a7b64fbd98 1370 }
el14dg 6:dc1229224d8e 1371
el14dg 3:70a7b64fbd98 1372 pc.printf("Done.\n");
el14dg 6:dc1229224d8e 1373
el14dg 3:70a7b64fbd98 1374 }
el14dg 6:dc1229224d8e 1375
el14dg 3:70a7b64fbd98 1376 void delete_file(char filename[])
el14dg 3:70a7b64fbd98 1377 {
el14dg 3:70a7b64fbd98 1378 pc.printf("Deleting file '%s'...",filename);
el14dg 6:dc1229224d8e 1379
el14dg 3:70a7b64fbd98 1380 FILE *fp = fopen(filename, "r"); // try and open file
el14dg 6:dc1229224d8e 1381
el14dg 3:70a7b64fbd98 1382 if (fp != NULL) { // if it does open...
el14dg 6:dc1229224d8e 1383
el14dg 3:70a7b64fbd98 1384 fclose(fp); // close it
el14dg 6:dc1229224d8e 1385
el14dg 6:dc1229224d8e 1386 remove(filename); // delete the file
el14dg 6:dc1229224d8e 1387
el14dg 3:70a7b64fbd98 1388 pc.printf("Done!\n");
el14dg 6:dc1229224d8e 1389
el14dg 3:70a7b64fbd98 1390 }
el14dg 6:dc1229224d8e 1391
el14dg 6:dc1229224d8e 1392 // if it can't be opened, it doesn't exist and can't be deleted
el14dg 6:dc1229224d8e 1393
el14dg 6:dc1229224d8e 1394 }