Esempio n. 1
0
//External Functions
int gw3761_ResponseReset(p_gw3761 p)
{
    int res = 0;
    uint_t nFn;

    nFn = p->rmsg.data->p[2];
    switch (nFn) {
    case 1:     //F1
        res += 1;
        break;
    case 2:     //F2
        data_Clear();
        evt_Clear();
        res += 1;
        break;
    case 4:     //F3
    case 8:     //F4
        icp_Clear();
        data_Clear();
        evt_Clear();
        res += 1;
        break;
    default:
        break;
    }
    if (res)
        gw3761_TmsgConfirm(p);
    else
        gw3761_TmsgReject(p);
    if (nFn == 1) {
        os_thd_Sleep(10000);
        sys_Reset();
    }
    return res;
}
Esempio n. 2
0
/**
 * Polls the serial communications (via coms_Poll) and takes
 * the apropriate action in response.
 *
 * @param runData The runData state of the program. This is
 * required so the record and livedata flags can be switched.
 */
void coms_Handle(RunData *runData)
{
    ComsMsg msg = coms_Poll();
    bool valid = true;
    int i;

    switch (msg.type)
    {
        case BAD:
        case NONE:
            //Ignore bad coms
            break;

        case OVERFLOW:
            //ignore - stub for debug
            break;

        case VERIFY:
            runData->record = false;
            runData->liveData = false;
            usart_Write(SERIAL, COMS_VERIFY_OUT);
            usart_Write(SERIAL, COMS_VERIFY_MAJOR_VERSION);
            usart_Write(SERIAL, COMS_VERIFY_MINOR_VERSION);
            break;

        case READ_FLASH:
            ;
            uint32_t addr = ((uint32_t)msg.msg[0] << 16) + ((uint32_t)msg.msg[1] << 8) + msg.msg[2];
            uint32_t size = ((uint32_t)msg.msg[3] << 16) + ((uint32_t)msg.msg[4] << 8) + msg.msg[5];

            runData->record = false;
            runData->liveData = false;
            sst_Read_To_Coms((char*)&addr, size);

            break;

        case WRITE_TIME:
            ;
            Time t;

            runData->record = false;
            runData->liveData = false;

            t.seconds = msg.msg[0];
            t.minutes = msg.msg[1];
            t.hours   = msg.msg[2];
            t.dow     = msg.msg[3];
            t.date    = msg.msg[4];
            t.month   = msg.msg[5];
            t.year    = msg.msg[6];

            rtc_Set_Time(&t);

            usart_Write(SERIAL, COMS_WRITE_TIME_OUT);
            break;

        case READ_CONFIG:
            runData->record = false;
            runData->liveData = false;
            usart_Write(SERIAL, data_Read_EEPROM((msg.msg[0] << 8) + msg.msg[1]));
            break;

        case WRITE_CONFIG:
            runData->record = false;
            runData->liveData = false;
            data_Write_EEPROM((msg.msg[0] << 8) + msg.msg[1], msg.msg[2]);
            usart_Write(SERIAL, COMS_WRITE_CONFIG_OUT);
            break;

        case LIVE_DATA:
            runData->record = false;
            runData->liveData = true;

            usart_Write(SERIAL, COMS_LIVE_DATA_OUT);

            break;

        case HEADER_REQ:
            ;
            uint32_t header = data_Cur_Addr();

            usart_Write(SERIAL, ((char*)(&header))[2]);
            usart_Write(SERIAL, ((char*)(&header))[1]);
            usart_Write(SERIAL, ((char*)(&header))[0]);
            usart_Write(SERIAL, sizeof(DataPoint));
            break;
        case RESET_REQ:
            for (i = 0; i < COMS_RESET_REQ_SIZE; i++)
            {
                if (msg.msg[i] != resetConfirmation[i])
                {
                    valid = false;
                }
            }

            if (valid)
            {
                wdt_enable(WDTO_120MS);
            }

            break;

        case ERASE_REQ:
            for (i = 0; i < COMS_RESET_REQ_SIZE; i++)
            {
                if (msg.msg[i] != resetConfirmation[i])
                {
                    valid = false;
                }
            }

            if (valid)
            {
                data_Clear();
            }

            usart_Write(SERIAL, COMS_ERASE_REQ_OUT);

            break;

        case START_REQ:
            for (i = 0; i < COMS_RESET_REQ_SIZE; i++)
            {
                if (msg.msg[i] != resetConfirmation[i])
                {
                    valid = false;
                }
            }

            if (valid)
            {
                runData->record = true;
                runData->liveData = false;
            }

            usart_Write(SERIAL, COMS_START_REQ_OUT);

            break;
    }
}
Esempio n. 3
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);
    }
}
Esempio n. 4
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();
    }
}