Project 1 Self-powered Health & Security Monitoring System USB device

Dependencies:   C12832_lcd LM75B MMA7660 USBDevice mbed

Committer:
wane
Date:
Fri Mar 28 01:21:17 2014 +0000
Revision:
0:88dc49222b35
Child:
1:930838234048
Project 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wane 0:88dc49222b35 1 // Project: Self-powered USB Health and Security Monitoring Device (HSMD)
wane 0:88dc49222b35 2
wane 0:88dc49222b35 3 /* 241: Added temp alarm
wane 0:88dc49222b35 4 251: Added motion alarm, sensitivity level
wane 0:88dc49222b35 5 Validated alarm status handling
wane 0:88dc49222b35 6 252: Added lock, passcode control, mode (T-Testing; O-Operational)
wane 0:88dc49222b35 7 261: Added non-blocking serial entry
wane 0:88dc49222b35 8
wane 0:88dc49222b35 9 TO-DO:
wane 0:88dc49222b35 10
wane 0:88dc49222b35 11 implement USB connection detection
wane 0:88dc49222b35 12 try record sound
wane 0:88dc49222b35 13 try gps
wane 0:88dc49222b35 14 add menu to LCD
wane 0:88dc49222b35 15
wane 0:88dc49222b35 16 */
wane 0:88dc49222b35 17
wane 0:88dc49222b35 18 #include "mbed.h"
wane 0:88dc49222b35 19 #include "C12832_lcd.h"
wane 0:88dc49222b35 20 #include "LM75B.h"
wane 0:88dc49222b35 21 #include "MMA7660.h"
wane 0:88dc49222b35 22 #include "USBKeyboard.h"
wane 0:88dc49222b35 23
wane 0:88dc49222b35 24 // Configure device as USBKeyboard
wane 0:88dc49222b35 25 USBKeyboard dev;
wane 0:88dc49222b35 26
wane 0:88dc49222b35 27 #define UP 0x1
wane 0:88dc49222b35 28 #define DOWN 0x2
wane 0:88dc49222b35 29 #define LEFT 0x4
wane 0:88dc49222b35 30 #define RIGHT 0x8
wane 0:88dc49222b35 31 #define ON true
wane 0:88dc49222b35 32 #define OFF false
wane 0:88dc49222b35 33
wane 0:88dc49222b35 34 // System configuration parameters
wane 0:88dc49222b35 35 #define YEAR 2014
wane 0:88dc49222b35 36 #define MONTH 3
wane 0:88dc49222b35 37 #define DATE 26
wane 0:88dc49222b35 38 #define HOUR 17
wane 0:88dc49222b35 39 #define MIN 35
wane 0:88dc49222b35 40 #define DEF_LOWER_TEMP 72 // Lower bound of monitoring temperature
wane 0:88dc49222b35 41 #define DEF_UPPER_TEMP 89 // Upper bound of monitoring temperature
wane 0:88dc49222b35 42 #define LOW_SEN 0.7 // Low sensitivity
wane 0:88dc49222b35 43 #define MID_SEN 0.5 // Medium sensitivity
wane 0:88dc49222b35 44 #define HIGH_SEN 0.3 // High sensitivity
wane 0:88dc49222b35 45 #define BUZZ_POWER 0.5 // Buzz power level
wane 0:88dc49222b35 46 #define BUZZ_SPERIOD 0.2 // Security alarm buzz period
wane 0:88dc49222b35 47 #define BUZZ_TPERIOD 1 // Temperature alarm buzz period
wane 0:88dc49222b35 48
wane 0:88dc49222b35 49 // System I/O
wane 0:88dc49222b35 50 C12832_LCD lcd;
wane 0:88dc49222b35 51 PwmOut alarm(p21);
wane 0:88dc49222b35 52 BusIn joy(p15,p12,p13,p16);
wane 0:88dc49222b35 53 InterruptIn IRQJoyUp(p15);
wane 0:88dc49222b35 54 InterruptIn IRQJoyDown(p12);
wane 0:88dc49222b35 55 InterruptIn IRQJoyLeft(p13);
wane 0:88dc49222b35 56 InterruptIn IRQJoyRight(p16);
wane 0:88dc49222b35 57 //DigitalIn fire(p14);
wane 0:88dc49222b35 58 InterruptIn IRQFire(p14);
wane 0:88dc49222b35 59
wane 0:88dc49222b35 60 Serial pc(USBTX, USBRX); // tx, rx
wane 0:88dc49222b35 61 LM75B Ctmp(p28,p27);
wane 0:88dc49222b35 62 AnalogIn pot1(p19);
wane 0:88dc49222b35 63 AnalogIn pot2(p20);
wane 0:88dc49222b35 64 MMA7660 MMA(p28, p27);
wane 0:88dc49222b35 65 DigitalOut connectionLed(LED1);
wane 0:88dc49222b35 66 DigitalOut lockLed(LED2);
wane 0:88dc49222b35 67 //PwmOut Xaxis_p(LED2);
wane 0:88dc49222b35 68 //BusOut leds(LED3,LED4);
wane 0:88dc49222b35 69 //DigitalOut ledTAlarm(LED3);
wane 0:88dc49222b35 70 //DigitalOut ledSAlarm(LED4);
wane 0:88dc49222b35 71 PwmOut ledSAlarm(LED4);
wane 0:88dc49222b35 72 PwmOut ledTAlarm(LED3);
wane 0:88dc49222b35 73
wane 0:88dc49222b35 74 // Gobal parameters
wane 0:88dc49222b35 75 float setUpperTemp; // Upper bound of temperature monitoring range
wane 0:88dc49222b35 76 float setLowerTemp; // Lower bound of temperature monitoring range
wane 0:88dc49222b35 77 bool sAlarmOn; // State of alarm
wane 0:88dc49222b35 78 int statusAlarm; // Status indicating whether health or/and security alarm is triggered
wane 0:88dc49222b35 79 bool sHealthFeatureActive; // State indicating temperature monitoring is activated
wane 0:88dc49222b35 80 bool sSecurityFeatureActive; // State indicating motion monitoring is activated
wane 0:88dc49222b35 81 bool sLockActive; // State indicating lock is active
wane 0:88dc49222b35 82 char sState; // security setting state
wane 0:88dc49222b35 83 char gState; // Global state
wane 0:88dc49222b35 84 int buzzPattern;
wane 0:88dc49222b35 85 float buzzPeriod;
wane 0:88dc49222b35 86 Ticker timer1;
wane 0:88dc49222b35 87 Ticker timer3;
wane 0:88dc49222b35 88 Ticker timer4;
wane 0:88dc49222b35 89 Timer timer2;
wane 0:88dc49222b35 90 Ticker ticAlarm;
wane 0:88dc49222b35 91 bool first;
wane 0:88dc49222b35 92 int count;
wane 0:88dc49222b35 93 bool activated; // for debounce fire
wane 0:88dc49222b35 94 time_t yet;
wane 0:88dc49222b35 95 time_t now;
wane 0:88dc49222b35 96 int alarmType; // 0 - Health; 1 - Security
wane 0:88dc49222b35 97 char senLevel; // Sensitivity level of motion alarm
wane 0:88dc49222b35 98 int mode; // Operation mode:
wane 0:88dc49222b35 99 // 0 = Test mode (for testing features)
wane 0:88dc49222b35 100 // 1 = Lock mode (lock and unlock device)
wane 0:88dc49222b35 101 int passcode; // 4-digit passcode for lock and unlock
wane 0:88dc49222b35 102 bool sPCOK; // state indicating a valid passcode is existing
wane 0:88dc49222b35 103
wane 0:88dc49222b35 104 bool updateCurTempDisplay;
wane 0:88dc49222b35 105 bool updateJoyDisplay;
wane 0:88dc49222b35 106 bool tempOverride;
wane 0:88dc49222b35 107 float lowerTempBase; // For simulated lower bound temperature
wane 0:88dc49222b35 108 float upperTempBase; // For simulated upper bound temperature
wane 0:88dc49222b35 109 float temp;
wane 0:88dc49222b35 110
wane 0:88dc49222b35 111 bool entryReady; // For tracking if user input is comlete
wane 0:88dc49222b35 112 unsigned char entryState; // State tracking input entry
wane 0:88dc49222b35 113 char inBuf[128]; // Input buffer
wane 0:88dc49222b35 114 char pos; // Gobal buffer index
wane 0:88dc49222b35 115
wane 0:88dc49222b35 116
wane 0:88dc49222b35 117 float timeElapsed;
wane 0:88dc49222b35 118 int tol; // Tolerance for hysteresis effect
wane 0:88dc49222b35 119 time_t seconds;
wane 0:88dc49222b35 120
wane 0:88dc49222b35 121 float potBase1;
wane 0:88dc49222b35 122 float potBase2;
wane 0:88dc49222b35 123
wane 0:88dc49222b35 124 #ifdef C
wane 0:88dc49222b35 125 #define deg 'C'
wane 0:88dc49222b35 126 #else
wane 0:88dc49222b35 127 #define deg 'F'
wane 0:88dc49222b35 128 #endif
wane 0:88dc49222b35 129
wane 0:88dc49222b35 130 typedef struct {
wane 0:88dc49222b35 131 bool active;
wane 0:88dc49222b35 132 float factor;
wane 0:88dc49222b35 133 unsigned char sym[3];
wane 0:88dc49222b35 134 } SENTYPE;
wane 0:88dc49222b35 135
wane 0:88dc49222b35 136 const SENTYPE senParm[4] = {
wane 0:88dc49222b35 137 { false, LOW_SEN, " " },
wane 0:88dc49222b35 138 { true, LOW_SEN, "S1" }, // Low sensitivity
wane 0:88dc49222b35 139 { true, MID_SEN, "S2" }, // Mid sensitivity
wane 0:88dc49222b35 140 { true, HIGH_SEN, "S3" }, // High sensitivity
wane 0:88dc49222b35 141 };
wane 0:88dc49222b35 142
wane 0:88dc49222b35 143 const char modeSym[2] = { 'T', 'O' };
wane 0:88dc49222b35 144
wane 0:88dc49222b35 145 /*
wane 0:88dc49222b35 146 enum FUNCTION_KEY {
wane 0:88dc49222b35 147 KEY_SCROLL_LOCK = 141, // Scroll lock
wane 0:88dc49222b35 148 KEY_CAPS_LOCK, // caps lock
wane 0:88dc49222b35 149 KEY_NUM_LOCK, // num lock
wane 0:88dc49222b35 150 };
wane 0:88dc49222b35 151 */
wane 0:88dc49222b35 152
wane 0:88dc49222b35 153 // Function prototype
wane 0:88dc49222b35 154 void ISRFirePressed();
wane 0:88dc49222b35 155 void ISRJoyUp();
wane 0:88dc49222b35 156 void ISRJoyDown();
wane 0:88dc49222b35 157 void ISRJoyLeft();
wane 0:88dc49222b35 158 void ISRJoyRight();
wane 0:88dc49222b35 159 void debounce();
wane 0:88dc49222b35 160 void buzzOn(int pattern, float period);
wane 0:88dc49222b35 161 void buzzOff();
wane 0:88dc49222b35 162 void buzzTest();
wane 0:88dc49222b35 163 void peepEntry();
wane 0:88dc49222b35 164 void calibratePot();
wane 0:88dc49222b35 165 bool EnterTemp();
wane 0:88dc49222b35 166 bool SetPasscode();
wane 0:88dc49222b35 167 bool UnlockPasscode();
wane 0:88dc49222b35 168 void USBConnCheck();
wane 0:88dc49222b35 169 void SetTime(int year, int month, int date, int hour, int min, int sec);
wane 0:88dc49222b35 170 void TempMonitor();
wane 0:88dc49222b35 171 void ReadTemp();
wane 0:88dc49222b35 172 void MotionMonitor();
wane 0:88dc49222b35 173 void DisplayLCD();
wane 0:88dc49222b35 174 void AlarmCheck();
wane 0:88dc49222b35 175 void FSM(void);
wane 0:88dc49222b35 176
wane 0:88dc49222b35 177
wane 0:88dc49222b35 178 // ISR for fire button
wane 0:88dc49222b35 179 void ISRFirePressed()
wane 0:88dc49222b35 180 {
wane 0:88dc49222b35 181 now = time(NULL);
wane 0:88dc49222b35 182 if (!activated && now > yet) {
wane 0:88dc49222b35 183
wane 0:88dc49222b35 184 tempOverride = !tempOverride;
wane 0:88dc49222b35 185 //EnterTemp();
wane 0:88dc49222b35 186 if (tempOverride)
wane 0:88dc49222b35 187 gState = 3;
wane 0:88dc49222b35 188 yet = now + 1;
wane 0:88dc49222b35 189 activated = true;
wane 0:88dc49222b35 190 }
wane 0:88dc49222b35 191
wane 0:88dc49222b35 192 }
wane 0:88dc49222b35 193
wane 0:88dc49222b35 194
wane 0:88dc49222b35 195 /*
wane 0:88dc49222b35 196 now = time(NULL);
wane 0:88dc49222b35 197 if (!activated && now > yet) {
wane 0:88dc49222b35 198 sAlarmOn = !sAlarmOn;
wane 0:88dc49222b35 199 yet = now + 1;
wane 0:88dc49222b35 200 activated = true;
wane 0:88dc49222b35 201 //first = true;
wane 0:88dc49222b35 202 count++;
wane 0:88dc49222b35 203 //printf("sAlarmOn: %d\n\r", sAlarmOn);
wane 0:88dc49222b35 204 }
wane 0:88dc49222b35 205 */
wane 0:88dc49222b35 206
wane 0:88dc49222b35 207
wane 0:88dc49222b35 208 // ISR for joystick up direction
wane 0:88dc49222b35 209 void ISRJoyUp()
wane 0:88dc49222b35 210 {
wane 0:88dc49222b35 211 now = time(NULL);
wane 0:88dc49222b35 212 if (!activated && now > yet) {
wane 0:88dc49222b35 213 //if (mode == 1 && sPCOK == false)
wane 0:88dc49222b35 214 // EnterPasscode();
wane 0:88dc49222b35 215 senLevel = (senLevel + 1) % 4;
wane 0:88dc49222b35 216 sSecurityFeatureActive = senParm[senLevel].active;
wane 0:88dc49222b35 217 updateJoyDisplay = true;
wane 0:88dc49222b35 218 yet = now + 1;
wane 0:88dc49222b35 219 activated = true;
wane 0:88dc49222b35 220 }
wane 0:88dc49222b35 221 }
wane 0:88dc49222b35 222
wane 0:88dc49222b35 223 // ISR for joystick down direction
wane 0:88dc49222b35 224 void ISRJoyDown()
wane 0:88dc49222b35 225 {
wane 0:88dc49222b35 226 now = time(NULL);
wane 0:88dc49222b35 227 if (!activated && now > yet) {
wane 0:88dc49222b35 228 mode = (mode + 1) % 2;
wane 0:88dc49222b35 229 updateJoyDisplay = true;
wane 0:88dc49222b35 230 yet = now + 1;
wane 0:88dc49222b35 231 activated = true;
wane 0:88dc49222b35 232 }
wane 0:88dc49222b35 233 }
wane 0:88dc49222b35 234
wane 0:88dc49222b35 235 // ISR for joystick left direction
wane 0:88dc49222b35 236 void ISRJoyLeft()
wane 0:88dc49222b35 237 {
wane 0:88dc49222b35 238 now = time(NULL);
wane 0:88dc49222b35 239 if (!activated && now > yet) {
wane 0:88dc49222b35 240 sHealthFeatureActive = !sHealthFeatureActive;
wane 0:88dc49222b35 241 updateJoyDisplay = true;
wane 0:88dc49222b35 242 yet = now + 1;
wane 0:88dc49222b35 243 activated = true;
wane 0:88dc49222b35 244 }
wane 0:88dc49222b35 245 }
wane 0:88dc49222b35 246
wane 0:88dc49222b35 247 // ISR for joystick right direction
wane 0:88dc49222b35 248 void ISRJoyRight()
wane 0:88dc49222b35 249 {
wane 0:88dc49222b35 250 now = time(NULL);
wane 0:88dc49222b35 251 if (!activated && now > yet) {
wane 0:88dc49222b35 252 if (mode == 1)
wane 0:88dc49222b35 253 {
wane 0:88dc49222b35 254 if (!sLockActive)
wane 0:88dc49222b35 255 gState = 1;
wane 0:88dc49222b35 256 else
wane 0:88dc49222b35 257 gState = 2;
wane 0:88dc49222b35 258 }
wane 0:88dc49222b35 259 yet = now + 1;
wane 0:88dc49222b35 260 activated = true;
wane 0:88dc49222b35 261 }
wane 0:88dc49222b35 262 }
wane 0:88dc49222b35 263
wane 0:88dc49222b35 264 // Debouncer function
wane 0:88dc49222b35 265 void debounce()
wane 0:88dc49222b35 266 {
wane 0:88dc49222b35 267 if (activated)
wane 0:88dc49222b35 268 activated = false;
wane 0:88dc49222b35 269 }
wane 0:88dc49222b35 270
wane 0:88dc49222b35 271 // Turn on buzz in different patterns
wane 0:88dc49222b35 272 void buzzOn(int pattern, float period)
wane 0:88dc49222b35 273 {
wane 0:88dc49222b35 274 switch (pattern) {
wane 0:88dc49222b35 275 case 0: // Temperature
wane 0:88dc49222b35 276 alarm = BUZZ_POWER;
wane 0:88dc49222b35 277 wait(0.2);
wane 0:88dc49222b35 278 alarm = 0;
wane 0:88dc49222b35 279 wait(period);
wane 0:88dc49222b35 280 /*
wane 0:88dc49222b35 281 for(float p=0; p<1.0; p += 0.1) {
wane 0:88dc49222b35 282 alarm = p;
wane 0:88dc49222b35 283 wait(period);
wane 0:88dc49222b35 284 }
wane 0:88dc49222b35 285 */
wane 0:88dc49222b35 286 break;
wane 0:88dc49222b35 287 case 1: // Security
wane 0:88dc49222b35 288 alarm = BUZZ_POWER;
wane 0:88dc49222b35 289 wait(0.2);
wane 0:88dc49222b35 290 alarm = 0;
wane 0:88dc49222b35 291 wait(period);
wane 0:88dc49222b35 292 break;
wane 0:88dc49222b35 293
wane 0:88dc49222b35 294 }
wane 0:88dc49222b35 295 /*
wane 0:88dc49222b35 296 led = led + 0.01;
wane 0:88dc49222b35 297 wait(0.2);
wane 0:88dc49222b35 298 if(led == 1.0) {
wane 0:88dc49222b35 299 led = 0;
wane 0:88dc49222b35 300 }
wane 0:88dc49222b35 301 */
wane 0:88dc49222b35 302
wane 0:88dc49222b35 303 }
wane 0:88dc49222b35 304
wane 0:88dc49222b35 305 // Turn on led in different patterns
wane 0:88dc49222b35 306 void ledOn(int type, float period)
wane 0:88dc49222b35 307 {
wane 0:88dc49222b35 308 switch (type) {
wane 0:88dc49222b35 309 case 0:
wane 0:88dc49222b35 310 ledTAlarm = 1;
wane 0:88dc49222b35 311 wait(0.1);
wane 0:88dc49222b35 312 ledTAlarm = 0;
wane 0:88dc49222b35 313 wait(0.05);
wane 0:88dc49222b35 314 break;
wane 0:88dc49222b35 315 case 1:
wane 0:88dc49222b35 316 for(int p=0; p<10; p += 1) {
wane 0:88dc49222b35 317 ledSAlarm = 1;
wane 0:88dc49222b35 318 wait(0.02);
wane 0:88dc49222b35 319 ledSAlarm = 0;
wane 0:88dc49222b35 320 wait(0.02);
wane 0:88dc49222b35 321 }
wane 0:88dc49222b35 322 /*
wane 0:88dc49222b35 323 ledSAlarm = 1;
wane 0:88dc49222b35 324 wait(0.1);
wane 0:88dc49222b35 325 ledSAlarm = 0;
wane 0:88dc49222b35 326 wait(0.02);
wane 0:88dc49222b35 327 */
wane 0:88dc49222b35 328 break;
wane 0:88dc49222b35 329
wane 0:88dc49222b35 330 }
wane 0:88dc49222b35 331 /*
wane 0:88dc49222b35 332 for(float p=0; p<1.0; p += 0.1) {
wane 0:88dc49222b35 333 leds = statusAlarm;
wane 0:88dc49222b35 334 wait(period);
wane 0:88dc49222b35 335 }
wane 0:88dc49222b35 336 */
wane 0:88dc49222b35 337
wane 0:88dc49222b35 338 /*
wane 0:88dc49222b35 339 led = led + 0.01;
wane 0:88dc49222b35 340 wait(0.2);
wane 0:88dc49222b35 341 if(led == 1.0) {
wane 0:88dc49222b35 342 led = 0;
wane 0:88dc49222b35 343 }
wane 0:88dc49222b35 344 */
wane 0:88dc49222b35 345
wane 0:88dc49222b35 346 }
wane 0:88dc49222b35 347
wane 0:88dc49222b35 348 // Turn off alarm
wane 0:88dc49222b35 349 void buzzOff()
wane 0:88dc49222b35 350 {
wane 0:88dc49222b35 351 alarm = 0;
wane 0:88dc49222b35 352 }
wane 0:88dc49222b35 353
wane 0:88dc49222b35 354 void buzzTest()
wane 0:88dc49222b35 355 {
wane 0:88dc49222b35 356 sAlarmOn = OFF;
wane 0:88dc49222b35 357
wane 0:88dc49222b35 358 timer1.attach(&debounce, 1);
wane 0:88dc49222b35 359 //IRQFire.rise(&ISRFirePressed);
wane 0:88dc49222b35 360 //IRQFire.fall(&ISRFireRelease);
wane 0:88dc49222b35 361 //IRQJoyUp.rise(&ISRJoyUp);
wane 0:88dc49222b35 362 //IRQJoyDown.rise(&ISRJoyDown);
wane 0:88dc49222b35 363
wane 0:88dc49222b35 364 alarm.period(0.020); // servo requires a 20ms period
wane 0:88dc49222b35 365
wane 0:88dc49222b35 366 printf("Test starts...\n\r");
wane 0:88dc49222b35 367
wane 0:88dc49222b35 368 while (1)
wane 0:88dc49222b35 369 {
wane 0:88dc49222b35 370 if (sAlarmOn) {
wane 0:88dc49222b35 371 buzzOn(buzzPattern, buzzPeriod);
wane 0:88dc49222b35 372 printf("%s: pattern: %d period: %.1f count: %d\n\r", sAlarmOn? "ON": "OFF", buzzPattern, buzzPeriod, count);
wane 0:88dc49222b35 373 } else {
wane 0:88dc49222b35 374 buzzOff();
wane 0:88dc49222b35 375 buzzPattern = (buzzPattern + 1) % 2;
wane 0:88dc49222b35 376 count = 0;
wane 0:88dc49222b35 377 }
wane 0:88dc49222b35 378 wait(0.02);
wane 0:88dc49222b35 379 }
wane 0:88dc49222b35 380 }
wane 0:88dc49222b35 381
wane 0:88dc49222b35 382
wane 0:88dc49222b35 383 // Set date and time
wane 0:88dc49222b35 384 // Input: Year, month, date, hour, minute, second
wane 0:88dc49222b35 385 void SetTime(int year, int month, int date, int hour, int min, int sec)
wane 0:88dc49222b35 386 {
wane 0:88dc49222b35 387 struct tm Clock;
wane 0:88dc49222b35 388 Clock.tm_year = year - 1900;
wane 0:88dc49222b35 389 Clock.tm_mon = month - 1;
wane 0:88dc49222b35 390 Clock.tm_mday = date;
wane 0:88dc49222b35 391 Clock.tm_hour = hour;
wane 0:88dc49222b35 392 Clock.tm_min = min;
wane 0:88dc49222b35 393 Clock.tm_sec = sec;
wane 0:88dc49222b35 394 time_t epoch = mktime(&Clock);
wane 0:88dc49222b35 395 if (epoch == (time_t) -1) {
wane 0:88dc49222b35 396 error("Error: Invalid clock setting! Please try again.\n");
wane 0:88dc49222b35 397 }
wane 0:88dc49222b35 398 set_time(epoch);
wane 0:88dc49222b35 399 }
wane 0:88dc49222b35 400
wane 0:88dc49222b35 401 // Calibrate analog pot to allow tuning each pot for controlling upper and lower bound control temperature
wane 0:88dc49222b35 402 void calibratePot()
wane 0:88dc49222b35 403 {
wane 0:88dc49222b35 404 potBase1 = pot1.read();
wane 0:88dc49222b35 405 potBase2 = pot2.read();
wane 0:88dc49222b35 406 //tempBase = temp;
wane 0:88dc49222b35 407 lowerTempBase = setLowerTemp;
wane 0:88dc49222b35 408 upperTempBase = setUpperTemp;
wane 0:88dc49222b35 409
wane 0:88dc49222b35 410
wane 0:88dc49222b35 411 updateJoyDisplay = true;
wane 0:88dc49222b35 412
wane 0:88dc49222b35 413 wait(0.5);
wane 0:88dc49222b35 414
wane 0:88dc49222b35 415 }
wane 0:88dc49222b35 416
wane 0:88dc49222b35 417 // Non-blockingly innput a simulated temperature
wane 0:88dc49222b35 418 // Input: None
wane 0:88dc49222b35 419 bool EnterTemp()
wane 0:88dc49222b35 420 {
wane 0:88dc49222b35 421 int i;
wane 0:88dc49222b35 422 bool done = false;
wane 0:88dc49222b35 423
wane 0:88dc49222b35 424 switch (entryState)
wane 0:88dc49222b35 425 {
wane 0:88dc49222b35 426 case 0:
wane 0:88dc49222b35 427 break;
wane 0:88dc49222b35 428 case 1:
wane 0:88dc49222b35 429 pc.printf("\n\rEnter a simulated temperature: ");
wane 0:88dc49222b35 430 entryReady = false;
wane 0:88dc49222b35 431 entryState = 2;
wane 0:88dc49222b35 432 break;
wane 0:88dc49222b35 433 case 2:
wane 0:88dc49222b35 434 peepEntry();
wane 0:88dc49222b35 435 if (!entryReady)
wane 0:88dc49222b35 436 break;
wane 0:88dc49222b35 437 else
wane 0:88dc49222b35 438 entryState = 3;
wane 0:88dc49222b35 439 case 3:
wane 0:88dc49222b35 440 sscanf(inBuf, "%d", &i);
wane 0:88dc49222b35 441 if (i < 0 || i >= 100) {
wane 0:88dc49222b35 442 printf("\n\rEnter a temperature between 0F and 100F: ");
wane 0:88dc49222b35 443 entryReady = false;
wane 0:88dc49222b35 444 entryState = 2;
wane 0:88dc49222b35 445 break;
wane 0:88dc49222b35 446 } else {
wane 0:88dc49222b35 447 temp = i;
wane 0:88dc49222b35 448 printf("Current temperature is now %dF.\n\r", i);
wane 0:88dc49222b35 449 updateCurTempDisplay = true;
wane 0:88dc49222b35 450 entryState = 1;
wane 0:88dc49222b35 451 done = true;
wane 0:88dc49222b35 452 calibratePot();
wane 0:88dc49222b35 453 break;
wane 0:88dc49222b35 454 }
wane 0:88dc49222b35 455
wane 0:88dc49222b35 456
wane 0:88dc49222b35 457 }
wane 0:88dc49222b35 458 return done;
wane 0:88dc49222b35 459
wane 0:88dc49222b35 460 }
wane 0:88dc49222b35 461
wane 0:88dc49222b35 462 // Peep if serial data is received and read if so
wane 0:88dc49222b35 463 void peepEntry()
wane 0:88dc49222b35 464 {
wane 0:88dc49222b35 465 int i;
wane 0:88dc49222b35 466 char c;
wane 0:88dc49222b35 467 i = pc.readable();
wane 0:88dc49222b35 468
wane 0:88dc49222b35 469 if (i > 0) {
wane 0:88dc49222b35 470 //pc.printf("%d: ", i);
wane 0:88dc49222b35 471 while (i > 0) {
wane 0:88dc49222b35 472 c = pc.getc();
wane 0:88dc49222b35 473
wane 0:88dc49222b35 474 if (c == '\r') {
wane 0:88dc49222b35 475 pc.printf("\n\r");
wane 0:88dc49222b35 476 inBuf[pos] = '\0';
wane 0:88dc49222b35 477 //pc.printf("Return: %s\n\r", inBuf);
wane 0:88dc49222b35 478 pos = 0;
wane 0:88dc49222b35 479 entryReady = true;
wane 0:88dc49222b35 480
wane 0:88dc49222b35 481 } else {
wane 0:88dc49222b35 482 //pc.printf("%c\n\r", c);
wane 0:88dc49222b35 483 pc.putc(c);
wane 0:88dc49222b35 484 inBuf[pos] = c;
wane 0:88dc49222b35 485 pos++;
wane 0:88dc49222b35 486 }
wane 0:88dc49222b35 487 i--;
wane 0:88dc49222b35 488 }
wane 0:88dc49222b35 489
wane 0:88dc49222b35 490 }
wane 0:88dc49222b35 491 }
wane 0:88dc49222b35 492
wane 0:88dc49222b35 493 // Non-blockingly set a passcode
wane 0:88dc49222b35 494 // Input: None
wane 0:88dc49222b35 495 bool SetPasscode()
wane 0:88dc49222b35 496 {
wane 0:88dc49222b35 497 int i;
wane 0:88dc49222b35 498 bool done = false;
wane 0:88dc49222b35 499
wane 0:88dc49222b35 500 switch (entryState)
wane 0:88dc49222b35 501 {
wane 0:88dc49222b35 502 case 0:
wane 0:88dc49222b35 503 break;
wane 0:88dc49222b35 504 case 1:
wane 0:88dc49222b35 505 if (statusAlarm & 0x80000000)
wane 0:88dc49222b35 506 {
wane 0:88dc49222b35 507 if (!sPCOK)
wane 0:88dc49222b35 508 entryState = 2;
wane 0:88dc49222b35 509 else
wane 0:88dc49222b35 510 entryState = 5;
wane 0:88dc49222b35 511 }
wane 0:88dc49222b35 512 else
wane 0:88dc49222b35 513 {
wane 0:88dc49222b35 514 pc.printf("No USB connection detected. Check USB device being connected.\n\r");
wane 0:88dc49222b35 515 }
wane 0:88dc49222b35 516 break;
wane 0:88dc49222b35 517
wane 0:88dc49222b35 518 case 2:
wane 0:88dc49222b35 519 pc.printf("\n\rEnter a 4-digit passcode: ");
wane 0:88dc49222b35 520 entryReady = false;
wane 0:88dc49222b35 521 entryState = 3;
wane 0:88dc49222b35 522 break;
wane 0:88dc49222b35 523 case 3:
wane 0:88dc49222b35 524 peepEntry();
wane 0:88dc49222b35 525 if (!entryReady)
wane 0:88dc49222b35 526 break;
wane 0:88dc49222b35 527 else
wane 0:88dc49222b35 528 entryState = 4;
wane 0:88dc49222b35 529 case 4:
wane 0:88dc49222b35 530 sscanf(inBuf, "%d", &i);
wane 0:88dc49222b35 531 if (i < 0000 || i > 9999) {
wane 0:88dc49222b35 532 pc.printf("\n\rEnter a passcode between 0000 and 9999: ");
wane 0:88dc49222b35 533 entryReady = false;
wane 0:88dc49222b35 534 entryState = 3;
wane 0:88dc49222b35 535 break;
wane 0:88dc49222b35 536 } else {
wane 0:88dc49222b35 537 passcode = i;
wane 0:88dc49222b35 538 pc.printf("\n\rPasscode is set (%d).\n\r", passcode);
wane 0:88dc49222b35 539 sPCOK = true;
wane 0:88dc49222b35 540 entryState = 5;
wane 0:88dc49222b35 541 }
wane 0:88dc49222b35 542 case 5:
wane 0:88dc49222b35 543 sLockActive = true;
wane 0:88dc49222b35 544 lockLed = 1;
wane 0:88dc49222b35 545 updateJoyDisplay = true;
wane 0:88dc49222b35 546 pc.printf("USB is now locked. Enter passcode to unlock.\n\r");
wane 0:88dc49222b35 547 entryState = 1;
wane 0:88dc49222b35 548 done = true;
wane 0:88dc49222b35 549 break;
wane 0:88dc49222b35 550 }
wane 0:88dc49222b35 551 return done;
wane 0:88dc49222b35 552 }
wane 0:88dc49222b35 553
wane 0:88dc49222b35 554 // Non-blockingly enter data to unlock passcode
wane 0:88dc49222b35 555 bool UnlockPasscode()
wane 0:88dc49222b35 556 {
wane 0:88dc49222b35 557 int i = 0;
wane 0:88dc49222b35 558 bool done = false;
wane 0:88dc49222b35 559
wane 0:88dc49222b35 560 switch (entryState)
wane 0:88dc49222b35 561 {
wane 0:88dc49222b35 562 case 0:
wane 0:88dc49222b35 563 break;
wane 0:88dc49222b35 564 case 1:
wane 0:88dc49222b35 565 pc.printf("\n\rTo unlock, enter a 4-digit passcode: ");
wane 0:88dc49222b35 566 entryReady = false;
wane 0:88dc49222b35 567 entryState = 2;
wane 0:88dc49222b35 568 break;
wane 0:88dc49222b35 569 case 2:
wane 0:88dc49222b35 570 peepEntry();
wane 0:88dc49222b35 571 if (!entryReady)
wane 0:88dc49222b35 572 break;
wane 0:88dc49222b35 573 else
wane 0:88dc49222b35 574 entryState = 3;
wane 0:88dc49222b35 575 case 3:
wane 0:88dc49222b35 576 sscanf(inBuf, "%d", &i);
wane 0:88dc49222b35 577 if (i < 0000 || i > 9999) {
wane 0:88dc49222b35 578 pc.printf("\n\rEnter a passcode between 0000 and 9999: ");
wane 0:88dc49222b35 579 entryReady = false;
wane 0:88dc49222b35 580 entryState = 3;
wane 0:88dc49222b35 581 } else {
wane 0:88dc49222b35 582 if (passcode == i) {
wane 0:88dc49222b35 583 pc.printf("\n\r====> Unlock successful. :-) \n\r");
wane 0:88dc49222b35 584 sLockActive = false;
wane 0:88dc49222b35 585 statusAlarm &= 0xFFFFFFFD;
wane 0:88dc49222b35 586 lockLed = 0;
wane 0:88dc49222b35 587 updateJoyDisplay = true;
wane 0:88dc49222b35 588 } else {
wane 0:88dc49222b35 589 pc.printf("\n\r====> Incorrect passcode!\n\r");
wane 0:88dc49222b35 590 }
wane 0:88dc49222b35 591 done = true;
wane 0:88dc49222b35 592 entryState = 1;
wane 0:88dc49222b35 593
wane 0:88dc49222b35 594 }
wane 0:88dc49222b35 595 break;
wane 0:88dc49222b35 596
wane 0:88dc49222b35 597 }
wane 0:88dc49222b35 598 return done;
wane 0:88dc49222b35 599 }
wane 0:88dc49222b35 600
wane 0:88dc49222b35 601 // Check if USB is connected
wane 0:88dc49222b35 602 // To read lock status: bit0=NUM_LOCK bit1=CAP_LOCK bit2=SCROLL_LOCK
wane 0:88dc49222b35 603 void USBConnCheck()
wane 0:88dc49222b35 604 {
wane 0:88dc49222b35 605 char status = 0;
wane 0:88dc49222b35 606 char result;
wane 0:88dc49222b35 607
wane 0:88dc49222b35 608 //if (!(statusAlarm & 0x80000000))
wane 0:88dc49222b35 609 //{
wane 0:88dc49222b35 610 // dev.keyCode(KEY_NUM_LOCK);
wane 0:88dc49222b35 611
wane 0:88dc49222b35 612 if (dev.keyCode(KEY_CAPS_LOCK))
wane 0:88dc49222b35 613 printf("\rSend KEY_CAPS_LOCK OK\n\r");
wane 0:88dc49222b35 614
wane 0:88dc49222b35 615 status = dev.lockStatus();
wane 0:88dc49222b35 616 //printf("1: lockStatus = 0x%x statusAlarm = 0x%x\n\r", status, statusAlarm);
wane 0:88dc49222b35 617 if (!(statusAlarm & 0x80000000) && (status & 0x2))
wane 0:88dc49222b35 618 {
wane 0:88dc49222b35 619 statusAlarm |= 0x80000000;
wane 0:88dc49222b35 620 result = true;
wane 0:88dc49222b35 621 }
wane 0:88dc49222b35 622 else if ((statusAlarm & 0x80000000) && !(status & 0x2))
wane 0:88dc49222b35 623 {
wane 0:88dc49222b35 624 statusAlarm &= 0x7FFFFFFF;
wane 0:88dc49222b35 625 result = false;
wane 0:88dc49222b35 626 }
wane 0:88dc49222b35 627 //printf("2: lockStatus = 0x%x statusAlarm = 0x%x\n\r", status, statusAlarm);
wane 0:88dc49222b35 628 //return result;
wane 0:88dc49222b35 629
wane 0:88dc49222b35 630 }
wane 0:88dc49222b35 631
wane 0:88dc49222b35 632 // Turn on and off the alarm comparing the current temperature with and the set temperature
wane 0:88dc49222b35 633 // Input: None
wane 0:88dc49222b35 634 void TempMonitor()
wane 0:88dc49222b35 635 {
wane 0:88dc49222b35 636 // Record current state of relay switch
wane 0:88dc49222b35 637 int tempAlarm = statusAlarm & 0x1;
wane 0:88dc49222b35 638 if (((temp < (setLowerTemp - tol)) || (temp > (setUpperTemp + tol))) && sHealthFeatureActive)
wane 0:88dc49222b35 639 {
wane 0:88dc49222b35 640 statusAlarm |= 0x1;
wane 0:88dc49222b35 641 alarmType = 0;
wane 0:88dc49222b35 642 }
wane 0:88dc49222b35 643 else if (((temp >= setLowerTemp) && (temp <= setUpperTemp)) || !sHealthFeatureActive)
wane 0:88dc49222b35 644 {
wane 0:88dc49222b35 645 statusAlarm &= 0xFFFFFFFE;
wane 0:88dc49222b35 646 }
wane 0:88dc49222b35 647 // When alarm is turned on or off
wane 0:88dc49222b35 648 if (tempAlarm != (statusAlarm & 0x1))
wane 0:88dc49222b35 649 {
wane 0:88dc49222b35 650 seconds = time(NULL);
wane 0:88dc49222b35 651 char buffer[32];
wane 0:88dc49222b35 652 strftime(buffer, 32, "%T", localtime(&seconds));
wane 0:88dc49222b35 653
wane 0:88dc49222b35 654 if (statusAlarm & 0x1)
wane 0:88dc49222b35 655 {
wane 0:88dc49222b35 656 if (timer2.read())
wane 0:88dc49222b35 657 {
wane 0:88dc49222b35 658 timer2.stop();
wane 0:88dc49222b35 659 pc.printf("Temperature Alarm off for %.2f sec.\n\r", timer2.read());
wane 0:88dc49222b35 660 }
wane 0:88dc49222b35 661 timer2.reset();
wane 0:88dc49222b35 662 pc.printf("Temperature Alarm on.... %s\n\r", buffer);
wane 0:88dc49222b35 663 timer2.start();
wane 0:88dc49222b35 664 }
wane 0:88dc49222b35 665 else
wane 0:88dc49222b35 666 {
wane 0:88dc49222b35 667 timer2.stop();
wane 0:88dc49222b35 668 timeElapsed = timer2.read();
wane 0:88dc49222b35 669 pc.printf("Temperature Alarm off... %s (Duration: %.2f sec)\n\r", buffer, timeElapsed);
wane 0:88dc49222b35 670 timer2.reset();
wane 0:88dc49222b35 671 timer2.start();
wane 0:88dc49222b35 672 }
wane 0:88dc49222b35 673 updateJoyDisplay = true;
wane 0:88dc49222b35 674 }
wane 0:88dc49222b35 675 }
wane 0:88dc49222b35 676
wane 0:88dc49222b35 677
wane 0:88dc49222b35 678
wane 0:88dc49222b35 679 // Read temperature sensor
wane 0:88dc49222b35 680 // Input: None
wane 0:88dc49222b35 681 void ReadTemp()
wane 0:88dc49222b35 682 {
wane 0:88dc49222b35 683 //temp = Ctmp.read();
wane 0:88dc49222b35 684 temp = Ctmp.read()*1.8+32;
wane 0:88dc49222b35 685 updateCurTempDisplay = true;
wane 0:88dc49222b35 686 }
wane 0:88dc49222b35 687
wane 0:88dc49222b35 688 // Monitor accelerometer to detect motion and turn on and off the alarm after comparing the motion data with
wane 0:88dc49222b35 689 // preconfigurated motion factor.
wane 0:88dc49222b35 690 void MotionMonitor()
wane 0:88dc49222b35 691 {
wane 0:88dc49222b35 692 //Xaxis_p = MMA.x() || -MMA.x();
wane 0:88dc49222b35 693
wane 0:88dc49222b35 694 float xpos, ypos, zpos;
wane 0:88dc49222b35 695 float senNum = senParm[senLevel].factor;
wane 0:88dc49222b35 696 xpos = MMA.x();
wane 0:88dc49222b35 697 ypos = MMA.y();
wane 0:88dc49222b35 698 zpos = MMA.z();
wane 0:88dc49222b35 699 if ((xpos > senNum || xpos < -(senNum) || ypos > senNum || ypos < -(senNum)) && sSecurityFeatureActive)
wane 0:88dc49222b35 700 {
wane 0:88dc49222b35 701 statusAlarm |= 0x2;
wane 0:88dc49222b35 702 pc.printf("Security Alarm ON 0x%x(senNum: %f Xpos: %6.3f Ypos: %6.3f Zpos: %6.3f)\n\r", statusAlarm, senNum, xpos, ypos, zpos);
wane 0:88dc49222b35 703 //updateJoyDisplay = true;
wane 0:88dc49222b35 704 }
wane 0:88dc49222b35 705 else
wane 0:88dc49222b35 706 {
wane 0:88dc49222b35 707 if ((statusAlarm & 0x2) && (mode == 0 || !sLockActive))
wane 0:88dc49222b35 708 {
wane 0:88dc49222b35 709 statusAlarm &= 0xFFFFFFFD;
wane 0:88dc49222b35 710 pc.printf("Security Alarm OFF 0x%x(Xpos: %6.3f Ypos: %6.3f Zpos: %6.3f)\n\r", statusAlarm, xpos, ypos, zpos);
wane 0:88dc49222b35 711 }
wane 0:88dc49222b35 712 //else
wane 0:88dc49222b35 713 // pc.printf("Security Alarm %s (Xpos: %6.3f Ypos: %6.3f Zpos: %6.3f)\n\r", (statusAlarm & 0x2)? "sON": "sOFF", xpos, ypos, zpos);
wane 0:88dc49222b35 714 //updateJoyDisplay = true;
wane 0:88dc49222b35 715 }
wane 0:88dc49222b35 716 }
wane 0:88dc49222b35 717
wane 0:88dc49222b35 718 // Display date, time, heater state, relay state, current and set temperature at LCD
wane 0:88dc49222b35 719 // Input: None
wane 0:88dc49222b35 720 void DisplayLCD()
wane 0:88dc49222b35 721 {
wane 0:88dc49222b35 722 seconds = time(NULL);
wane 0:88dc49222b35 723
wane 0:88dc49222b35 724 char buffer[32];
wane 0:88dc49222b35 725 strftime(buffer, 32, "%F %T", localtime(&seconds));
wane 0:88dc49222b35 726
wane 0:88dc49222b35 727 lcd.locate(0,3);
wane 0:88dc49222b35 728 lcd.printf("%s\n",buffer);
wane 0:88dc49222b35 729 if (updateCurTempDisplay || updateJoyDisplay)
wane 0:88dc49222b35 730 {
wane 0:88dc49222b35 731 lcd.printf("Now: %.1f%c L:%3.0f%c U: %3.1f%c\n", temp, deg, setLowerTemp, deg, setUpperTemp, deg);
wane 0:88dc49222b35 732 updateCurTempDisplay = false;
wane 0:88dc49222b35 733 }
wane 0:88dc49222b35 734
wane 0:88dc49222b35 735
wane 0:88dc49222b35 736 if (updateJoyDisplay)
wane 0:88dc49222b35 737 {
wane 0:88dc49222b35 738 lcd.printf("Mode: %c %1s%2s Status: %s%s\n", modeSym[mode], sHealthFeatureActive? "H": " ", senParm[senLevel].sym, sLockActive? "L":" ", sAlarmOn? "A": " ");
wane 0:88dc49222b35 739 updateJoyDisplay = false;
wane 0:88dc49222b35 740 }
wane 0:88dc49222b35 741
wane 0:88dc49222b35 742 }
wane 0:88dc49222b35 743
wane 0:88dc49222b35 744 // Check if alarm is to be triggered by either temp or security events
wane 0:88dc49222b35 745 // Do buzz for temperature and security alarm events accordingly
wane 0:88dc49222b35 746 void AlarmCheck()
wane 0:88dc49222b35 747 {
wane 0:88dc49222b35 748 bool prevState = sAlarmOn;
wane 0:88dc49222b35 749 if (statusAlarm & 0x1 || statusAlarm & 0x2)
wane 0:88dc49222b35 750 sAlarmOn = ON;
wane 0:88dc49222b35 751 else
wane 0:88dc49222b35 752 sAlarmOn = OFF;
wane 0:88dc49222b35 753
wane 0:88dc49222b35 754 if (statusAlarm & 0x80000000)
wane 0:88dc49222b35 755 connectionLed = 1;
wane 0:88dc49222b35 756 else
wane 0:88dc49222b35 757 connectionLed = 0;
wane 0:88dc49222b35 758
wane 0:88dc49222b35 759 if (prevState != sAlarmOn)
wane 0:88dc49222b35 760 updateJoyDisplay = true;
wane 0:88dc49222b35 761
wane 0:88dc49222b35 762 //leds = statusAlarm;
wane 0:88dc49222b35 763 if ((statusAlarm & 0x2) && (statusAlarm & 0x1))
wane 0:88dc49222b35 764 {
wane 0:88dc49222b35 765 buzzOn(1, BUZZ_SPERIOD);
wane 0:88dc49222b35 766 ledOn(1, BUZZ_SPERIOD);
wane 0:88dc49222b35 767 ledOn(0, BUZZ_TPERIOD);
wane 0:88dc49222b35 768 }
wane 0:88dc49222b35 769 // Security alarm
wane 0:88dc49222b35 770 else if (statusAlarm & 0x2)
wane 0:88dc49222b35 771 {
wane 0:88dc49222b35 772 buzzOn(1, BUZZ_SPERIOD);
wane 0:88dc49222b35 773 ledOn(1, BUZZ_SPERIOD);
wane 0:88dc49222b35 774 }
wane 0:88dc49222b35 775 // Temperature alarm
wane 0:88dc49222b35 776 else if (statusAlarm & 0x1)
wane 0:88dc49222b35 777 {
wane 0:88dc49222b35 778 buzzOn(0, BUZZ_TPERIOD);
wane 0:88dc49222b35 779 ledOn(0, BUZZ_TPERIOD);
wane 0:88dc49222b35 780 }
wane 0:88dc49222b35 781 }
wane 0:88dc49222b35 782
wane 0:88dc49222b35 783
wane 0:88dc49222b35 784 // Initialize settings
wane 0:88dc49222b35 785 void Init(void)
wane 0:88dc49222b35 786 {
wane 0:88dc49222b35 787 SetTime(YEAR, MONTH, DATE, HOUR, MIN, 0);
wane 0:88dc49222b35 788
wane 0:88dc49222b35 789 IRQFire.rise(&ISRFirePressed);
wane 0:88dc49222b35 790 IRQJoyUp.rise(&ISRJoyUp);
wane 0:88dc49222b35 791 IRQJoyDown.rise(&ISRJoyDown);
wane 0:88dc49222b35 792 IRQJoyLeft.rise(&ISRJoyLeft);
wane 0:88dc49222b35 793 IRQJoyRight.rise(&ISRJoyRight);
wane 0:88dc49222b35 794 timer1.attach(&DisplayLCD, 1);
wane 0:88dc49222b35 795 timer3.attach(&debounce, 1);
wane 0:88dc49222b35 796 //timer4.attach(&USBConnCheck, 2);
wane 0:88dc49222b35 797 timer4.attach(&AlarmCheck, 1);
wane 0:88dc49222b35 798 //timer2.attach(&ReadTemp, 5);
wane 0:88dc49222b35 799 sHealthFeatureActive = OFF;
wane 0:88dc49222b35 800 sSecurityFeatureActive = OFF;
wane 0:88dc49222b35 801 sAlarmOn = OFF;
wane 0:88dc49222b35 802 statusAlarm = 0;
wane 0:88dc49222b35 803 sState = 0;
wane 0:88dc49222b35 804 setLowerTemp = DEF_LOWER_TEMP;
wane 0:88dc49222b35 805 setUpperTemp = DEF_UPPER_TEMP;
wane 0:88dc49222b35 806 tempOverride = false;
wane 0:88dc49222b35 807 senLevel = 0;
wane 0:88dc49222b35 808 buzzPattern = 0;
wane 0:88dc49222b35 809 buzzPeriod = 0.2;
wane 0:88dc49222b35 810 mode = 0;
wane 0:88dc49222b35 811 timeElapsed = 0;
wane 0:88dc49222b35 812 entryState = 1;
wane 0:88dc49222b35 813 lcd.cls();
wane 0:88dc49222b35 814 lcd.locate(0,3);
wane 0:88dc49222b35 815 updateJoyDisplay = true;
wane 0:88dc49222b35 816
wane 0:88dc49222b35 817 calibratePot();
wane 0:88dc49222b35 818 pc.printf("\n\rHealth & Security Monitoring starts...\n\r");
wane 0:88dc49222b35 819
wane 0:88dc49222b35 820 }
wane 0:88dc49222b35 821
wane 0:88dc49222b35 822 // Main loop in executing major temperature, motion monitoring tasks and alarm check task
wane 0:88dc49222b35 823 void FSM(void)
wane 0:88dc49222b35 824 {
wane 0:88dc49222b35 825 while(1)
wane 0:88dc49222b35 826 {
wane 0:88dc49222b35 827 //USBConnCheck();
wane 0:88dc49222b35 828
wane 0:88dc49222b35 829 // Override temperature read for testing. Use pot to control temperature
wane 0:88dc49222b35 830 if (!tempOverride)
wane 0:88dc49222b35 831 ReadTemp();
wane 0:88dc49222b35 832
wane 0:88dc49222b35 833 setLowerTemp = lowerTempBase + (pot1.read()-potBase1) * 12;
wane 0:88dc49222b35 834 setUpperTemp = upperTempBase + (pot2.read()-potBase2) * 12;
wane 0:88dc49222b35 835 updateCurTempDisplay = true;
wane 0:88dc49222b35 836
wane 0:88dc49222b35 837 switch (gState)
wane 0:88dc49222b35 838 {
wane 0:88dc49222b35 839 case 0:
wane 0:88dc49222b35 840 break;
wane 0:88dc49222b35 841 case 1:
wane 0:88dc49222b35 842 if (SetPasscode())
wane 0:88dc49222b35 843 gState = 0;
wane 0:88dc49222b35 844 break;
wane 0:88dc49222b35 845 case 2:
wane 0:88dc49222b35 846 if (UnlockPasscode())
wane 0:88dc49222b35 847 gState = 0;
wane 0:88dc49222b35 848 break;
wane 0:88dc49222b35 849 case 3:
wane 0:88dc49222b35 850 if (EnterTemp())
wane 0:88dc49222b35 851 gState = 0;
wane 0:88dc49222b35 852 break;
wane 0:88dc49222b35 853 }
wane 0:88dc49222b35 854
wane 0:88dc49222b35 855 MotionMonitor();
wane 0:88dc49222b35 856 TempMonitor();
wane 0:88dc49222b35 857 //AlarmCheck();
wane 0:88dc49222b35 858
wane 0:88dc49222b35 859 /* Live check
wane 0:88dc49222b35 860 lockLed = 1;
wane 0:88dc49222b35 861 wait (0.1);
wane 0:88dc49222b35 862 lockLed = 0;
wane 0:88dc49222b35 863 wait(0.1);
wane 0:88dc49222b35 864 */
wane 0:88dc49222b35 865 }
wane 0:88dc49222b35 866
wane 0:88dc49222b35 867 }
wane 0:88dc49222b35 868
wane 0:88dc49222b35 869 int main()
wane 0:88dc49222b35 870 {
wane 0:88dc49222b35 871 //buzzTest();
wane 0:88dc49222b35 872 Init();
wane 0:88dc49222b35 873 FSM();
wane 0:88dc49222b35 874 }