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

Reply via email to