Nol.A SDK Library 26.11.2
For IoT System Software Development
Loading...
Searching...
No Matches
st-nucleo-l152re/LPP-Sender/main.cpp
#include <cox.h>
#include <LPPMac.hpp>
#include "SX1276Wiring.hpp"
void send(void *args);
static void sendDone(IEEE802_15_4Mac &radio,
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 sendTimer;
uint16_t node_id = 3;
uint8_t node_ext_id[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0, 0};
uint32_t sent = 0;
uint32_t success = 0;
SX1276Wiring SX1276(Spi,
A0, //Reset
D10, //CS
A4, //RxTx
D2, //DIO0 (PA10)
D3, //DIO1 (PB3)
D4, //DIO2 (PB5)
D5, //DIO3 (PB4)
A3); //DIO4 (PB0)
LPPMac Lpp;
void setup(void) {
Serial.begin(115200);
printf("\n*** [ST Nucleo-L152RE] LPP Sender ***\n");
srand(0x1234 + node_id);
SX1276.begin();
SX1276.setTxPower(14);
SX1276.setChannel(922100000);
node_ext_id[6] = highByte(node_id);
node_ext_id[7] = lowByte(node_id);
Lpp.begin(SX1276, 0x1234, node_id, node_ext_id);
Lpp.setProbePeriod(3000);
Lpp.setListenTimeout(3300);
Lpp.setTxTimeout(632);
Lpp.setRxTimeout(465);
//Lpp.setUseSITFirst(true);
Lpp.onSendDone(sendDone);
Lpp.onReceiveProbe(receivedProbe);
Lpp.setProbePayload("test2", 5);
sendTimer.onFired(sendTask, NULL);
sendTimer.startPeriodic(10000);
}
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;
for (dst = 1; dst <= 1; 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->setDstAddr(dstAddr);
for (n = 2; n < frame->getPayloadLength(); n++) {
frame->setPayloadAt(n, n);
}
frame->setPayloadAt(0, sent >> 8);
frame->setPayloadAt(1, sent & 0xff);
//Lpp.useForceNoAckRequest = true; // To unicast without Ack request
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.
uint16_t getPayloadLength() const
Get payload length in unit of octets.
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 setDstAddr(IEEE802_15_4Address &dst)
Set destination address.
Definition IEEE802_15_4Frame.hpp:368
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 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
SPI & Spi
@ BW_125kHz
Definition Radio.hpp:109
@ CR_4_5
Definition Radio.hpp:95
@ SF7
Definition Radio.hpp:82