pyrorf/main.c
2019-09-10 00:46:03 +02:00

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');
}
}