Mobile Security System - Revision 1.0

Dependencies:   FXOS8700Q N5110 SDFileSystem SRF02 mbed

Committer:
el14dg
Date:
Mon May 02 13:47:17 2016 +0000
Revision:
6:dc1229224d8e
Parent:
5:41cb88f47f42
Child:
7:8ac5aee0c13e
Project almost completed.; ; - try to add accelerometer functionality; - investigate whether the Real Time Clock can be accessed

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