예제 #1
0
void
loop( void )
{
    bool gpsDateTimeValid;
    bool gpsTransitDataValid;
    bool obdSpeedKphValid;

    /* Update GPS & OBD data drivers */
    GPS_update();
    OBD_update();

    /* Wait for valid date & time */
    if ( millis() - g_timer_sample_count_ms >= g_timer_sample_rate_ms ) {

        /* Blink status LED for 100ms */
        LED_blink( LED_ID_STATUS, 100 );

        /* Get GPS date & time */
        gpsDateTimeValid = GPS_getUtcDateTime( &g_sampledDateTime );

        /* Increase sample rate if GPS date and time is locked */
        g_timer_sample_rate_ms = ( gpsDateTimeValid )
                                    ? TIMER_GPS_LOCKED_SAMPLE_RATE_MS
                                    : TIMER_GPS_NOT_LOCKED_SAMPLE_RATE_MS;

        /* Get GPS transit data */
        gpsTransitDataValid = GPS_getTransitData( &g_sampledTransitData );

        /* Get OBD vehicle speed KPH */
        obdSpeedKphValid = OBD_getVehicleSpeed( &g_sampledVehicleSpeedKph );

        /* Output sampled data to serial port */
        Serial_printf(
            /* 0  1    2    3    4    5    6    7        8  9  A  B  C  D  E */
            "%lu,%u,%04u-%02u-%02uT%02u:%02u:%02uZ00:00,%u,%f,%f,%f,%f,%u,%f\n",

            GPS_getNumOfSatellites(),      /* 0 */

            gpsDateTimeValid,              /* 1 */
            g_sampledDateTime.year,        /* 2 */
            g_sampledDateTime.month,       /* 3 */
            g_sampledDateTime.day,         /* 4 */
            g_sampledDateTime.hour,        /* 5 */
            g_sampledDateTime.minute,      /* 6 */
            g_sampledDateTime.second,      /* 7 */

            gpsTransitDataValid,           /* 8 */
            g_sampledTransitData.lat,      /* 9 */
            g_sampledTransitData.lng,      /* A */
            g_sampledTransitData.speedMph, /* B */
            g_sampledTransitData.course,   /* C */

            obdSpeedKphValid,              /* D */
            g_sampledVehicleSpeedKph       /* E */
        );

        g_timer_sample_count_ms = millis();
    }

    /* Reset the WDT */
    WDT_reset();
}
예제 #2
0
// main loop
int main(void){
	
	uint8_t stateDS18=DS18B20_STATUS_READY;
	
	#ifdef USE_WDT
	WDT_init(WDTO_8S); 
	#endif
	
	
	initGPIO();
	LCD_init();
	
	showLcdSplash();
		
	setLcdInitialFields();
		
	paramLoadFromEeprom();
		
	USART1_config(USART1_MY_UBBRN,USART_DATA_FORMAT_8BITS|USART_STOP_BITS_1,USART_TRANSMIT_ENABLE|USART_RECEIVE_ENABLE| USART_INTERRUPT_ENABLE);
	
	USART1_sendStr("Hello");
	
	schedulerInit();
	
	// check for the default values
	#ifdef USE_WDT
	WDT_init(WDTO_8S);
	#endif
	
	
	sei(); //enable interrups
	
	// loop while	
    while(1){
		
		
		// cintrol zone
		if(flagTaskControl){
			#ifdef USE_WDT
			WDT_reset();
			#endif
			
			
			LED_RUN_OFF;
			// fire the DS
			if(stateDS18==DS18B20_STATUS_READY){
				DS18B20_startConv();
				stateDS18=DS18B20_STATUS_CONV;
			
			// check if convertion ended	
			}else if(stateDS18==DS18B20_STATUS_CONV){
				if(DS18B20_convComplete()){
					stateDS18=DS18B20_STATUS_END_CONV;
				}
			
			// convertion ready	
			}else if (stateDS18==DS18B20_STATUS_END_CONV){
				LED_RUN_ON;
				currentTemp=DS18B20_getTemp();
				stateDS18=DS18B20_STATUS_READY;
				
				currentStatus = checkTempError(currentTemp,currentTempSetPoint,currentHistSetPoint); // chec the out
				setOutputRelay(currentStatus);
				_delay_ms(50);
				LED_RUN_OFF;
					
				
			}
			
			flagTaskControl=0;
		}
		
		// user bottons area
		if(flagTaskReadButtons){
			#ifdef USE_WDT
			WDT_reset();
			#endif
			
			uint8_t portVal = readButtons();
			uint8_t code = decodeButton(portVal);
			code = debounceKey(code);
			
			#ifdef MAIN_DEBUG
			sprintf(debugBuffer,"Key %d",code);
			USART1_sendStr(debugBuffer);
			#endif
			
			stateMachine(code); // go to machine
			
			flagTaskReadButtons=0;
		}
		
		 
		 // lcd update area
		 if(flagTaskUpdateLcd){
			 #ifdef USE_WDT
			 WDT_reset();
			 #endif
			 //showLcdSavedMessage();
			 updateLcd(); // update the lcd
			 
			 flagTaskUpdateLcd=0;
		 }
		 
		 // save to eeprom
		 if(flagSaveParametersEeprom){
			 #ifdef USE_WDT
			 WDT_reset();
			 #endif
			 
			 paramSavetoEeprom(); // save value sto eeprom
			 showLcdSavedMessage();
			 setLcdInitialFields();
			 updateLcd();
			 flagSaveParametersEeprom=0;
		 }
		 
    }
}