Mobile Security System - Revision 1.0

Dependencies:   FXOS8700Q N5110 SDFileSystem SRF02 mbed

Committer:
el14dg
Date:
Tue May 03 09:51:02 2016 +0000
Revision:
8:8a3d1c07bdec
Parent:
7:8ac5aee0c13e
Child:
9:a5614f53d435
accelerometer functionality implemented and updated doxygen documentation.

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