module  P2MM

{

uses interface Boot;

uses interface Timer<TMilli> as Timer0;

uses interface SplitControl as AMControl;

uses interface AMPacket;

uses interface AMSend;

uses interface Receive;

uses interface Packet;

}

implementation

{

typedef nx_struct P2MMsg {nx_uint16_t nodeid[3];nx_uint16_t num;nx_uint16_t counter;}P2MMsg;

uint8_t counter=0;

bool busy =FALSE;

message_t pkt;

task void test() { }

/**********************************************

* 函数名:booted()

* 功  能:系统启动完毕后自动触发

* 参  数:无

***********************************************/

event void Boot.booted()

{

call AMControl.start();

}

/**********************************************

* 函数名:fired()

* 功  能:定时器触发事件

* 参  数:无

***********************************************/

event void Timer0.fired()

{

counter++;

if (!busy)

{

P2MMsg* btrpkt = (P2MMsg*)(call Packet.getPayload(&pkt, sizeof(P2MMsg)));

btrpkt->num=0;

btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;

btrpkt->counter = counter;

call AMPacket.setGroup(&pkt,TOS_IEEE_GROUP);

if (call AMSend.send(0xFFFF, &pkt, sizeof(P2MMsg)) == SUCCESS)

busy = TRUE;

}

}

/**********************************************

* 函数名:startDone(error_t err)

* 功  能:SplitControl控制启动完成事件

* 参  数:error_t err

***********************************************/

event void AMControl.startDone(error_t err)

{

if(err==SUCCESS)

{

if(TOS_NODE_ID!=0x1)

call Timer0.startPeriodic(1000);

}

else

call AMControl.start();

}

/**********************************************

* 函数名:sendDone(message_t* msg, error_t erro)

* 功  能:AM消息发送完毕事件

* 参  数:message_t* msg, error_t erro

***********************************************/

event void AMSend.sendDone(message_t* msg, error_t erro)

{

if (&pkt == msg)

busy = FALSE;

}

/**********************************************

* 函数名:receive(message_t* msg, void* payload, uint8_t len)

* 功  能:Receive接收事件

* 参  数:message_t* msg, void* payload, uint8_t len

***********************************************/

event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)

{

if (len == sizeof(P2MMsg))

{

P2MMsg* btrpkt = (P2MMsg*)payload;

DbgOut(9,"Data is %d,Start is %d,Other is %d,%d\r\n",(uint16_t)btrpkt->counter,

(uint16_t)btrpkt->nodeid[0],(uint16_t)btrpkt->nodeid[1],(uint16_t)btrpkt->nodeid[2]);

btrpkt->num++;

if(TOS_NODE_ID!=0x1){

if(btrpkt->num<3){

bool flag=TRUE;

uint16_t i;

for(i=0;i<btrpkt->num;i++){

if(btrpkt->nodeid[i] == TOS_NODE_ID)

flag=FALSE;

}

if(flag){

btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;

call AMSend.send(0xFFFF, msg, sizeof(P2MMsg));

}

}

}

}

}

event void AMControl.stopDone(error_t err)   { }

}

configuration P2MC {}

#define AM_DATA_TYPE  123

implementation

{

components P2MM as App;

components MainC;

App.Boot ->MainC;

components ActiveMessageC as AM; //消息组件

App.Packet -> AM.Packet;

App.AMPacket -> AM.AMPacket;

App.AMSend -> AM.AMSend[AM_DATA_TYPE];

App.Receive -> AM.Receive[AM_DATA_TYPE];

App.AMControl -> AM.SplitControl;

components new TimerMilliC () as Timer0;

App.Timer0 ->Timer0;

}

COMPONENT= P2MC

PFLAGS += -DUART_DEBUG

PFLAGS += -DUART_BAUDRATE=9600

include $(MAKERULES)

好课程内容。

第七次实验:CC2530平台上多跳通信的TinyOS编程的更多相关文章

  1. 实验三 CC2530平台上CC2530平台上定时器组件的

    实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...

  2. 第一次实验: CC2530平台上电源管理与休眠

    实验一 CC2530平台上电源管理与休眠 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的认识TinyOS编程的基础和简单的程序编写 学生通过本实验能够初步的了解和掌握Ti ...

  3. 实验六 CC2530平台上P2P通信的TinyOS编程

    实验六 CC2530平台上P2P通信的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的掌握射频通信TinyOS编程方法 学生通过本实验应理解TinyOS中 ...

  4. [4G]Linux平台上实现4G通信

    转自:http://blog.sina.com.cn/s/blog_7880d3350102wb92.html 在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发 ...

  5. 实验五 CC2530平台上ADC组件的TinyOS编程

    实验五 CC2530平台上ADC组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握传感器的ADC组件应用方法 学生通过本实验能够初步的了解和掌握CC ...

  6. 实验四 CC2530平台上UART组件的TinyOS编程

    实验四 CC2530平台上UART组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530的UART.及其TinyOS编程方法 学生通过本实验 ...

  7. 第二次实验:CC2530平台上GPIO组件的TinyOS编程

    实验二 CC2530平台上GPIO组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生理解和掌握CC2530的GPIO及外部中断,及其TinyOS编程方法 学 ...

  8. 检验实时3D像素流送平台好坏的七个标准!(上)

    将交互式3D像素流送技术作为有价值的企业工具之后,就该寻找像素流送服务供应商了.问题在于交互式3D像素流送是一种新兴技术,因此很难知道要问供应商的正确问题.在开始使用之前,这里有7个问题,您应该从候选 ...

  9. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

随机推荐

  1. centos6.8安装mysql5.5

    在使用阿里云的时候发现centos6.8系统自带的源当中没有mysql5.5,在网易这些源里面也是5.1的版本.这里安装mysql5.5的话需要另外添加一个源. 1.查看是否已经安装了MySQL rp ...

  2. centos更换网易的源

    刚安装的centos系统下载软件可能很慢,就可以试一下更换为国内比较知名的源试试.现在知道的网易和中科大源很不错.那么怎么更换呢 1. cd /etc/yum.repos.d/           c ...

  3. Kostya Keygen#2分析

    主要就是构造408ede处的2A个字节.. 其中第一个字节必须为0x2D,倒数第二个字节必须为0x36,倒数第三个字节为0x31. 之后,对这个2A字节的缓冲区,要满足一些条件: 1\ 在408ede ...

  4. null 和System.DBNull.Value

    row[column]的值为DBNull.Value的话,说明它是从数据库中取到值了,对应了数据库中的空值:但如果row[column]的值为null的话,说明没有从数据库中取到值. DBNull.V ...

  5. Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用

    代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099 端口被占用 解决方案: 1.查找出占用进程id 2.杀死进程 ...

  6. bzoj1688

    题解: 暴力枚举生哪一些病 然后判断一下即可 代码: #include<bits/stdc++.h> using namespace std; ,D=; int d,k,n,a[N][D] ...

  7. git add.后回退 代码丢失

    记录一次操作git丢失代码的过程: 写完代码后:git staus git add. git status 发现有一堆.class 文件不想提交,想着代码回退到add 之前,使用了 git log 开 ...

  8. 浅析构造函数,及public、private、protected、final、this、super关键字

    初学JAVA,感觉很多知识点不熟悉,看了好多遍教材,最终还是决定把它写下来,加深印象以便忘了的时候再过来复习一下.看上去字数可能比较多,其实内容很简明. 首先看this的用法: package tes ...

  9. 将springboot打包成的jar文件做成windows服务,解决java程序自启动问题

    https://blog.csdn.net/weixin_40411331/article/details/80193376 https://blog.csdn.net/qq_33188180/art ...

  10. 命令:curl

    在227服务器上执行 curl -i -X PUT --url http://192.168.1.227:8001/apis/ --data 'name=getweather' --data 'ups ...