📄 agrimonitorc.nc
字号:
}
return i;
}
task void sendSensordataMsg(){
//if(!SendBusy && SensorDataVaild){
if(SensorDataVaild){
sensorData_t* msg_sensor;
msg_sensor = (sensorData_t* )call SensorDataSend.getPayload(&SensorData_Msg, sizeof(sensorData_t));
msg_sensor -> Seq_no = seq_sensorData ;
//call LowPowerListening.setRxSleepInterval(&SensorData_Msg, LPL_INTERVAL);
//if(call SensorDataSend.send(&SensorData_Msg, sizeof(sensorData_t)) != SUCCESS){
if(call SensorDataSend.send(&SensorData_Msg, 1 + msg_sensor ->length ) != SUCCESS){
//call Leds.led0Toggle();
}
else {
//SendBusy = TRUE;
}
}
//else if(!SendBusy && !SensorDataVaild){
else{
getSensorData();
post sendSensordataMsg();
}
}
task void sendTopologydataMsg(){
//if(!SendBusy){
topologyData_t* msg_topology;
//call Leds.led1Toggle();
msg_topology = (topologyData_t* )call TopologyDataSend.getPayload(&TopologyData_Msg, sizeof(topologyData_t));
//call LowPowerListening.setRxSleepInterval(&TopologyData_Msg, LPL_INTERVAL);
//if(call TopologyDataSend.send(&TopologyData_Msg, sizeof(topologyData_t)) != SUCCESS){
if(call TopologyDataSend.send(&TopologyData_Msg, 1 + msg_topology -> length ) != SUCCESS){
//call Leds.led0Toggle();
}
else {
// SendBusy = TRUE;
}
//}
}
task void sendStatedataMsg(){
//if(!SendBusy){
//call Leds.led2Toggle();
//call LowPowerListening.setRxSleepInterval(&TopologyData_Msg, LPL_INTERVAL);
if(call StateDataSend.send(&StateData_Msg, sizeof(stateData_t)) != SUCCESS){
//call Leds.led0Toggle();
}
else {
//SendBusy = TRUE;
}
//}
}
event void SensorDataSend.sendDone(message_t* m, error_t err) {
if (err != SUCCESS) {
call Leds.led0Toggle();
/*如果发送不成功,继续尝试发送*/
}
else {
//SendBusy = FALSE;
//call Leds.led0Toggle();
//call SensorData_Interval.stop();
// try to resolve the question that the sequence num increase by one automatically when i retransmit the data
//call Leds.led1Toggle();
}
}
event void TopologyDataSend.sendDone(message_t* m, error_t err) {
if (err != SUCCESS) {
/*如果发送不成功,继续尝试发送*/
call Leds.led0Toggle();
}
else {
call Leds.led1Toggle();
//call TopologyData_Interval.stop();
// try to resolve the question that the sequence num increase by one automatically when i retransmit the data
//SendBusy = FALSE;
//memset(&TopologyData_Msg, 0, sizeof(message_t)); //添加此行会导致发送两个重复包 08.9.28 zhangjiwen
}
}
event void StateDataSend.sendDone(message_t* m, error_t err) {
if (err != SUCCESS) {
call Leds.led0Toggle();
/*如果发送不成功,继续尝试发送*/
}
else {
//SendBusy = FALSE;
//call SensorData_Interval.stop();
// try to resolve the question that the sequence num increase by one automatically when i retransmit the data
call Leds.led2Toggle();
//memset(&StateData_Msg, 0, sizeof(message_t));//添加此行会导致发送两个重复包 08.9.28 zhangjiwen
}
}
event void voltageRead.readDone( error_t result, uint16_t val ){
stateData_t* msg_state;
if (result == SUCCESS){
msg_state = (stateData_t* )call StateDataSend.getPayload(&StateData_Msg, sizeof(stateData_t));
msg_state -> data[1].state_type = STATE_NODE_POWER ;
msg_state -> data[1].state = val;
}
}
/*当接收到新的分发数据包时,根据数据包中的指令执行不同的操作*/
event void SettingsValue.changed() {
const rootDissemination_t *newSettings = call SettingsValue.get();
memcpy(&Dissemination_buf,newSettings,sizeof(rootDissemination_t));
if (Dissemination_buf.Command_ID & DIS_TIME_SYNCHRONIZATION) {
/*接收到时间同步命令,重新设置传感器采集周期*/
//call Leds.led0Toggle();
SensorDataVaild = FALSE;
//memset(&SensorData_Msg, 0, sizeof(message_t));//添加此行会导致发送两个重复包 08.9.28 zhangjiwen
SensorData_Cycle = Dissemination_buf.Interval_Setting;
startTimer(SENSORDATA_TIMER);
}
if (Dissemination_buf.Command_ID & DIS_GET_STATEDATA_ALL) {
/*接收到全网状态数据提取命令*/
//call Leds.led2Toggle();
call DisState_delay.startOneShot(((call Random.rand16()) & 0xBff));
}
if (Dissemination_buf.Command_ID & DIS_GET_SENSORDATA_ALL) {
/*接收到全网传感器数据提取命令*/
//call Leds.led2Toggle();
call DisSensor_delay.startOneShot(((call Random.rand16()) & 0xBff));
}
if (Dissemination_buf.Command_ID & DIS_RESET_TOPOLOGY_STATE_TIMER) {
/*接收到初始化拓扑、状态上传周期为默认值命令*/
//call Leds.led1Toggle();
startTimer(TOPOLOGYDATA_TIMER | STATEDATA_TIMER);
}
if (Dissemination_buf.Command_ID & DIS_STOP_TOPOLOGY_STATE_TIMER) {
/*接收到停止拓扑、状态上传的命令*/
//call Leds.led1Toggle();
if(call TopologyData_Interval.isRunning())
call TopologyData_Interval.stop();
if(call StateData_Interval.isRunning())
call StateData_Interval.stop();
}
if (Dissemination_buf.Command_ID & DIS_NODE_TYPE) {
/*设置节点类型*/
//call Leds.led1Toggle();
Node_Type = Dissemination_buf.Node_Type;
}
}
/*接收到广播数据包*/
event message_t* BcastReceive.receive(message_t* msg , void* payload , uint8_t len){
BroadCastMsg_t * msg_Bcast = (BroadCastMsg_t *)payload;
//call Leds.led0Toggle();
memcpy(&Bcast_buf , msg_Bcast , len);
if(Bcast_buf.Command_ID & BCAST_RETRANSMIT){
if(needRetransmit()){
call Leds.led0Toggle();
call Retransmit_delay.startOneShot(((call Random.rand16()) & 0xBff));
}
}
if(Bcast_buf.Command_ID & BCAST_GET_SENSORDATA_SPECIFY){
if(needRetransmit()){
call Leds.led0Toggle();
call BcastSensor_delay.startOneShot(((call Random.rand16()) & 0xBff));
}
}
if(Bcast_buf.Command_ID & BCAST_GET_STATEDATA_SPECIFY){
if(needRetransmit()){
call Leds.led0Toggle();
call BcastState_delay.startOneShot(((call Random.rand16()) & 0xBff));
}
}
return msg;
}
bool needRetransmit(){
uint8_t len ,i;
len = Bcast_buf.length;
for(i = 0 ; i < len/2; i++){
if (Bcast_buf.id[i] == TOS_NODE_ID)
return TRUE;
}
return FALSE;
}
/*
bool isExist(am_addr_t addr){
topologyData_t* msg_topology;
uint8_t i;
msg_topology = (topologyData_t* )call TopologyDataSend.getPayload(&TopologyData_Msg , sizeof(topologyData_t));
if(msg_topology -> parnt_ID ==addr)
return TRUE;
for(i = 0; i < 3; i++)
if(msg_topology -> info[i].id == addr)
return TRUE;
return FALSE;
}
*/
void startTimer(uint8_t type) {
if(type & SENSORDATA_TIMER){
if(call SensorData_Interval.isRunning())
call SensorData_Interval.stop();
//call SensorData_Interval.startOneShot(SensorData_Cycle * 1024 + ((call Random.rand16()) & 0xFFF));
call SensorData_Interval.startOneShot(SensorData_Cycle * 1024 + ((call Random.rand16()) & 0xBff));
}
if(type & TOPOLOGYDATA_TIMER){
if(call TopologyData_Interval.isRunning())
call TopologyData_Interval.stop();
//call TopologyData_Interval.startPeriodic(TopologyData_Cycle * 1024 + ((call Random.rand16()) & 0xFFF));
call TopologyData_Interval.startPeriodic(TopologyData_Cycle * 1024 + ((call Random.rand16()) & 0xBff));
}
if(type & STATEDATA_TIMER){
if(call StateData_Interval.isRunning())
call StateData_Interval.stop();
//call StateData_Interval.startPeriodic(StateData_Cycle * 1024 + ((call Random.rand16()) & 0xFFF));
call StateData_Interval.startPeriodic(StateData_Cycle * 1024 + ((call Random.rand16()) & 0xBff));
}
}
event void RadioControl.stopDone(error_t ok) { }
event void DisSensor_delay.fired(){
getSensorData();
seq_sensorData ++;
post sendSensordataMsg();
}
event void DisState_delay.fired(){
getStateData();
post sendStatedataMsg();
}
event void Retransmit_delay.fired(){
post sendSensordataMsg();
}
event void BcastSensor_delay.fired(){
getSensorData();
seq_sensorData ++;
post sendSensordataMsg();
}
event void BcastState_delay.fired(){
getStateData();
post sendStatedataMsg();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -