This is a simplified version of home alarm system for CE323/CE860 (Advanced Embedded Systems Design) in the University of Essex.

Dependencies:   TextLCD mbed

Committer:
liruihao2008
Date:
Fri Feb 17 17:13:43 2017 +0000
Revision:
0:df2226ca976c
This is a simplified version for home alarm system in the University of Essex.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liruihao2008 0:df2226ca976c 1 /*=============================================================================
liruihao2008 0:df2226ca976c 2 Copyright University of Essex 2017
liruihao2008 0:df2226ca976c 3 Author: Ruihao Li
liruihao2008 0:df2226ca976c 4
liruihao2008 0:df2226ca976c 5 FILE - main.c
liruihao2008 0:df2226ca976c 6 mbed LPC1768 application.
liruihao2008 0:df2226ca976c 7
liruihao2008 0:df2226ca976c 8 DESCRIPTION
liruihao2008 0:df2226ca976c 9 alarm 1 laboratory solution.
liruihao2008 0:df2226ca976c 10 hardware: mbed LPC1768, an extension board.
liruihao2008 0:df2226ca976c 11 Use a terminal program such as 'HyperTerminal' to communicate with the application.
liruihao2008 0:df2226ca976c 12 The serial port configuration is shown below.
liruihao2008 0:df2226ca976c 13 9600 Baud
liruihao2008 0:df2226ca976c 14 8 data bits
liruihao2008 0:df2226ca976c 15 No parity bits
liruihao2008 0:df2226ca976c 16 One stop bit
liruihao2008 0:df2226ca976c 17 No hardware flow control
liruihao2008 0:df2226ca976c 18 ==============================================================================*/
liruihao2008 0:df2226ca976c 19
liruihao2008 0:df2226ca976c 20
liruihao2008 0:df2226ca976c 21 /******************************************************************************
liruihao2008 0:df2226ca976c 22 Include head files.
liruihao2008 0:df2226ca976c 23 ******************************************************************************/
liruihao2008 0:df2226ca976c 24 #include "mbed.h"
liruihao2008 0:df2226ca976c 25 #include "TextLCD.h"
liruihao2008 0:df2226ca976c 26
liruihao2008 0:df2226ca976c 27 // TextLCD
liruihao2008 0:df2226ca976c 28 TextLCD lcd(p15, p16, p17, p18, p19, p20);//, TextLCD::LCD20x4); // rs, e, d4-d7
liruihao2008 0:df2226ca976c 29
liruihao2008 0:df2226ca976c 30 // Read from switches and keypad
liruihao2008 0:df2226ca976c 31 BusOut rows(p26,p25,p24);
liruihao2008 0:df2226ca976c 32 BusIn cols(p14,p13,p12,p11);
liruihao2008 0:df2226ca976c 33
liruihao2008 0:df2226ca976c 34 // Control external LEDs
liruihao2008 0:df2226ca976c 35 SPI sw(p5, p6, p7);
liruihao2008 0:df2226ca976c 36 DigitalOut cs(p8);
liruihao2008 0:df2226ca976c 37
liruihao2008 0:df2226ca976c 38 // Serial USB
liruihao2008 0:df2226ca976c 39 Serial pc(USBTX, USBRX); // tx, rx
liruihao2008 0:df2226ca976c 40
liruihao2008 0:df2226ca976c 41 // Temperature reading
liruihao2008 0:df2226ca976c 42 I2C i2c(p9, p10); // I2C: SDA, SCL
liruihao2008 0:df2226ca976c 43
liruihao2008 0:df2226ca976c 44 DigitalOut Sounder(LED1);
liruihao2008 0:df2226ca976c 45 DigitalOut led4(LED4);
liruihao2008 0:df2226ca976c 46
liruihao2008 0:df2226ca976c 47 /******************************************************************************
liruihao2008 0:df2226ca976c 48 Declaration of functions.
liruihao2008 0:df2226ca976c 49 ******************************************************************************/
liruihao2008 0:df2226ca976c 50 void alarmConfig(void);
liruihao2008 0:df2226ca976c 51 void alarm_state();
liruihao2008 0:df2226ca976c 52
liruihao2008 0:df2226ca976c 53 int read_switch(void);
liruihao2008 0:df2226ca976c 54 int switchleds(void);
liruihao2008 0:df2226ca976c 55 void initleds();
liruihao2008 0:df2226ca976c 56 void setleds(int ledall);
liruihao2008 0:df2226ca976c 57 void setled(int ledno, int ledstate);
liruihao2008 0:df2226ca976c 58 int readled(int ledno);
liruihao2008 0:df2226ca976c 59 int readleds();
liruihao2008 0:df2226ca976c 60
liruihao2008 0:df2226ca976c 61 char getKey();
liruihao2008 0:df2226ca976c 62 void setKey(void);
liruihao2008 0:df2226ca976c 63 int testCode(void);
liruihao2008 0:df2226ca976c 64
liruihao2008 0:df2226ca976c 65 void sounder_blink();
liruihao2008 0:df2226ca976c 66 void pattern(void);
liruihao2008 0:df2226ca976c 67 void patternoff(void);
liruihao2008 0:df2226ca976c 68 void Sounderoff(void);
liruihao2008 0:df2226ca976c 69
liruihao2008 0:df2226ca976c 70 void system_alarm(void);
liruihao2008 0:df2226ca976c 71 void system_set(void);
liruihao2008 0:df2226ca976c 72
liruihao2008 0:df2226ca976c 73 /******************************************************************************
liruihao2008 0:df2226ca976c 74 Global variables.
liruihao2008 0:df2226ca976c 75 ******************************************************************************/
liruihao2008 0:df2226ca976c 76 enum State {unset, exits, set, entry, alarm, report} state;
liruihao2008 0:df2226ca976c 77 char Keytable[] = { 'F', 'E', 'D', 'C',
liruihao2008 0:df2226ca976c 78 '3', '6', '9', 'B',
liruihao2008 0:df2226ca976c 79 '2', '5', '8', '0',
liruihao2008 0:df2226ca976c 80 '1', '4', '7', 'A'
liruihao2008 0:df2226ca976c 81 };
liruihao2008 0:df2226ca976c 82 char keyCode[] = {'1','2','3','4'};
liruihao2008 0:df2226ca976c 83 char code[4];
liruihao2008 0:df2226ca976c 84 int fail = 0; // number of failed attempts
liruihao2008 0:df2226ca976c 85 int success; // 0~4: number of successful matched keycodes; 5 indicates switch changing; 6 indicates time expired
liruihao2008 0:df2226ca976c 86 int zone;
liruihao2008 0:df2226ca976c 87 int led_bits = 0; // global LED status used for readback
liruihao2008 0:df2226ca976c 88 bool time_expired ;
liruihao2008 0:df2226ca976c 89 Ticker timer;
liruihao2008 0:df2226ca976c 90 Timeout t_alarm, t_entry, t_exit;
liruihao2008 0:df2226ca976c 91
liruihao2008 0:df2226ca976c 92 /*=============================================================================
liruihao2008 0:df2226ca976c 93
liruihao2008 0:df2226ca976c 94 FILE - main.cpp
liruihao2008 0:df2226ca976c 95
liruihao2008 0:df2226ca976c 96 DESCRIPTION
liruihao2008 0:df2226ca976c 97 Initiates the Finite State Machine
liruihao2008 0:df2226ca976c 98 =============================================================================*/
liruihao2008 0:df2226ca976c 99 int main() {
liruihao2008 0:df2226ca976c 100 alarmConfig();
liruihao2008 0:df2226ca976c 101
liruihao2008 0:df2226ca976c 102 lcd.cls();
liruihao2008 0:df2226ca976c 103 lcd.locate(2,0);
liruihao2008 0:df2226ca976c 104 lcd.printf("Alarm Lab");
liruihao2008 0:df2226ca976c 105 pc.printf("\n\n\r ALARM LAB\n\r (c)Copyright University of Essex 2017 \n\r Author: Ruihao Li\n\r");
liruihao2008 0:df2226ca976c 106
liruihao2008 0:df2226ca976c 107 setKey();
liruihao2008 0:df2226ca976c 108 while (1){
liruihao2008 0:df2226ca976c 109 switchleds();
liruihao2008 0:df2226ca976c 110 alarm_state(); // FSM routine
liruihao2008 0:df2226ca976c 111 }
liruihao2008 0:df2226ca976c 112 }
liruihao2008 0:df2226ca976c 113
liruihao2008 0:df2226ca976c 114 /**********************************************************************************
liruihao2008 0:df2226ca976c 115 Finite State Machine for Alarm
liruihao2008 0:df2226ca976c 116 **********************************************************************************/
liruihao2008 0:df2226ca976c 117 void alarm_state(){
liruihao2008 0:df2226ca976c 118 int s;
liruihao2008 0:df2226ca976c 119
liruihao2008 0:df2226ca976c 120 switch(state){
liruihao2008 0:df2226ca976c 121 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 122 UN_SET STATE (STATE 1)
liruihao2008 0:df2226ca976c 123 un_set led enabled
liruihao2008 0:df2226ca976c 124 Internal sounder disabledabled
liruihao2008 0:df2226ca976c 125 Sensors not monitored.
liruihao2008 0:df2226ca976c 126 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 127 case unset:
liruihao2008 0:df2226ca976c 128 setled(8,3); // turn unset led on
liruihao2008 0:df2226ca976c 129 pc.printf("\n\r Unset mode\n\r");
liruihao2008 0:df2226ca976c 130 lcd.cls();
liruihao2008 0:df2226ca976c 131 lcd.printf("Unset mode");
liruihao2008 0:df2226ca976c 132
liruihao2008 0:df2226ca976c 133 success = testCode();
liruihao2008 0:df2226ca976c 134 if (success == 4) {
liruihao2008 0:df2226ca976c 135 fail = 0; // failure counter reset
liruihao2008 0:df2226ca976c 136 state = exits;
liruihao2008 0:df2226ca976c 137 }
liruihao2008 0:df2226ca976c 138 else if (fail == 2) {
liruihao2008 0:df2226ca976c 139 pc.printf("\n\r attemp %d", fail+1);
liruihao2008 0:df2226ca976c 140 state = alarm;
liruihao2008 0:df2226ca976c 141 zone = 5; // zone identifier(5 represents an invalid code is entered three times)
liruihao2008 0:df2226ca976c 142 fail = 0; //failure counter reset
liruihao2008 0:df2226ca976c 143 }
liruihao2008 0:df2226ca976c 144 else{
liruihao2008 0:df2226ca976c 145 fail++;
liruihao2008 0:df2226ca976c 146 state = unset;
liruihao2008 0:df2226ca976c 147 pc.printf("\n\r attemp %d", fail);
liruihao2008 0:df2226ca976c 148 }
liruihao2008 0:df2226ca976c 149 break;
liruihao2008 0:df2226ca976c 150 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 151 EXIT STATE (STATE 2)
liruihao2008 0:df2226ca976c 152 un_set led flashes
liruihao2008 0:df2226ca976c 153 Internal sounder enabled for 250msec every 500msec.
liruihao2008 0:df2226ca976c 154 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 155 case exits:
liruihao2008 0:df2226ca976c 156 setled(7,3); // turn exits led on
liruihao2008 0:df2226ca976c 157 pattern(); // Sounder switches on and then off at 250ms intervals
liruihao2008 0:df2226ca976c 158 pc.printf("\n\r Exit mode\n\r");
liruihao2008 0:df2226ca976c 159 lcd.cls();
liruihao2008 0:df2226ca976c 160 lcd.printf("Exit mode");
liruihao2008 0:df2226ca976c 161
liruihao2008 0:df2226ca976c 162 // you should program here!
liruihao2008 0:df2226ca976c 163
liruihao2008 0:df2226ca976c 164
liruihao2008 0:df2226ca976c 165
liruihao2008 0:df2226ca976c 166 break;
liruihao2008 0:df2226ca976c 167 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 168 SET STATE (STATE 3)
liruihao2008 0:df2226ca976c 169 set led enabled
liruihao2008 0:df2226ca976c 170 Internal sounder disabled.
liruihao2008 0:df2226ca976c 171 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 172 case set:
liruihao2008 0:df2226ca976c 173 setled(6,3); // turn set led on
liruihao2008 0:df2226ca976c 174
liruihao2008 0:df2226ca976c 175 pc.printf("\n\r Set mode\n\r");
liruihao2008 0:df2226ca976c 176 lcd.cls();
liruihao2008 0:df2226ca976c 177 lcd.printf("Set mode");
liruihao2008 0:df2226ca976c 178
liruihao2008 0:df2226ca976c 179
liruihao2008 0:df2226ca976c 180 // you should program here!
liruihao2008 0:df2226ca976c 181
liruihao2008 0:df2226ca976c 182 break;
liruihao2008 0:df2226ca976c 183 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 184 ENTRY STATE (STATE 4)
liruihao2008 0:df2226ca976c 185 un_set led flashes
liruihao2008 0:df2226ca976c 186 Internal sounder enabled for 250ms every 500ms.
liruihao2008 0:df2226ca976c 187 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 188 case entry:
liruihao2008 0:df2226ca976c 189 setled(5,3); // turn entry led on
liruihao2008 0:df2226ca976c 190 pattern(); // Sounder switches on and then off at 250ms intervals
liruihao2008 0:df2226ca976c 191
liruihao2008 0:df2226ca976c 192 pc.printf("\n\r Entry mode\n\r");
liruihao2008 0:df2226ca976c 193 lcd.cls();
liruihao2008 0:df2226ca976c 194 lcd.printf("Entry mode");
liruihao2008 0:df2226ca976c 195
liruihao2008 0:df2226ca976c 196 // you should program here!
liruihao2008 0:df2226ca976c 197
liruihao2008 0:df2226ca976c 198 break;
liruihao2008 0:df2226ca976c 199 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 200 ALARM STATE (STATE 5)
liruihao2008 0:df2226ca976c 201 alarm led enabled
liruihao2008 0:df2226ca976c 202 Internal and External sounders enabled.
liruihao2008 0:df2226ca976c 203 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 204 case alarm:
liruihao2008 0:df2226ca976c 205 setled(4,3); // turn entry led on
liruihao2008 0:df2226ca976c 206 Sounder = 1; //Sounder enabled all the time during alarm state
liruihao2008 0:df2226ca976c 207
liruihao2008 0:df2226ca976c 208 pc.printf("\n\r Alarm mode\n\r");
liruihao2008 0:df2226ca976c 209 lcd.cls();
liruihao2008 0:df2226ca976c 210 lcd.printf("Alarm mode");
liruihao2008 0:df2226ca976c 211
liruihao2008 0:df2226ca976c 212 // you should program here!
liruihao2008 0:df2226ca976c 213
liruihao2008 0:df2226ca976c 214 break;
liruihao2008 0:df2226ca976c 215 /*--------------------------------------------------------------------------------
liruihao2008 0:df2226ca976c 216 REPORT (STATE 6)
liruihao2008 0:df2226ca976c 217 un-set and alarm leds enabled
liruihao2008 0:df2226ca976c 218 Internal sounder remains enabled.
liruihao2008 0:df2226ca976c 219 External sounder enabled.
liruihao2008 0:df2226ca976c 220 ---------------------------------------------------------------------------------*/
liruihao2008 0:df2226ca976c 221 case report:
liruihao2008 0:df2226ca976c 222 setled(3,3); // turn entry led on
liruihao2008 0:df2226ca976c 223
liruihao2008 0:df2226ca976c 224 pc.printf("\n\r Report mode\n\r");
liruihao2008 0:df2226ca976c 225 lcd.cls();
liruihao2008 0:df2226ca976c 226 lcd.printf("Zone numbers:%i",zone);
liruihao2008 0:df2226ca976c 227 lcd.locate(0,1);
liruihao2008 0:df2226ca976c 228 lcd.printf("C key to clear");
liruihao2008 0:df2226ca976c 229
liruihao2008 0:df2226ca976c 230 while (1){
liruihao2008 0:df2226ca976c 231 char b = getKey();
liruihao2008 0:df2226ca976c 232 if (b == 'C'){
liruihao2008 0:df2226ca976c 233 state = unset;
liruihao2008 0:df2226ca976c 234 break;
liruihao2008 0:df2226ca976c 235 }
liruihao2008 0:df2226ca976c 236 }
liruihao2008 0:df2226ca976c 237 break;
liruihao2008 0:df2226ca976c 238 } // end switch(state)
liruihao2008 0:df2226ca976c 239
liruihao2008 0:df2226ca976c 240 } // end alarm_state()
liruihao2008 0:df2226ca976c 241
liruihao2008 0:df2226ca976c 242
liruihao2008 0:df2226ca976c 243 /**********************************************************************************
liruihao2008 0:df2226ca976c 244 Configurations
liruihao2008 0:df2226ca976c 245 **********************************************************************************/
liruihao2008 0:df2226ca976c 246 void alarmConfig()
liruihao2008 0:df2226ca976c 247 {
liruihao2008 0:df2226ca976c 248 cs=0;
liruihao2008 0:df2226ca976c 249 sw.format(16,0);
liruihao2008 0:df2226ca976c 250 sw.frequency(1000000);
liruihao2008 0:df2226ca976c 251
liruihao2008 0:df2226ca976c 252 state = unset; // Initial state
liruihao2008 0:df2226ca976c 253
liruihao2008 0:df2226ca976c 254 led_bits = 0x0000; // turn off all the external leds
liruihao2008 0:df2226ca976c 255 sw.write(led_bits);
liruihao2008 0:df2226ca976c 256 cs = 1;
liruihao2008 0:df2226ca976c 257 cs = 0;
liruihao2008 0:df2226ca976c 258 }
liruihao2008 0:df2226ca976c 259
liruihao2008 0:df2226ca976c 260 /**********************************************************************************
liruihao2008 0:df2226ca976c 261 External switches
liruihao2008 0:df2226ca976c 262 **********************************************************************************/
liruihao2008 0:df2226ca976c 263 int read_switch()
liruihao2008 0:df2226ca976c 264 {
liruihao2008 0:df2226ca976c 265 rows = 4;
liruihao2008 0:df2226ca976c 266 int switches = cols;
liruihao2008 0:df2226ca976c 267 rows = 5;
liruihao2008 0:df2226ca976c 268 switches = switches*16 + cols;
liruihao2008 0:df2226ca976c 269
liruihao2008 0:df2226ca976c 270 return switches;
liruihao2008 0:df2226ca976c 271 }
liruihao2008 0:df2226ca976c 272
liruihao2008 0:df2226ca976c 273 int switchleds()
liruihao2008 0:df2226ca976c 274 {
liruihao2008 0:df2226ca976c 275 int switches = read_switch();
liruihao2008 0:df2226ca976c 276
liruihao2008 0:df2226ca976c 277 for(int i=0;i<=7;i++){
liruihao2008 0:df2226ca976c 278 if ((switches & 0x0001<<i)!=0){ // 1, then turn on
liruihao2008 0:df2226ca976c 279 led_bits = led_bits | (0x0003 << i*2); }
liruihao2008 0:df2226ca976c 280 else { // 0, then turn off
liruihao2008 0:df2226ca976c 281 led_bits = led_bits & ((0x0003 << i*2) ^ 0xffff); }
liruihao2008 0:df2226ca976c 282 }
liruihao2008 0:df2226ca976c 283 sw.write(led_bits);
liruihao2008 0:df2226ca976c 284 cs = 1;
liruihao2008 0:df2226ca976c 285 cs = 0;
liruihao2008 0:df2226ca976c 286
liruihao2008 0:df2226ca976c 287 return switches;
liruihao2008 0:df2226ca976c 288 }
liruihao2008 0:df2226ca976c 289
liruihao2008 0:df2226ca976c 290 /**********************************************************************************
liruihao2008 0:df2226ca976c 291 External LED functionality
liruihao2008 0:df2226ca976c 292 **********************************************************************************/
liruihao2008 0:df2226ca976c 293 void initleds() {
liruihao2008 0:df2226ca976c 294 cs = 0; // latch must start low
liruihao2008 0:df2226ca976c 295 sw.format(16,0); // SPI 16 bit data, low state, high going clock
liruihao2008 0:df2226ca976c 296 sw.frequency(1000000); // 1MHz clock rate
liruihao2008 0:df2226ca976c 297 }
liruihao2008 0:df2226ca976c 298
liruihao2008 0:df2226ca976c 299 void setleds(int ledall) {
liruihao2008 0:df2226ca976c 300 led_bits = ledall; // update global LED status
liruihao2008 0:df2226ca976c 301 sw.write((led_bits & 0x03ff) | ((led_bits & 0xa800) >> 1) | ((led_bits & 0x5400) << 1));
liruihao2008 0:df2226ca976c 302 cs = 1; // latch pulse start
liruihao2008 0:df2226ca976c 303 cs = 0; // latch pulse end
liruihao2008 0:df2226ca976c 304 }
liruihao2008 0:df2226ca976c 305
liruihao2008 0:df2226ca976c 306 void setled(int ledno, int ledstate) {
liruihao2008 0:df2226ca976c 307 ledno = 9 - ledno;
liruihao2008 0:df2226ca976c 308 ledno = ((ledno - 1) & 0x0007) + 1; // limit led number
liruihao2008 0:df2226ca976c 309 ledno = (8 - ledno) * 2; // offset of led state in 'led_bits'
liruihao2008 0:df2226ca976c 310 ledstate = ledstate & 0x0003; // limit led state
liruihao2008 0:df2226ca976c 311 ledstate = ledstate << ledno;
liruihao2008 0:df2226ca976c 312 int statemask = ((0x0003 << ledno) ^ 0xffff); // mask used to clear led state
liruihao2008 0:df2226ca976c 313 led_bits = ((led_bits & statemask) | ledstate); // clear and set led state
liruihao2008 0:df2226ca976c 314 setleds(led_bits);
liruihao2008 0:df2226ca976c 315 }
liruihao2008 0:df2226ca976c 316
liruihao2008 0:df2226ca976c 317 int readled(int ledno) {
liruihao2008 0:df2226ca976c 318 ledno = 9 - ledno;
liruihao2008 0:df2226ca976c 319 ledno = ((ledno - 1) & 0x0007) + 1; // limit led number
liruihao2008 0:df2226ca976c 320 ledno = (8 - ledno) * 2; // offset of led state in 'led_bits'
liruihao2008 0:df2226ca976c 321 int ledstate = led_bits;
liruihao2008 0:df2226ca976c 322 ledstate = ledstate >> ledno; // shift selected led state into ls 2 bits
liruihao2008 0:df2226ca976c 323 return (ledstate & 0x0003); // mask out and return led state
liruihao2008 0:df2226ca976c 324 }
liruihao2008 0:df2226ca976c 325
liruihao2008 0:df2226ca976c 326 int readleds() {
liruihao2008 0:df2226ca976c 327 return led_bits; // return LED status
liruihao2008 0:df2226ca976c 328 }
liruihao2008 0:df2226ca976c 329
liruihao2008 0:df2226ca976c 330 /**********************************************************************************
liruihao2008 0:df2226ca976c 331 Keypad functionality
liruihao2008 0:df2226ca976c 332 **********************************************************************************/
liruihao2008 0:df2226ca976c 333 char getKey()
liruihao2008 0:df2226ca976c 334 {
liruihao2008 0:df2226ca976c 335 int i,j;
liruihao2008 0:df2226ca976c 336 char ch=' ';
liruihao2008 0:df2226ca976c 337
liruihao2008 0:df2226ca976c 338 for (i = 0; i <= 3; i++) {
liruihao2008 0:df2226ca976c 339 rows = i;
liruihao2008 0:df2226ca976c 340 for (j = 0; j <= 3; j++) {
liruihao2008 0:df2226ca976c 341 if (((cols ^ 0x00FF) & (0x0001<<j)) != 0) {
liruihao2008 0:df2226ca976c 342 ch = Keytable[(i * 4) + j];
liruihao2008 0:df2226ca976c 343 }
liruihao2008 0:df2226ca976c 344 }
liruihao2008 0:df2226ca976c 345 }
liruihao2008 0:df2226ca976c 346 wait(0.2); //debouncing
liruihao2008 0:df2226ca976c 347 return ch;
liruihao2008 0:df2226ca976c 348 }
liruihao2008 0:df2226ca976c 349
liruihao2008 0:df2226ca976c 350 int testCode(void)
liruihao2008 0:df2226ca976c 351 {
liruihao2008 0:df2226ca976c 352 int a, y;
liruihao2008 0:df2226ca976c 353 char b;
liruihao2008 0:df2226ca976c 354
liruihao2008 0:df2226ca976c 355 lcd.locate(0, 1);
liruihao2008 0:df2226ca976c 356 lcd.printf("Enter Code: ____");
liruihao2008 0:df2226ca976c 357 y = 0;
liruihao2008 0:df2226ca976c 358 for(a = 0; a < 4; a++) {
liruihao2008 0:df2226ca976c 359 b = getKey();
liruihao2008 0:df2226ca976c 360 switch(b) {
liruihao2008 0:df2226ca976c 361 case ' ':
liruihao2008 0:df2226ca976c 362 a--;
liruihao2008 0:df2226ca976c 363 break;
liruihao2008 0:df2226ca976c 364 case 'C': // use 'C' to delete input
liruihao2008 0:df2226ca976c 365 if (a > 0){
liruihao2008 0:df2226ca976c 366 a = a-2;
liruihao2008 0:df2226ca976c 367 lcd.locate(13+a, 1);
liruihao2008 0:df2226ca976c 368 lcd.putc('_');
liruihao2008 0:df2226ca976c 369 if ( code[a+1] == keyCode[a+1]){
liruihao2008 0:df2226ca976c 370 y--;
liruihao2008 0:df2226ca976c 371 }
liruihao2008 0:df2226ca976c 372 }
liruihao2008 0:df2226ca976c 373 else if (a == 0){
liruihao2008 0:df2226ca976c 374 a--;
liruihao2008 0:df2226ca976c 375 }
liruihao2008 0:df2226ca976c 376 break;
liruihao2008 0:df2226ca976c 377 default:
liruihao2008 0:df2226ca976c 378 code[a] = b;
liruihao2008 0:df2226ca976c 379 lcd.locate(12+a, 1);
liruihao2008 0:df2226ca976c 380 lcd.putc('*');
liruihao2008 0:df2226ca976c 381 if(code[a] == keyCode[a]) {
liruihao2008 0:df2226ca976c 382 y++;
liruihao2008 0:df2226ca976c 383 }
liruihao2008 0:df2226ca976c 384 }
liruihao2008 0:df2226ca976c 385 }
liruihao2008 0:df2226ca976c 386 lcd.cls();
liruihao2008 0:df2226ca976c 387 lcd.locate(0,1);
liruihao2008 0:df2226ca976c 388 lcd.printf("Press B to set");
liruihao2008 0:df2226ca976c 389 while (1){
liruihao2008 0:df2226ca976c 390 b = getKey();
liruihao2008 0:df2226ca976c 391 if (b == 'B')
liruihao2008 0:df2226ca976c 392 break;
liruihao2008 0:df2226ca976c 393 }
liruihao2008 0:df2226ca976c 394
liruihao2008 0:df2226ca976c 395 return(y);
liruihao2008 0:df2226ca976c 396 }
liruihao2008 0:df2226ca976c 397
liruihao2008 0:df2226ca976c 398 void setKey(void)
liruihao2008 0:df2226ca976c 399 {
liruihao2008 0:df2226ca976c 400 int a;
liruihao2008 0:df2226ca976c 401 char b;
liruihao2008 0:df2226ca976c 402
liruihao2008 0:df2226ca976c 403 lcd.locate(0, 1);
liruihao2008 0:df2226ca976c 404 lcd.printf("Init Code: ____");
liruihao2008 0:df2226ca976c 405 for(a = 0; a < 4; a++) {
liruihao2008 0:df2226ca976c 406 b = getKey();
liruihao2008 0:df2226ca976c 407
liruihao2008 0:df2226ca976c 408 switch(b){
liruihao2008 0:df2226ca976c 409 case ' ':
liruihao2008 0:df2226ca976c 410 a--;
liruihao2008 0:df2226ca976c 411 break;
liruihao2008 0:df2226ca976c 412 case 'C':
liruihao2008 0:df2226ca976c 413 if (a > 0){
liruihao2008 0:df2226ca976c 414 a = a-2;
liruihao2008 0:df2226ca976c 415 lcd.locate(13+a, 1);
liruihao2008 0:df2226ca976c 416 lcd.putc('_');
liruihao2008 0:df2226ca976c 417 }
liruihao2008 0:df2226ca976c 418 else if (a == 0){
liruihao2008 0:df2226ca976c 419 a--;
liruihao2008 0:df2226ca976c 420 }
liruihao2008 0:df2226ca976c 421 break;
liruihao2008 0:df2226ca976c 422 default:
liruihao2008 0:df2226ca976c 423 lcd.locate(12+a, 1);
liruihao2008 0:df2226ca976c 424 lcd.putc(b);
liruihao2008 0:df2226ca976c 425 keyCode[a] = b;
liruihao2008 0:df2226ca976c 426 }
liruihao2008 0:df2226ca976c 427 }
liruihao2008 0:df2226ca976c 428 wait(1);
liruihao2008 0:df2226ca976c 429 }
liruihao2008 0:df2226ca976c 430
liruihao2008 0:df2226ca976c 431 /**********************************************************************************
liruihao2008 0:df2226ca976c 432 Simulation of alarm internal sounder
liruihao2008 0:df2226ca976c 433 **********************************************************************************/
liruihao2008 0:df2226ca976c 434 void sounder_blink()
liruihao2008 0:df2226ca976c 435 {
liruihao2008 0:df2226ca976c 436 Sounder = !Sounder;
liruihao2008 0:df2226ca976c 437 }
liruihao2008 0:df2226ca976c 438
liruihao2008 0:df2226ca976c 439 void pattern(void)
liruihao2008 0:df2226ca976c 440 {
liruihao2008 0:df2226ca976c 441 timer.attach(&sounder_blink, 0.25);
liruihao2008 0:df2226ca976c 442 }
liruihao2008 0:df2226ca976c 443
liruihao2008 0:df2226ca976c 444 void patternoff(void)
liruihao2008 0:df2226ca976c 445 {
liruihao2008 0:df2226ca976c 446 timer.detach(); // turn the Sounder off
liruihao2008 0:df2226ca976c 447 Sounder = 0;
liruihao2008 0:df2226ca976c 448 }
liruihao2008 0:df2226ca976c 449
liruihao2008 0:df2226ca976c 450 void Sounderoff(void)
liruihao2008 0:df2226ca976c 451 {
liruihao2008 0:df2226ca976c 452 Sounder = 0;
liruihao2008 0:df2226ca976c 453 }
liruihao2008 0:df2226ca976c 454
liruihao2008 0:df2226ca976c 455 /**********************************************************************************
liruihao2008 0:df2226ca976c 456 Set system state
liruihao2008 0:df2226ca976c 457 **********************************************************************************/
liruihao2008 0:df2226ca976c 458 void system_alarm(void)
liruihao2008 0:df2226ca976c 459 {
liruihao2008 0:df2226ca976c 460 state = alarm;
liruihao2008 0:df2226ca976c 461 time_expired = true;
liruihao2008 0:df2226ca976c 462 }
liruihao2008 0:df2226ca976c 463
liruihao2008 0:df2226ca976c 464 void system_set(void)
liruihao2008 0:df2226ca976c 465 {
liruihao2008 0:df2226ca976c 466 state = set;
liruihao2008 0:df2226ca976c 467 time_expired = true;
liruihao2008 0:df2226ca976c 468 }
liruihao2008 0:df2226ca976c 469