Project 1 Self-powered Health & Security Monitoring System USB device
Dependencies: C12832_lcd LM75B MMA7660 USBDevice mbed
main.cpp@0:88dc49222b35, 2014-03-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |