Mesh now supports non-timestamp but increasing messages.
This commit is contained in:
parent
a19b8ac64a
commit
5dacadbb3e
|
@ -25,8 +25,26 @@ void initMesh(void){
|
||||||
meshbuffer[0].flags=MF_USED;
|
meshbuffer[0].flags=MF_USED;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void blink(char a, char b){
|
MPKT * meshGetMessage(uint8_t type){
|
||||||
gpioSetValue (a,b, 1-gpioGetValue(a,b));
|
int free=-1;
|
||||||
|
for(int i=0;i<MESHBUFSIZE;i++){
|
||||||
|
if ( ((meshbuffer[i].flags&MF_USED)==0) && free<0 )
|
||||||
|
free=i;
|
||||||
|
if ( (meshbuffer[i].flags&MF_USED) &&
|
||||||
|
(MO_TYPE(meshbuffer[i].pkt) == type)){
|
||||||
|
free=i;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if(free==-1){ // Buffer full. Ah well. Kill a random packet
|
||||||
|
free=1; // XXX: GetRandom()?
|
||||||
|
meshbuffer[free].flags=MF_FREE;
|
||||||
|
};
|
||||||
|
if(meshbuffer[free].flags==MF_FREE){
|
||||||
|
memset(&meshbuffer[free],0,sizeof(MPKT));
|
||||||
|
MO_TYPE_set(meshbuffer[free].pkt,type);
|
||||||
|
};
|
||||||
|
return &meshbuffer[free];
|
||||||
};
|
};
|
||||||
|
|
||||||
void mesh_cleanup(void){
|
void mesh_cleanup(void){
|
||||||
|
@ -35,6 +53,10 @@ void mesh_cleanup(void){
|
||||||
if(meshbuffer[i].flags&MF_USED){
|
if(meshbuffer[i].flags&MF_USED){
|
||||||
if (MO_GEN(meshbuffer[i].pkt)<meshgen)
|
if (MO_GEN(meshbuffer[i].pkt)<meshgen)
|
||||||
meshbuffer[i].flags=MF_FREE;
|
meshbuffer[i].flags=MF_FREE;
|
||||||
|
if (MO_TYPE(meshbuffer[i].pkt)>='a' &&
|
||||||
|
MO_TYPE(meshbuffer[i].pkt)<='z'){
|
||||||
|
;
|
||||||
|
}else{
|
||||||
if (MO_TIME(meshbuffer[i].pkt)<now)
|
if (MO_TIME(meshbuffer[i].pkt)<now)
|
||||||
meshbuffer[i].flags=MF_FREE;
|
meshbuffer[i].flags=MF_FREE;
|
||||||
if (MO_TIME(meshbuffer[i].pkt)-now>SECS_DAY)
|
if (MO_TIME(meshbuffer[i].pkt)-now>SECS_DAY)
|
||||||
|
@ -42,6 +64,7 @@ void mesh_cleanup(void){
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
void mesh_recvloop(void){
|
void mesh_recvloop(void){
|
||||||
__attribute__ ((aligned (4))) uint8_t buf[32];
|
__attribute__ ((aligned (4))) uint8_t buf[32];
|
||||||
|
@ -83,37 +106,22 @@ void mesh_recvloop(void){
|
||||||
};
|
};
|
||||||
|
|
||||||
// Safety: Truncate ascii packets by 0-ing the CRC
|
// Safety: Truncate ascii packets by 0-ing the CRC
|
||||||
if (MO_TYPE(buf) >='A' && MO_TYPE(buf) <='Z'){
|
|
||||||
buf[MESHPKTSIZE-2]=0;
|
buf[MESHPKTSIZE-2]=0;
|
||||||
};
|
|
||||||
|
|
||||||
// Store packet in a free slot
|
// Store packet in a same/free slot
|
||||||
int free=-1;
|
MPKT* mpkt=meshGetMessage(MO_TYPE(buf));
|
||||||
for(int i=0;i<MESHBUFSIZE;i++){
|
|
||||||
if ( ((meshbuffer[i].flags&MF_USED)==0) && free<0 )
|
|
||||||
free=i;
|
|
||||||
if ( (meshbuffer[i].flags&MF_USED) &&
|
|
||||||
(MO_TYPE(meshbuffer[i].pkt) == MO_TYPE(buf))){
|
|
||||||
if ( MO_TIME(buf) >
|
|
||||||
MO_TIME(meshbuffer[i].pkt)){
|
|
||||||
free=i;
|
|
||||||
break;
|
|
||||||
}else{
|
|
||||||
free=-2;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if(free==-1){ // Buffer full. Ah well. Kill a random packet
|
// Skip locked packet
|
||||||
free=1; // XXX: GetRandom()?
|
if(mpkt->flags&MF_LOCK)
|
||||||
};
|
|
||||||
|
|
||||||
if(free<0)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memcpy(meshbuffer[free].pkt,buf,MESHPKTSIZE);
|
// only accept newer/better packets
|
||||||
meshbuffer[free].flags=MF_USED;
|
if(mpkt->flags==MF_USED)
|
||||||
|
if(MO_TIME(buf)<MO_TIME(mpkt->pkt))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
memcpy(mpkt->pkt,buf,MESHPKTSIZE);
|
||||||
|
mpkt->flags=MF_USED;
|
||||||
|
|
||||||
}while(getTimer()<recvend || pktctr>MESHBUFSIZE);
|
}while(getTimer()<recvend || pktctr>MESHBUFSIZE);
|
||||||
|
|
||||||
|
@ -137,6 +145,8 @@ void mesh_sendloop(void){
|
||||||
for (int i=0;i<MESHBUFSIZE;i++){
|
for (int i=0;i<MESHBUFSIZE;i++){
|
||||||
if(!meshbuffer[i].flags&MF_USED)
|
if(!meshbuffer[i].flags&MF_USED)
|
||||||
continue;
|
continue;
|
||||||
|
if(meshbuffer[i].flags&MF_LOCK)
|
||||||
|
continue;
|
||||||
ctr++;
|
ctr++;
|
||||||
memcpy(buf,meshbuffer[i].pkt,MESHPKTSIZE);
|
memcpy(buf,meshbuffer[i].pkt,MESHPKTSIZE);
|
||||||
status=nrf_snd_pkt_crc_encr(MESHPKTSIZE,buf,meshkey);
|
status=nrf_snd_pkt_crc_encr(MESHPKTSIZE,buf,meshkey);
|
||||||
|
@ -162,4 +172,3 @@ void mesh_systick(void){
|
||||||
sendctr+=getRandom()%(sendctr*2);
|
sendctr+=getRandom()%(sendctr*2);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ typedef struct {
|
||||||
|
|
||||||
#define MF_FREE (0)
|
#define MF_FREE (0)
|
||||||
#define MF_USED (1<<0)
|
#define MF_USED (1<<0)
|
||||||
|
#define MF_LOCK (1<<1)
|
||||||
|
|
||||||
extern char meshgen; // Generation
|
extern char meshgen; // Generation
|
||||||
extern MPKT meshbuffer[MESHBUFSIZE];
|
extern MPKT meshbuffer[MESHBUFSIZE];
|
||||||
|
@ -35,5 +36,6 @@ void mesh_cleanup(void);
|
||||||
void mesh_recvloop(void);
|
void mesh_recvloop(void);
|
||||||
void mesh_sendloop(void);
|
void mesh_sendloop(void);
|
||||||
void mesh_systick(void);
|
void mesh_systick(void);
|
||||||
|
MPKT * meshGetMessage(uint8_t type);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue