141 lines
3.6 KiB
C++
141 lines
3.6 KiB
C++
#include <Arduino.h>
|
|
#include <SPI.h>
|
|
#include "SimpleWiNo.h"
|
|
#include <M5Stack.h>
|
|
|
|
//Objet Wino
|
|
SimpleWiNo wino;
|
|
|
|
//Constantes de configuration des noeuds
|
|
#define ADRESSE_CLUSTER 0x4A89
|
|
#define ADRESSE_NOEUD 0x0001
|
|
#define CANAL 7
|
|
|
|
//Variables pour le paquet
|
|
uint8_t txbuf[40]; //Buffer d'émission
|
|
uint8_t rxbuf[40]; //Buffer de réception
|
|
uint8_t packetLenTX; //Longueur du paquet émis
|
|
uint8_t packetLenRX; //Longueur du paquet reçu
|
|
uint8_t indicePaquetRX; //Indice pour le traitement du paquet reçu
|
|
uint16_t adresseSource; //Adresse du noeud source
|
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
|
|
|
//Constantes de indices de champs du paquet
|
|
#define ADRESSE_MULTICAST 0x7878 //Adresse multicast du noeud
|
|
#define NB_PAYLOAD 10 //Nombre de données de payload
|
|
|
|
|
|
//Procédure de formatage de l'en tête et de la payload
|
|
//du paquet en émission
|
|
void formaterPaquet(uint8_t* longueur, uint8_t donnees[]){
|
|
|
|
*longueur=0;
|
|
|
|
//Ajout En-tete
|
|
wino.encodeUi16(ADRESSE_MULTICAST, &donnees[*longueur]);
|
|
*longueur +=2;
|
|
|
|
//Ajout de la payload
|
|
for(int i=0; i<NB_PAYLOAD; i++){
|
|
donnees[*longueur]=random(0,256);
|
|
*longueur+=1;
|
|
}
|
|
}
|
|
|
|
|
|
//Affichage du paquet à émettre
|
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
|
|
|
for(int i=0; i<longueur; i++){
|
|
M5.Lcd.printf("|%02X", donnees[i]);
|
|
Serial.printf("|%02X", donnees[i]);
|
|
}
|
|
M5.Lcd.println("|");
|
|
Serial.println("|");
|
|
}
|
|
|
|
//Fonction permettant d'extraire l'adresse multicast reçu en gérant
|
|
//L'indexation du paquet
|
|
uint16_t extraireMulticast(uint8_t* indice, uint8_t donnees[]){
|
|
|
|
uint16_t adresse;
|
|
*indice=0;
|
|
|
|
adresse=wino.decodeUi16(&donnees[*indice]);
|
|
*indice+=2;
|
|
|
|
return adresse;
|
|
}
|
|
|
|
//Procédure d'affichage de la payload reçue
|
|
//À partir de l'indice de début de la uniquement
|
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
|
|
|
M5.Lcd.printf("Payload : ");
|
|
Serial.printf("Payload : ");
|
|
for(int i=indiceDebut; i<longueur; i++){
|
|
M5.Lcd.printf("|%02X", donnees[i]);
|
|
Serial.printf("|%02X", donnees[i]);
|
|
}
|
|
M5.Lcd.println("|");
|
|
Serial.println("|");
|
|
}
|
|
|
|
//Condition pour déclencher le premier envoi
|
|
int test_envoi=0;
|
|
|
|
void setup() {
|
|
|
|
//Démarage M5
|
|
M5.begin();
|
|
M5.Power.begin();
|
|
Serial.println("====Emetteur sprint 2====");
|
|
M5.Lcd.println("====Emetteur sprint 2====");
|
|
|
|
delay(3000);
|
|
|
|
//Demarage wino
|
|
wino.init();
|
|
//Adresse cluster
|
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
|
//Adresse noeud
|
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
|
//Fréquence de travail
|
|
wino.set(NODE_CHANNEL, CANAL);
|
|
|
|
//Générateur de payload aléatoire
|
|
randomSeed(analogRead(30));
|
|
}
|
|
|
|
void loop() {
|
|
wino.process();
|
|
|
|
if(test_envoi==0){
|
|
M5.Lcd.println("====Envoi Paquet====");
|
|
Serial.println("====Envoi Paquet====");
|
|
formaterPaquet(&packetLenTX, txbuf);
|
|
afficherPaquet(packetLenTX, txbuf);
|
|
wino.send(0xFFFF, txbuf, packetLenTX);
|
|
test_envoi+=1;
|
|
}
|
|
|
|
//Test Reception
|
|
if(wino.recv(&adresseSource, rxbuf, &packetLenRX) && (adresseSource!=3)){
|
|
M5.Lcd.println("=====Reception=====");
|
|
Serial.println("=====Reception=====");
|
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
|
adresseMulticast=extraireMulticast(&indicePaquetRX, rxbuf);
|
|
M5.Lcd.printf("Adresse Multicast : %X \n", adresseMulticast);
|
|
Serial.printf("Adresse Multicast : %X \n", adresseMulticast);
|
|
afficherPayload(indicePaquetRX, packetLenRX, rxbuf);
|
|
|
|
//Test même adresse multicast
|
|
if(adresseMulticast==ADRESSE_MULTICAST){
|
|
M5.Lcd.println("=====Réemission Paquet=====");
|
|
Serial.println("=====Réemission Paquet=====");
|
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
|
}
|
|
}
|
|
}
|