150 lines
3.2 KiB
C++
150 lines
3.2 KiB
C++
/************************
|
|
*
|
|
* This file contains the main functions for checking the inputs, changing states,
|
|
* and updating interfaces.
|
|
*
|
|
*************************/
|
|
|
|
|
|
/********************
|
|
* Function to check the condition of the inputs and update the state.
|
|
*
|
|
*********************/
|
|
void app_Tasks(void){
|
|
|
|
// Read discrete input values from the buffer and shift into an array
|
|
P1.readBlockData(buf,2,0,DISCRETE_IN_BLOCK);
|
|
|
|
read = (buf[1] << 8);
|
|
read += (buf[0] << 0);
|
|
|
|
// If the input is in alarm, escalate the new state
|
|
for(int n=0; n<16; n++) {
|
|
input[n] = ((read >> n) & 0b1) ? 1 : 0;
|
|
if (input[n] != input_normal[n]){
|
|
if (alarm[n] > newState) {
|
|
newState = alarm[n];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Read analog values and scale to the unit ranges
|
|
analog1 = P1.readAnalog(anin1)*10.0/8191.0; // voltage
|
|
analog2 = P1.readAnalog(anin2)*10.0/8191.0; // voltage
|
|
analog3 = P1.readAnalog(anin3)*10.0/8191.0; // voltage
|
|
tSniffer = analog1*2000.0-5.0; // volts to micro curies per meter^3
|
|
vacuum = pow(10,(analog2-5.5)/0.5)*1000000; // volts to Torr - log scale
|
|
subPump = analog3*5; // volts to amps
|
|
|
|
|
|
// If the state didn't change, exit the function
|
|
if (newState == currentState) { return;}
|
|
|
|
|
|
// If there's a new alarm or a higher priority alarm, execute the new functions
|
|
if (newState > currentState) {
|
|
|
|
if (currentState == startup) {
|
|
normal_state();
|
|
}
|
|
|
|
switch (newState) {
|
|
|
|
case trouble1:
|
|
trouble1_state();
|
|
break;
|
|
|
|
case trouble2:
|
|
trouble2_state();
|
|
break;
|
|
|
|
case trouble3:
|
|
trouble3_state();
|
|
break;
|
|
}
|
|
|
|
} else if (newState == normal) {
|
|
normal_state();
|
|
}
|
|
|
|
// Set the current state to the new state
|
|
currentState = newState;
|
|
|
|
}
|
|
|
|
|
|
/********************
|
|
* Function to update interfaces- LEDs, LCD, log server, email notifications
|
|
*
|
|
********************/
|
|
|
|
|
|
void app_Interfaces(void) {
|
|
|
|
|
|
//if state == not-normal, check last update time, if >5min, send update
|
|
|
|
//send buffer to logs
|
|
|
|
//notifications (email?)
|
|
|
|
// LCD update, print, clear, etc
|
|
if (lcdLooper > 15 || lcdLooper < 0){
|
|
lcdLooper = 0;
|
|
} else if (input[lcdLooper] == input_normal[lcdLooper]){
|
|
lcdLooper++;
|
|
} else if (input[lcdLooper] != input_normal[lcdLooper]) {
|
|
lcdLine2 = lcdLooper;
|
|
}
|
|
|
|
if (currentState == normal) {
|
|
lcdLine2 = 16;
|
|
}
|
|
|
|
if (millis()-lcdTimer >= 2000) {
|
|
|
|
lcdLooper++;
|
|
|
|
lcdTimer = millis();
|
|
|
|
lcd.clear();
|
|
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(state_txt[currentState]);
|
|
lcd.setCursor(0, 1);
|
|
lcd.print(in_txt[lcdLine2]);
|
|
|
|
} else if (lcdTimer < 0) {
|
|
lcdTimer = millis();
|
|
}
|
|
|
|
if (millis()-lcdReset >= 20000) {
|
|
lcdReset = millis();
|
|
lcd.begin(16, 2);
|
|
lcd.clear();
|
|
}
|
|
|
|
|
|
// // Webpage function
|
|
// serve_webpage();
|
|
|
|
// // Diagnostics -> Serial Output
|
|
// if (digitalRead(SWITCH_BUILTIN) == 0){
|
|
// if ((millis()-printerPace)>3000) {
|
|
// print_states();
|
|
// printerPace = millis();
|
|
// }
|
|
// }
|
|
|
|
// // Heartbeat
|
|
// if ((millis()-heartBeat)>1200) {
|
|
// for (int i=0; i<4; i++){
|
|
// digitalWrite(heartbeat, !digitalRead(heartbeat));
|
|
// delay(100);
|
|
// }
|
|
// heartBeat = millis();
|
|
// }
|
|
|
|
}
|