200 lines
3.1 KiB
C
200 lines
3.1 KiB
C
#include <avr/io.h>
|
|
#include <avr/sleep.h>
|
|
#include <avr/wdt.h>
|
|
#include <avr/interrupt.h>
|
|
#include <avr/power.h>
|
|
#include <avr/pgmspace.h>
|
|
//#include <avr/eeprom.h>
|
|
#include <util/delay.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
|
|
#include "defines.h"
|
|
#include "lcd.h"
|
|
#include "spi.h"
|
|
#include "rf24.h"
|
|
#include "Hamming.h"
|
|
|
|
int main (void);
|
|
void setup (void);
|
|
void loop (void);
|
|
void lcdprint( char* ptr);
|
|
void debughex (uint8_t* ptr,uint8_t len);
|
|
|
|
|
|
|
|
int decode_radioin (uint8_t * buffer){
|
|
uint8_t err=0, errcpt=0, plen, cpt, incrc,crc;
|
|
uint8_t* in = buffer;
|
|
uint8_t* out, *end;
|
|
|
|
// Decode first 2 bytes
|
|
err = HammingCorrect2416(in,in+1,*(in+2));
|
|
if(err >2) { lcdprint("RXH1"); return 0; }
|
|
|
|
errcpt+=err;
|
|
in+=3;
|
|
|
|
// len
|
|
plen = buffer[0] & 0x0F;
|
|
if(plen>32) return 0;
|
|
|
|
// Hamming
|
|
cpt = plen + (plen&1); // even
|
|
cpt = (cpt/2)*3;
|
|
end = buffer + cpt;
|
|
|
|
// Correct
|
|
while(in<end){
|
|
err= HammingCorrect2416(in,in+1,*(in+2));
|
|
if(err>2){
|
|
lcdprint("RXH"); return 0;
|
|
}
|
|
errcpt+=err; in+=3;
|
|
}
|
|
|
|
// Shift (strip parity)
|
|
in = buffer+3;
|
|
out = buffer+2;
|
|
while(in<end){
|
|
*(out++)=*(in++); // Copy Byte
|
|
*(out++)=*(in++); // Copy Byte
|
|
in++; // skip parity
|
|
}
|
|
/*
|
|
// Calc CRC
|
|
in=buffer;
|
|
incrc=buffer[3];
|
|
buffer[3]=0;
|
|
cpt=plen;
|
|
crc=0;
|
|
while(cpt--) crc= _crc8_ccitt_update(crc,*(in++));
|
|
|
|
if(crc!=incrc) {printf("CRC\n"); return 0; }
|
|
*/
|
|
return plen;
|
|
}
|
|
|
|
|
|
int main(void)
|
|
{
|
|
setup();
|
|
while (1)
|
|
loop();
|
|
}
|
|
|
|
void setup(void)
|
|
{
|
|
#if defined(USBCON)
|
|
USBCON=0;
|
|
#endif
|
|
|
|
lcd_init(20,4);
|
|
lcd_backlight(1);
|
|
lcd_clear();
|
|
lcd_home();
|
|
lcd_display();
|
|
lcdprint("Pyro RF ! ");
|
|
|
|
_delay_ms(200);
|
|
|
|
spi_init_master();
|
|
_delay_ms(200);
|
|
|
|
rf24_setup();
|
|
|
|
rf24_init();
|
|
//char st = rf24_read_reg(STATUS);
|
|
rf24_update_fifo_status();
|
|
debughex(&rf24_status,1);
|
|
|
|
#if defined(__AVR_ATmega32A__)
|
|
GICR|=_BV(INT2);
|
|
|
|
#elif defined(__AVR_ATmega32U4__)
|
|
EICRA=_BV(ISC21);
|
|
EIMSK=_BV(INT2);
|
|
#endif
|
|
|
|
|
|
rf24_RXMode();
|
|
|
|
#if defined(TIMSK1)
|
|
// setup Timer1
|
|
TCCR1A = 0;
|
|
TCNT1=0;
|
|
OCR1A = 10000;
|
|
TIMSK1 = _BV(OCIE1A);
|
|
TCCR1B = _BV(WGM12)|_BV(CS11);
|
|
#else
|
|
// setup Timer1
|
|
TCCR1A = 0;
|
|
TCNT1=0;
|
|
OCR1A = 10000;
|
|
TIMSK = _BV(OCIE1A);
|
|
TCCR1B = _BV(WGM12)|_BV(CS11);
|
|
#endif
|
|
|
|
sei();
|
|
|
|
}
|
|
|
|
volatile int i=0,j=0;
|
|
volatile int u=0,insomnia=0;
|
|
|
|
uint8_t buff[40];
|
|
|
|
void loop(void)
|
|
{
|
|
insomnia=0;
|
|
if(!u){
|
|
u=0;
|
|
//char buf[15];
|
|
lcd_setCursor(12,0);
|
|
rf24_update_status();
|
|
debughex(&rf24_status,1);
|
|
if((rf24_status&0x0E)!=0x0E){
|
|
int s = rf24_receive(buff);
|
|
s= decode_radioin(buff);
|
|
lcd_setCursor(0,1);
|
|
debughex(buff,s);
|
|
insomnia=1;
|
|
}
|
|
}
|
|
|
|
if(!insomnia){
|
|
set_sleep_mode(SLEEP_MODE_IDLE);
|
|
sleep_mode();
|
|
}
|
|
}
|
|
|
|
|
|
ISR(TIMER1_COMPA_vect){
|
|
i+=5;
|
|
if(u)u--;
|
|
}
|
|
|
|
ISR(INT2_vect){
|
|
insomnia=1;
|
|
lcd_setCursor(12,3);
|
|
lcdprint("INT");
|
|
}
|
|
|
|
void lcdprint( char* ptr)
|
|
{
|
|
while (*ptr) lcd_write(*ptr++);
|
|
}
|
|
|
|
|
|
void debughex (uint8_t* ptr,uint8_t len) {
|
|
while (len--) {
|
|
uint8_t c = *(ptr++);
|
|
uint8_t ch= c>>4;
|
|
c &= 0x0F;
|
|
lcd_write(ch>9?ch+'A'-10:ch+'0');
|
|
lcd_write(c>9?c+'A'-10:c+'0');
|
|
}
|
|
}
|
|
|
|
|