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 [email protected] https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
