[Firebug-cvs] mts400/apps/TestGPS_SHT .cvsignore,NONE,1.1 Makefile,NONE,1.1 gps_sht.nc,NONE,1.1 gps_
Brought to you by:
doolin
From: <do...@us...> - 2003-11-13 18:35:26
|
Update of /cvsroot/firebug/mts400/apps/TestGPS_SHT In directory sc8-pr-cvs1:/tmp/cvs-serv14732 Added Files: .cvsignore Makefile gps_sht.nc gps_shtM.nc Log Message: Test application for taking data from gps and sht sensors in same application. It does not currently work, there is a lockup somewhere in the gps sensor. Might need to power down the sht or something, hard to say right now. Getting this applet to work will be key for handling data in the networked application. --- NEW FILE: .cvsignore --- build *~ --- NEW FILE: Makefile --- COMPONENT=gps_sht SENSORBOARD=gps include ../Makelocal include $(TOSROOT)/apps/Makerules --- NEW FILE: gps_sht.nc --- /* -*- Mode: C; c-basic-indent: 3; indent-tabs-mode: nil -*- */ includes sensorboard; configuration gps_sht { } implementation { components Main, gps_shtM, MicaWbSwitch, UARTGpsPacket, SensirionHumidity, TimerC, LedsC; Main.StdControl -> gps_shtM.StdControl; Main.StdControl -> TimerC.StdControl; Main.StdControl -> MicaWbSwitch.StdControl; gps_shtM.Leds -> LedsC; gps_shtM.GPSTimer -> TimerC.Timer[unique("Timer")]; gps_shtM.SHTTimer -> TimerC.Timer[unique("Timer")]; gps_shtM.PowerSwitch -> MicaWbSwitch.Switch[0]; gps_shtM.IOSwitch -> MicaWbSwitch.Switch[1]; gps_shtM.GpsControl -> UARTGpsPacket; gps_shtM.GpsSend -> UARTGpsPacket; gps_shtM.GpsReceive -> UARTGpsPacket; gps_shtM.GpsCmd -> UARTGpsPacket.GpsCmd; // Wiring for Sensirion humidity/temperature sensor gps_shtM.TempHumControl -> SensirionHumidity; gps_shtM.Humidity -> SensirionHumidity.Humidity; gps_shtM.Temperature -> SensirionHumidity.Temperature; gps_shtM.HumidityError -> SensirionHumidity.HumidityError; gps_shtM.TemperatureError -> SensirionHumidity.TemperatureError; } --- NEW FILE: gps_shtM.nc --- /* -*- Mode: C; c-basic-indent: 3; indent-tabs-mode: nil -*- */ module gps_shtM { provides { interface StdControl; command void readGps(); command void stopGps(); } uses { interface Leds; interface Timer as GPSTimer; interface Timer as SHTTimer; interface StdControl as SwitchControl; interface Switch as PowerSwitch; interface Switch as IOSwitch; interface StdControl as GpsControl; interface I2CSwitchCmds as GpsCmd; interface BareSendMsg as GpsSend; interface ReceiveMsg as GpsReceive; interface SplitControl as TempHumControl; interface ADC as Humidity; interface ADC as Temperature; interface ADCError as HumidityError; interface ADCError as TemperatureError; } } implementation { #include "SODebug.h" #include "gps.h" /** 0 means GPS runs forever, 1 means it takes one reading * and powers down. * FIXME: The GPS sensor powers back up after it powers down, * this should not happen and is a problem. */ #define GPS_ONE_SHOT 1 char state; char gps_state; enum {IDLE, BUSY, BUSY_0, BUSY_1, GET_SAMPLE_0, GET_SAMPLE_1, OPENSCK, OPENDATA, CLOSESCK, CLOSEDATA, POWEROFF, MAIN_SWITCH_ON, MAIN_SWITCH_OFF, WAIT_SWITCH_ON, WAIT_SWITCH_OFF, TIMER, GPS_WORKING, GPS_FINISHED, HUMIDITY_DONE}; uint16_t HumData; command result_t StdControl.init() { init_debug(); call Leds.init(); /** Control.init in GpsPacket.nc */ call GpsControl.init(); call TempHumControl.init(); //init Sensirion return SUCCESS; } command result_t StdControl.start() { call Leds.redOn(); call HumidityError.enable(); //in case Sensirion doesn't respond call TemperatureError.enable(); // " /** Control.start in GpsPacket.nc, calls * SwitchControl.start and ByteControl.start() */ call GpsControl.start(); call GPSTimer.start(TIMER_REPEAT, 10000) ; call SHTTimer.start(TIMER_REPEAT, 2000) ; return SUCCESS; } command result_t StdControl.stop() { /** Turn the timer off so that it doesn't fire any * sensor readings. Timer.stop always returns success. */ call GPSTimer.stop(); call SHTTimer.stop(); return SUCCESS; } command void stopGps() { if (call GpsCmd.PowerSwitch(GPS_POWER_OFF)) { SODbg(DBG_USR2, "gps_newM.StdControl.stop(): GPS sensor powered off. \n"); } } /** Ok, this function turns on the gps unit for reading, * which is turned of elsewhere when the read is finished. * If the read isn't finished, the function exits. */ command void readGps() { if (gps_state == GPS_WORKING) { SODbg(DBG_USR2, "gps_newM.readGps(): GPS_WORKING\n"); return; } call Leds.greenToggle(); /* Implementation is in GpsPacket.nc */ if (call GpsCmd.PowerSwitch(GPS_POWER_ON)) { SODbg(DBG_USR2, "gps_newM.readGps(): GPS powered on\n"); gps_state = GPS_WORKING; } } event result_t GPSTimer.fired() { call readGps(); return SUCCESS; } event result_t SHTTimer.fired() { call Leds.redToggle(); call TempHumControl.start(); return SUCCESS; } event result_t PowerSwitch.getDone(char value) { return SUCCESS; } /** FIXME: Make sure we don't need the startDone, stopDone * calls. */ event result_t PowerSwitch.setDone(bool local_result) { switch(state) { case MAIN_SWITCH_ON: SODbg(DBG_USR2, "PowerSwitch.setDone() MAIN_SWITCH_ON\n"); state = IDLE; /** GpsControl is wired to GpsPacket.nc */ //signal GpsControl.startDone(); break; case MAIN_SWITCH_OFF: SODbg(DBG_USR2, "PowerSwitch.setDone() MAIN_SWITCH_OFF\n"); state = POWEROFF; /** GpsControl is wired to GpsPacket.nc */ //signal GpsControl.stopDone(); break; case WAIT_SWITCH_ON: SODbg(DBG_USR2, "PowerSwitch.setDone() WAIT_SWITCH_ON\n"); if (call PowerSwitch.set(MICAWB_GPS_POWER,1) == SUCCESS) { state = MAIN_SWITCH_ON; } break; case WAIT_SWITCH_OFF: SODbg(DBG_USR2, "PowerSwitch.setDone() WAIT_SWITCH_OFF\n"); if (call PowerSwitch.set(MICAWB_GPS_POWER,0) == SUCCESS) { state = MAIN_SWITCH_OFF; } default: break; } return SUCCESS; } event result_t PowerSwitch.setAllDone(bool local_result) { return SUCCESS; } event result_t IOSwitch.getDone(char value) { return SUCCESS; } event result_t IOSwitch.setAllDone(bool local_result) { return SUCCESS; } /** FIXME: Rewrite this with a switch/case. */ /** FIXME: I see no reason why we need I2C information this * high in the application. All this I2C bus info needs * to be shoved down a level, and wired from here to something * like turnSensorOn(), turnSensorOff(), etc. */ event result_t IOSwitch.setDone(bool local_result) { //SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): state: %i \n", state); if (state == OPENSCK) { //SCK line enabled SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): SCK enabled \n"); state = OPENDATA; return call IOSwitch.set(MICAWB_HUMIDITY_DATA,1); } else if (state == OPENDATA) { //Data line enabled SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): SDA enabled \n"); state = TIMER; SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): Timer Started, state: %i \n", state); return call GPSTimer.start(TIMER_ONE_SHOT, 100); } else if (state == CLOSESCK) { state = CLOSEDATA; SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): SCK disabled \n"); return call IOSwitch.set(MICAWB_HUMIDITY_DATA,0); } else if (state == CLOSEDATA) { SODbg(DBG_USR2, "gps_newM.IOSwitch.setDone(): SDA disabled \n"); } return SUCCESS; } /** * Packet received from GPS - ASCII msg * 1st byte in pkt is number of ascii bytes * async used only for testing. * * FIXME: Why is the data returned? It's passed in. * It should be declared const. * * This function is called from GpsPacket.receiveTask(). */ event TOS_MsgPtr GpsReceive.receive(TOS_MsgPtr data) { uint8_t i; GPS_MsgPtr gps_data = (GPS_MsgPtr)data; call Leds.greenToggle(); for (i=0; i<=gps_data->data[0]; i++) { /** UARTPutChar is an SODebug function. * FIXME: Change this to use a char[]. */ UARTPutChar(gps_data->data[i]); } SODbg(DBG_USR2, "\n"); /** FIXME: Pulled the preprocessor define out, * code this up as a user defined variable that * is set when the gps unit is initialized. */ #if GPS_ONE_SHOT { /** Already written out one message. */ static uint16_t msg_count = 1; if (msg_count == 2) { atomic { gps_state = GPS_FINISHED; } call stopGps(); msg_count = 0; } msg_count++; } #endif return data; } event result_t GpsSend.sendDone(TOS_MsgPtr msg, result_t success) { SODbg(DBG_USR2, "GpsSend.sendDone(): state: %i \n", state); return SUCCESS; } event result_t GpsCmd.SwitchesSet(uint8_t PowerState) { char tmp[] = {"Foo"}; //SODbg(DBG_USR2, "gps_new.GpsCmd.SwitchesSet(): PowerState: %i \n\n", PowerState); SODbg(DBG_USR2, "gps_new.GpsCmd.SwitchesSet(): dummy string: %s \n", tmp); call Leds.yellowOn(); call Leds.redOff(); return SUCCESS; } /****************************************************************************** * Sensirion SHT11 humidity/temperature sensor * - Humidity data is 12 bit: * Linear calc (no temp correction) * fRH = -4.0 + 0.0405 * data -0.0000028 * data^2 'RH linear * With temperature correction: * fRH = (fTemp - 25) * (0.01 + 0.00008 * data) + fRH 'RH true * - Temperature data is 14 bit * Temp(degC) = -38.4 + 0.0098 * data *****************************************************************************/ async event result_t Temperature.dataReady(uint16_t data) { float fTemp, fHumidity; fTemp = -38.4 + 0.0098*(float)data; atomic { fHumidity = -4.0 + 0.0405 * HumData -0.0000028 * HumData * HumData; fHumidity= (fTemp-25.0)* (0.01 + 0.00008 * HumData) + fHumidity; } fTemp = 10*fTemp; SODbg(DBG_USR2, "Humidity: Temp(adc): %i Humidity(adc): %i Temp(degCx10): %i Humidity(%): %i \n", data,HumData,(int)fTemp, (int)fHumidity); atomic { call TempHumControl.stop(); } return SUCCESS; } async event result_t Humidity.dataReady(uint16_t data) { atomic { HumData = data; } return call Temperature.getData(); } event result_t TempHumControl.startDone() { call Humidity.getData(); return SUCCESS; } event result_t TempHumControl.initDone() { return SUCCESS; } event result_t TempHumControl.stopDone() { state = HUMIDITY_DONE; return SUCCESS; } event result_t HumidityError.error(uint8_t token) { call Leds.redOff(); call Leds.yellowOff(); call Temperature.getData(); return SUCCESS; } event result_t TemperatureError.error(uint8_t token) { call TempHumControl.stop(); call Leds.yellowOff(); return SUCCESS; } } |