Exemplo n.º 1
0
/**
 * 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();
    }
}
Exemplo n.º 2
0
/**
 * 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);
    }
}
Exemplo n.º 3
0
/**
 * 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();
    }
}