/** * Main function of the program. Communications and buttons are continously * handled while data is collected according to settings and then stored at * the perscribed intervals if recording is enabled. */ int main (void) { init(); int i; bool dataReady = false, recordReady = false; RunData runData = {false, false, 0, 0, 0}; i = 0; DataPoint data; sensor_Reset(&data); runData.recordPeriod = (unsigned int)data_Read_EEPROM(DATA_GLOBAL_RATE_ADDR_H) << 8; runData.recordPeriod += (unsigned int)data_Read_EEPROM(DATA_GLOBAL_RATE_ADDR_L); if (runData.recordPeriod < MINIMUM_GLOBAL_INTERVAL) { runData.recordPeriod = MINIMUM_GLOBAL_INTERVAL; } while(1) { user_Handle_Buttons(&runData); coms_Handle(&runData); dataReady = sensor_Read(&data); recordReady |= timer_Job_Ready4(&(runData.recordTimer), runData.recordPeriod, &(runData.recordLastTime), false); if (dataReady && recordReady) { if (runData.record) { if (data_Write(&data) == ERROR) { runData.record = false; } } else if (runData.liveData) { for (i = 0; i < sizeof(DataPoint); i++) usart_Write(SERIAL, ((unsigned char*)(&data))[i]); runData.liveData = false; } runData.recordTimer = 0; recordReady = false; sensor_Reset(&data); } timer_Sleep(); } }
/** * Handles all actions related to button presses during operation, * including LED changes. Any change to runData to relayed through * the given pointer, such as the recording state. Also handles the * clear button implementation. * * @param runData Address of the runData structure. */ void user_Handle_Buttons(RunData *runData) { static unsigned int buttonTimer[3] = {0, 0, 0}; static unsigned int buttonLastTime[3] = {0, 0, 0}; int i; if (user_Get_Button(BUTTON_CLEAR)) { user_Set_LED(LED_CLEAR, ON); runData->liveData = false; if (timer_Job_Ready4(&buttonTimer[BUTTON_CLEAR - 1], 3000, &buttonLastTime[BUTTON_CLEAR - 1], false)) { runData->record = false; user_Set_LED(LED_STOP, ON); user_Set_LED(LED_START, OFF); data_Clear(); for (i = 0; i < 50; i++) { timer_Wait_MS(50); user_Toggle_LED(LED_CLEAR); } } } else { if ((runData->record || runData->liveData) && (runData->recordTimer > runData->recordPeriod - 5)) { user_Set_LED(BUTTON_CLEAR, ON); } else { user_Set_LED(BUTTON_CLEAR, OFF); } buttonTimer[BUTTON_CLEAR - 1] = 0; } if (user_Get_Button(BUTTON_START)) { runData->record = true; runData->liveData = false; } if (user_Get_Button(BUTTON_STOP)) { runData->record = false; runData->liveData = false; } if (runData->record || runData->liveData) { user_Set_LED(LED_START, ON); user_Set_LED(LED_STOP, OFF); } else { user_Set_LED(LED_STOP, ON); user_Set_LED(LED_START, OFF); } }
/** * Main function of the program. Communications and buttons are continuously * handled while data is collected according to settings and then stored at * the prescribed intervals if recording is enabled. */ int main (void) { init(); // keep track of if batched data sent via GSM today bool gsmSentData = false; int i; bool dataReady = false, recordReady = false; RunData runData = {false, false, 0, 0, 0}; i = 0; DataPoint data; sensor_Reset(&data); // set the global rate for our river monitoring application runData.recordPeriod = (unsigned int) MODEM_DATA_GLOBAL_RATE_H << 8; runData.recordPeriod += (unsigned int) MODEM_DATA_GLOBAL_RATE_L; data_Clear(); // erase all old data initially // don't read from settings from EEPROM for our application // runData.recordPeriod = (unsigned int)data_Read_EEPROM(DATA_GLOBAL_RATE_ADDR_H) << 8; // runData.recordPeriod += (unsigned int)data_Read_EEPROM(DATA_GLOBAL_RATE_ADDR_L); if (runData.recordPeriod < MINIMUM_GLOBAL_INTERVAL) { runData.recordPeriod = MINIMUM_GLOBAL_INTERVAL; } while(1) { user_Handle_Buttons(&runData); // The serial port is now connected to the GSM modem, not the FTDI chip... // coms_Handle(&runData); gsm_modem_Comms_Handle(&runData); dataReady = sensor_Read(&data); recordReady |= timer_Job_Ready4(&(runData.recordTimer), runData.recordPeriod, &(runData.recordLastTime), false); if (dataReady && recordReady) { if (runData.record) { if (data_Write(&data) == ERROR) { // since this is an un-monitored system we need to keep trying... //runData.record = false; } // at hours == 12 (noon) we power up the GSM modem and send all the data we have collected // then we clear EEPROM if (data.bitpack.data.hours == 12 && !gsmSentData) { gsm_modem_Comms_Transmit_Data(&data); gsmSentData = true; } else if (data.bitpack.data.hours == 13) { // reset for next day gsmSentData = false; } } else if (runData.liveData) { for (i = 0; i < sizeof(DataPoint); i++) usart_Write(SERIAL, ((unsigned char*)(&data))[i]); runData.liveData = false; } runData.recordTimer = 0; recordReady = false; sensor_Reset(&data); } timer_Sleep(); } }