Nol.A SDK Library 26.11.2
For IoT System Software Development
Loading...
Searching...
No Matches
atsamr21-xpro/LPP-Sender/main.cpp
#include <cox.h>
#include <LPPMac.hpp>
void send(void *args);
static void sendDone(IEEE802_15_4Mac &radio,
static void ledOnTask(void *);
static void ledOffTask(void *);
static void sendTask(void *args);
static void receivedProbe(uint16_t panId,
const uint8_t *eui64,
uint16_t shortId,
int16_t rssi,
const uint8_t *payload,
uint8_t payloadLen,
uint32_t channel);
Timer ledTimer;
Timer sendTimer;
uint16_t node_id = 1;
uint8_t node_ext_id[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0, 0};
uint32_t sent = 0;
uint32_t success = 0;
LPPMac *Lpp;
void setup(void) {
Serial.begin(115200);
printf("\n*** [ATSAMR21-XPro] LPP Sender ***\n");
srand(0x1234 + node_id);
AT86RF233.begin();
node_ext_id[6] = highByte(node_id);
node_ext_id[7] = lowByte(node_id);
Lpp = new LPPMac();
Lpp->begin(AT86RF233, 0x1234, 0xFFFF, node_ext_id);
Lpp->setProbePeriod(3000);
Lpp->setListenTimeout(3300);
Lpp->setTxTimeout(632);
Lpp->setRxTimeout(465);
Lpp->setRxWaitTimeout(30);
//Lpp->setUseSITFirst(true);
Lpp->onSendDone(sendDone);
Lpp->onReceiveProbe(receivedProbe);
Lpp->setProbePayload("test2", 5);
postTask(ledOnTask, NULL);
sendTimer.onFired(sendTask, NULL);
sendTimer.startPeriodic(10000);
}
static void ledOnTask(void *) {
ledTimer.onFired(ledOffTask, NULL);
ledTimer.startOneShot(10);
System.ledOn(0);
}
static void ledOffTask(void *) {
ledTimer.onFired(ledOnTask, NULL);
ledTimer.startOneShot(990);
System.ledOff(0);
}
static void sendDone(IEEE802_15_4Mac &radio,
uint16_t ratio;
printf("TX (");
if (frame->result == RadioPacket::SUCCESS) {
success++;
printf("S ");
} else {
printf("F ");
}
if (sent > 0)
ratio = success * 100 / sent;
else
ratio = 0;
printf("%u %% (%lu/%lu)) (%02X %02X..) t: %u\n",
ratio, success, sent,
frame->getPayloadAt(0),
frame->getPayloadAt(1),
frame->txCount);
delete frame;
}
static void sendTask(void *args) {
uint8_t n;
uint16_t dst;
uint8_t dest_ext_id[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0, 0};
error_t err;
/* In order to send multiple destinations, modify below 'dst' variable. */
for (dst = 2; dst <= 2; dst++) {
frame = new IEEE802_15_4Frame(100);
if (!frame) {
printf("Not enough memory\n");
return;
}
#if 0
IEEE802_15_4Address dstAddr(dst, 0x1234);
#else
dest_ext_id[6] = highByte(dst);
dest_ext_id[7] = lowByte(dst);
IEEE802_15_4Address dstAddr(dest_ext_id, 0x1234);
#endif
//frame->setAckRequest(false);
frame->setPayloadLength(100);
for (n = 2; n < 100; n++) {
frame->setPayloadAt(n, n);
}
frame->setPayloadAt(0, sent >> 8);
frame->setPayloadAt(1, sent & 0xff);
err = Lpp->send(frame);
if (err != ERROR_SUCCESS) {
printf("Sending fail.(%d)\n", err);
delete frame;
} else {
printf("Trying to send...\n");
if (sent == 0) {
success = 0;
//while (1);
}
sent++;
}
}
}
static void receivedProbe(uint16_t panId,
const uint8_t *eui64,
uint16_t shortId,
int16_t rssi,
const uint8_t *payload,
uint8_t payloadLen,
uint32_t channel) {
printf("* Probe received from PAN:0x%04X, "
"Node EUI64:%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x, "
"ID:%x, RSSI:%d",
panId,
eui64[0], eui64[1], eui64[2], eui64[3],
eui64[4], eui64[5], eui64[6], eui64[7],
shortId, rssi);
if (payloadLen > 0) {
uint8_t i;
printf(", length:%u, ", payloadLen);
for (i = 0; i < payloadLen; i++) {
printf("%02X ", payload[i]);
}
}
printf("\n");
}
LPPMac class.
IEEE 802.15.4 address.
Definition IEEE802_15_4Frame.hpp:60
IEEE 802.15.4 frame.
Definition IEEE802_15_4Frame.hpp:163
int16_t getPayloadAt(uint16_t index) const
Get an octet of the payload buffer at index.
uint8_t txCount
Number of Tx trials.
Definition IEEE802_15_4Frame.hpp:168
bool setPayloadAt(uint16_t index, uint8_t value)
Set an octet of the payload buffer at index to value.
bool setPayloadLength(uint16_t len)
Set payload length in unit of octets.
IEEE 802.15.4 MAC Protocol.
Definition IEEE802_15_4Mac.hpp:60
error_t send(IEEE802_15_4Frame *frame)
frame 을 전송합니다.
virtual void onSendDone(void(*sendDoneHandler)(IEEE802_15_4Mac &, IEEE802_15_4Frame *))
전송이 완료될 때 호출될 함수를 지정합니다.
Low-Power Probing: 비동기 (asynchronous) 방식의 저전력 MAC 프로토콜
Definition LPPMac.hpp:230
void setProbePayload(const uint8_t *payload, uint8_t len)
Probe 메시지에 추가로 보낼 페이로드 데이터를 설정합니다.
void onReceiveProbe(void(*func)(uint16_t panId, const uint8_t *eui64, uint16_t shortId, int16_t rssi, const uint8_t *payload, uint8_t payloadLen, uint32_t channel))
Probe 수신시 콜백함수를 지정합니다.
error_t setTxTimeout(uint16_t msec)
TxTimeout 시간을 msec 밀리초로 설정합니다.
error_t setProbePeriod(uint32_t msec)
ProbePeriod 를 msec 밀리초로 설정합니다.
error_t setRxTimeout(uint16_t msec)
RxTimeout 시간을 msec 밀리초로 설정합니다.
error_t setRxWaitTimeout(uint16_t msec)
RxWaitTimeout 시간을 msec 밀리초로 설정합니다.
void begin(PacketRadioChip &chip, uint16_t panId, uint16_t nodeId, const uint8_t *eui64)
프로토콜을 초기화합니다.
error_t setListenTimeout(uint32_t msec)
ListenTimeout 시간을 msec 밀리초로 설정합니다.
@ SUCCESS
송신 또는 수신 성공
Definition RadioPacket.hpp:69
Result_t result
송신 또는 수신 패킷 처리 결과
Definition RadioPacket.hpp:131
Timer는 일정 시간 이후에 1회 실행될 작업, 매 일정 시간마다 실행될 작업 등을 위한 기능입니다.
Definition Timer.hpp:61
bool startOneShot(uint32_t millis, bool interrupt=false)
작업함수를 millis 밀리초 이후 1회 실행합니다.
bool startPeriodic(uint32_t millis, bool interrupt=false)
작업함수를 매 millis 밀리초 주기로 반복하여 실행합니다.
void onFired(void(*func)(void *), void *args=nullptr)
타이머 만료시 실행시킬 작업함수를 지정합니다.
API and definitions.
#define highByte(w)
변수의 높은 (가장 왼쪽) 바이트를 구합니다.
Definition nola-common.h:321
#define lowByte(w)
변수의 낮은 (가장 오른쪽) 바이트를 구합니다.
Definition nola-common.h:312
@ ERROR_SUCCESS
Definition nola-common.h:119
bool postTask(void(*func)(void *), void *args)
작업을 나중에 실행되도록 게시합니다.