/************************ * * 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(); // } }