/* rf.c Copyright (C) 2009 Telekatz This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include "cc1100.h" #include "cmd.h" #include "rf.h" #include "serial.h" bit WORsend; unsigned char cc1100Addr; extern volatile bit terminal; extern volatile bit redirector; void RF_init (void) { cc1100_init(); WORsend=0; cc1100Addr = conf[0x09]; } void RF_startIRQ (void) { KBPATN = 0x40; KBMASK = 0x40; KBCON = 0x02; EKBI = 1; } void RF_isr (void) __interrupt (7) { struct cc1100frameheader_ RXframe; unsigned char i; if(KBPATN & 0x40) { KBPATN = 0x00; //IRQ on low level KBCON = 0x02; return; } RXframe.len = cc1100_read1(RXBYTES); if (RXframe.len) { bit startTX = 0; if(RXframe.len > 3) cc1100_read(RX_fifo, &RXframe.len,4); else cc1100_read(RX_fifo, &RXframe.len,RXframe.len); if (RXframe.len > 3) { if(terminal || redirector) { bit ACK = 0; switch ( RXframe.packetType) { case packet_ping: if (cc1100_read1(RX_fifo) == 0x01) { RXframe.len = 0x04; RXframe.destAddr = RXframe.srcAddr; RXframe.srcAddr = cc1100Addr; RXframe.packetType = packet_ping; cc1100_write(TX_fifo,(unsigned char*)RXframe,4); cc1100_write1(TX_fifo,0x02); startTX = 1; } break; case packet_redirDAT: cc1100_single(RX_fifo | BURST | READ,0); for(i=3;i 4) { unsigned char x; x = cc1100_read1(RX_fifo); if(x <= baud_115200) { redir_baud = x; } ACK = 1; } break; case redir_START: redir_dest = RXframe.srcAddr; setbaud(redir_baud); redirector = 1; ACK = 1; break; case redir_STOP: redirector = 0; setbaud(baud_default); ACK = 1; break; case redir_PING: ACK = 1; break; } if(ACK) { RXframe.len = 0x04; RXframe.destAddr = RXframe.srcAddr; RXframe.srcAddr = cc1100Addr; RXframe.packetType = packet_redirCMD; cc1100_write(TX_fifo,(unsigned char*)RXframe,4); cc1100_write1(TX_fifo,redir_ACK); startTX = 1; } break; default: if ((RXframe.len > 3) && terminal) { send_string(crlf); send_string("RX: "); cc1100_single(RX_fifo | BURST | READ,0); for(i=3;i