Hi all,
I am working with MTS420 sensors to get Light readings. I have made a small app that will send the photo values when request is received. But the photo values received are weired.
e.g (0, 3 FF etc). Most of the times it is zero. I am unable to track the problem. I am attaching a code files.
can anyone help me?
Thanks
Mohan
includes TinyDBCmd; #include "Util.h" #ifdef MULTIHOP includes MultiHop; #endif
configuration TinyDBCmd { } implementation { components Main, TinyDBCmdM, GenericCommPromiscuous as Comm, MicaWbSwitch, LedsC, ADCC #ifdef MULTIHOP ,MultiHopRouter as multihopM, QueuedSend #endif ,IntersemaPressure ,SensirionHumidity ,Accel ,TaosPhoto ,Voltage , TestMTS400 ; Main.StdControl -> TinyDBCmdM; Main.StdControl -> TestMTS400; TinyDBCmdM.GetGPS -> TestMTS400; TinyDBCmdM.CommControl -> Comm; TinyDBCmdM.ReceiveRequest -> Comm.ReceiveMsg[AM_QUERY_REQUEST]; #ifdef MULTIHOP TinyDBCmdM.SendResponse -> multihopM.Send[AM_QUERY_RESPONSE]; Main.StdControl -> multihopM.StdControl; Main.StdControl -> QueuedSend.StdControl; multihopM.ReceiveMsg[AM_QUERY_REQUEST] -> Comm.ReceiveMsg[AM_QUERY_REQUEST]; #else TinyDBCmdM.SendResponse -> Comm.SendMsg[AM_QUERY_RESPONSE]; #endif TinyDBCmdM.Leds -> LedsC; //Pressure TinyDBCmdM.PressureControl -> IntersemaPressure; TinyDBCmdM.IntersemaPressure -> IntersemaPressure.Pressure; TinyDBCmdM.IntersemaCal -> IntersemaPressure; TinyDBCmdM.IntersemaTemp -> IntersemaPressure.Temperature; //Humidity TinyDBCmdM.HumidControl -> SensirionHumidity; TinyDBCmdM.Humidity -> SensirionHumidity.Humidity; TinyDBCmdM.Temperature -> SensirionHumidity.Temperature; TinyDBCmdM.HumidityError -> SensirionHumidity.HumidityError; TinyDBCmdM.TemperatureError -> SensirionHumidity.TemperatureError; //Accelerometer TinyDBCmdM.AccelControl -> Accel.StdControl; TinyDBCmdM.AccelCmd -> Accel.AccelCmd; TinyDBCmdM.AccelX -> Accel.AccelX; TinyDBCmdM.AccelY -> Accel.AccelY; //Photo TinyDBCmdM.PhotoControl -> TaosPhoto; TinyDBCmdM.TaosCh0 -> TaosPhoto.ADC[0]; TinyDBCmdM.TaosCh1 -> TaosPhoto.ADC[1]; //Battery Ref TinyDBCmdM.BattControl -> Voltage; TinyDBCmdM.ADCBATT -> Voltage; }
includes TinyDBCmd; includes gps; #include "Util.h" module TinyDBCmdM { provides interface StdControl; uses { interface Leds; //interface Timer; //Comm interface StdControl as CommControl; interface ReceiveMsg as ReceiveRequest; #ifdef MULTIHOP interface Send as SendResponse; #else interface SendMsg as SendResponse; #endif // Battery interface ADC as ADCBATT; interface StdControl as BattControl; //Pressure interface ADC as IntersemaTemp; interface ADC as IntersemaPressure; interface Calibration as IntersemaCal; interface SplitControl as PressureControl; //Humidity interface ADC as Humidity; interface ADC as Temperature; interface SplitControl as HumidControl; interface ADCError as HumidityError; interface ADCError as TemperatureError; //Accels interface StdControl as AccelControl; interface I2CSwitchCmds as AccelCmd; interface ADC as AccelX; interface ADC as AccelY; //Photo interface SplitControl as PhotoControl; interface ADC as TaosCh0; interface ADC as TaosCh1; //GPS interface GetGPS; } } implementation { TOS_Msg reqmsg, gpsmsg; TOS_MsgPtr request,gps; uint8_t cmd[12]; uint8_t qid; uint8_t epochid; int8_t radiobusy; //Sensor Attributes data char count; uint16_t calibration[4]; //intersema calibration words uint8_t nodeid; uint16_t vref; uint16_t humidity; uint16_t temperature; uint16_t intersematemp; uint16_t pressure; uint16_t taosch0; uint16_t taosch1; uint16_t accel_x; uint16_t accel_y; TOS_Msg resmsg; TOS_MsgPtr response; enum { BATTERY=3, PRESSURE=4, PRESSTEMP=5, HUMIDITY=6, HUMTEMP=7, ACCEL_X=8, ACCEL_Y=9, PHOTO=10, GPSDATA=11 }; uint8_t hour; uint8_t minute; uint8_t lat_deg; uint8_t long_deg; uint32_t dec_sec; uint32_t lat_dec_min; uint32_t long_dec_min; uint8_t nsewind; uint8_t fixed; char gga_fields[GGA_FIELDS][GPS_CHAR_PER_FIELD]; void startAttribute(int); void checkAttribute(); void clearAttributes(); task void SendGPSData() { GPSMsg *pack; #ifdef MULTIHOP uint16_t length; #endif if(!radiobusy) { #ifdef MULTIHOP pack = (GPSMsg *) call SendResponse.getBuffer(gps,&length); #else pack = (GPSMsg *)gps->data; #endif atomic { pack->nodeid = TOS_LOCAL_ADDRESS; pack->restype = 1; pack->qid = qid; pack->epochid = epochid; pack->lat_deg = call GetGPS.getLatDeg(); pack->long_deg = call GetGPS.getLongDeg(); pack->lat_dec_min = call GetGPS.getLatDecMin(); pack->long_dec_min = call GetGPS.getLongDecMin(); pack->nodeid = TOS_LOCAL_ADDRESS; pack->restype = 1; /*pack->hour = hour; pack->minute = minute; pack->lat_deg = lat_deg; pack->long_deg = long_deg; pack->dec_sec = dec_sec; pack->lat_dec_min = lat_dec_min; pack->long_dec_min = long_dec_min; pack->nsewind = nsewind; pack->fixed = fixed; */ radiobusy = 1; #ifdef MULTIHOP if(call SendResponse.send(gps,sizeof(QueryResponse))==SUCCESS) #else if(call SendResponse.send(TOS_BCAST_ADDR,sizeof(QueryResponse),gps)==SUCCESS) #endif { ; } else { radiobusy=0; post SendGPSData(); } } } } void clearAttributes() { atomic { vref = 0; humidity = 0; temperature = 0; calibration[0] = 0; calibration[1] = 0; calibration[2] = 0; calibration[3] = 0; intersematemp = 0; pressure = 0; taosch0 = 0; taosch1 = 0; accel_x = 0; accel_y = 0; nodeid = -1; } } command result_t StdControl.init() { radiobusy = 0; request = &reqmsg; gps = &gpsmsg; response = &resmsg; clearAttributes(); // usart1 is also connected to external serial flash // set usart1 lines to correct state TOSH_MAKE_FLASH_OUT_OUTPUT(); //tx output TOSH_MAKE_FLASH_CLK_OUTPUT(); //usart clk call Leds.init(); call BattControl.init(); call CommControl.init(); call PressureControl.init(); call HumidControl.init(); call AccelControl.init(); call PhotoControl.init(); return SUCCESS; } command result_t StdControl.start() { call CommControl.start(); call BattControl.start(); return SUCCESS; } command result_t StdControl.stop() { call CommControl.stop(); call BattControl.stop(); return SUCCESS; } task void broadCastResponse() { QueryResponse *pack; #ifdef MULTIHOP uint16_t length; #endif response = &resmsg; if(!radiobusy) { #ifdef MULTIHOP pack = (QueryResponse *) call SendResponse.getBuffer(response,&length); #else pack = (QueryResponse *)response->data; #endif atomic { pack->vref = vref; pack->nodeid = TOS_LOCAL_ADDRESS; pack->restype = 0; pack->qid = qid; pack->epochid = epochid; pack->humidity = humidity; pack->temperature = temperature; pack->cal_wrod1 = calibration[0]; pack->cal_wrod2 = calibration[1]; pack->cal_wrod3 = calibration[2]; pack->cal_wrod4 = calibration[3]; pack->intersematemp = intersematemp; pack->pressure = pressure; pack->accel_x = accel_x; pack->accel_y = accel_y; pack->taosch0 = taosch0; pack->taosch1 = taosch1; radiobusy = 1; #ifdef MULTIHOP if(call SendResponse.send(response,sizeof(QueryResponse))==SUCCESS) #else if(call SendResponse.send(TOS_BCAST_ADDR,sizeof(QueryResponse),response)==SUCCESS) #endif { ; } else { radiobusy=0; post broadCastResponse(); } } } } event result_t SendResponse.sendDone(TOS_MsgPtr sent, result_t success) { atomic radiobusy=0; call Leds.greenOff(); return SUCCESS; } event TOS_MsgPtr ReceiveRequest.receive(TOS_MsgPtr m) { uint8_t i; call Leds.greenToggle(); clearAttributes(); for(i=0;i<12;i++) { atomic cmd[i]=m->data[i]; } atomic { qid = cmd[0]; epochid = cmd[1]; } checkAttribute(); return m; } //// Pressure //// event result_t PressureControl.initDone() { return SUCCESS; } event result_t PressureControl.startDone() { call IntersemaCal.getData(); return SUCCESS; } event result_t IntersemaCal.dataReady(char word, uint16_t value) { // make sure we get all the calibration bytes count++; calibration[word-1] = value; if (count == 4) { call IntersemaPressure.getData(); } return SUCCESS; } async event result_t IntersemaPressure.dataReady(uint16_t data) { atomic pressure =data; call IntersemaTemp.getData(); return SUCCESS; } task void stopPressure() { count=0; call PressureControl.stop(); } async event result_t IntersemaTemp.dataReady(uint16_t data) { atomic intersematemp = data ; post stopPressure(); return SUCCESS; } event result_t PressureControl.stopDone() { checkAttribute(); return SUCCESS; } //// Humiidity //// event result_t HumidControl.initDone() { return SUCCESS; } event result_t HumidControl.startDone() { call Humidity.getData(); return SUCCESS; } async event result_t Humidity.dataReady(uint16_t data) { atomic humidity=data; call Temperature.getData(); return SUCCESS; } task void stopHumidity() { call HumidControl.stop(); } async event result_t Temperature.dataReady(uint16_t data) { atomic temperature =data; post stopHumidity(); return SUCCESS; } event result_t HumidControl.stopDone() { checkAttribute(); return SUCCESS; } event result_t HumidityError.error(uint8_t token) { post stopHumidity(); return SUCCESS; } event result_t TemperatureError.error(uint8_t token) { post stopHumidity(); return SUCCESS; } //// Photo //// event result_t PhotoControl.initDone() { return SUCCESS; } event result_t PhotoControl.startDone() { call TaosCh0.getData(); return SUCCESS; } async event result_t TaosCh0.dataReady(uint16_t data) { atomic taosch0 = data & 0x00ff; call TaosCh1.getData(); return SUCCESS; } task void stopPhoto() { call PhotoControl.stop(); } async event result_t TaosCh1.dataReady(uint16_t data) { atomic taosch1 = data & 0x00ff; post stopPhoto(); return SUCCESS; } event result_t PhotoControl.stopDone() { checkAttribute(); return SUCCESS; } //// Accel //// event result_t AccelCmd.SwitchesSet(uint8_t PowerState) { // power on/off if (PowerState){ call AccelX.getData(); //start measuring X accel axis } else { checkAttribute(); } return SUCCESS; } async event result_t AccelX.dataReady(uint16_t data) { atomic accel_x = data; call AccelY.getData(); return SUCCESS; } task void stopAccel() { call AccelCmd.PowerSwitch(0); } async event result_t AccelY.dataReady(uint16_t data){ atomic accel_y = data & 0xff; //rsvd = data >> 8; post stopAccel(); return SUCCESS; } //// Battery //// task void stopBattery() { call BattControl.stop(); checkAttribute(); } async event result_t ADCBATT.dataReady(uint16_t data) { call Leds.yellowToggle(); atomic vref = data ; //post stopBattery(); return SUCCESS; } //// General Functions //// void checkAttribute() { uint8_t flag = 0; int i = 0; uint8_t attributeid = 0; for(i=3;i<12;i++) { if( cmd[i] == 1 ) { flag = 1; attributeid = i; break; } } if( flag == 1 ) { startAttribute(attributeid); } else { post broadCastResponse(); } } void startAttribute(int id) { switch(id) { case BATTERY: { atomic cmd[BATTERY] = 0; call Leds.yellowToggle(); call BattControl.start(); break; } case PRESSURE: case PRESSTEMP: { atomic cmd[PRESSURE] = 0; atomic cmd[PRESSTEMP] = 0; call PressureControl.start(); break; } case HUMIDITY: case HUMTEMP: { atomic cmd[HUMIDITY] = 0; atomic cmd[HUMTEMP] = 0; call HumidControl.start(); break; } case ACCEL_X: case ACCEL_Y: { atomic cmd[ACCEL_X] = 0; atomic cmd[ACCEL_Y] = 0; call AccelCmd.PowerSwitch(1); //power on break; } case PHOTO: { atomic cmd[PHOTO]=0; call PhotoControl.start(); break; } case GPSDATA: { atomic cmd[GPSDATA]=0; post SendGPSData(); break; } } } }
typedef struct QueryReqStruct { uint8_t qid; //0 uint8_t epoch; //1 uint8_t nodeid; //2 uint8_t voltage; //3 uint8_t pressure; //4 uint8_t pressuretemp; //5 uint8_t humid; //6 uint8_t humtemp; //7 uint8_t accel_x; //8 uint8_t accel_y; //9 uint8_t photo; //10 uint8_t gps; //11 }QueryRequest; typedef struct QueryResStruct { uint8_t qid; //Query ID uint8_t epochid; uint8_t nodeid; //Node ID from which response uint8_t restype; //Response type 0 - sensor, 1 - GPS uint16_t vref; uint16_t cal_wrod1; uint16_t cal_wrod2; uint16_t cal_wrod3; uint16_t cal_wrod4; uint16_t intersematemp; uint16_t pressure; uint16_t humidity; uint16_t temperature; uint16_t accel_x; uint16_t accel_y; uint16_t taosch0; uint16_t taosch1; } QueryResponse; typedef struct GPSMsgStruct { uint8_t qid; //Query ID uint8_t epochid; uint8_t nodeid; //Node ID from which response uint8_t restype; //Response type 0 - sensor, 1 - GPS uint8_t hour; uint8_t minute; uint8_t lat_deg; uint8_t long_deg; uint32_t dec_sec; uint32_t lat_dec_min; uint32_t long_dec_min; uint8_t nsewind; uint8_t fixed; } GPSMsg; typedef struct GGAMsg { uint8_t hour; uint8_t minute; uint8_t lat_deg; uint8_t long_deg; uint32_t dec_sec; uint32_t lat_dec_min; uint32_t long_dec_min; uint8_t nsewind; uint8_t fixed; } __attribute__ ((packed)) GGAMsg; enum { AM_QUERY_REQUEST = 9, AM_QUERY_RESPONSE = 10, };
_______________________________________________ Tinyos-help mailing list Tinyos-help@Millennium.Berkeley.EDU https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help