123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732 |
-
- #include "fraisedevice.h"
- #define InitSerDrv() do { SERDRV_TRI = 0; } while(0)
- #define SerDrv_On() do { SERDRV_PIN = SERDRV_POL; } while(0)
- #define SerDrv_Off() do { SERDRV_PIN =! SERDRV_POL; } while(0)
- #define SerDrv_isOn() (SERDRV_PIN == SERDRV_POL)
- #if UART_PORT==1
- #define SPBRGx SPBRG1
- #define SPBRGHx SPBRGH1
- #define BAUDCONx BAUDCON1
- #define BAUDCONxbits BAUDCON1bits
- #define RCREGx RCREG1
- #define RCSTAx RCSTA1
- #define RCSTAxbits RCSTA1bits
- #define TXREGx TXREG1
- #define TXSTAx TXSTA1
- #define TXSTAxbits TXSTA1bits
- #define RCxIF PIR1bits.RC1IF
- #define TXxIF PIR1bits.TX1IF
- #define RCxIE PIE1bits.RC1IE
- #define TXxIE PIE1bits.TX1IE
- #define RCxIP IPR1bits.RC1IP
- #define TXxIP IPR1bits.TX1IP
- #else
- #define SPBRGx SPBRG2
- #define SPBRGHx SPBRGH2
- #define BAUDCONx BAUDCON2
- #define BAUDCONxbits BAUDCON2bits
- #define RCREGx RCREG2
- #define RCSTAx RCSTA2
- #define RCSTAxbits RCSTA2bits
- #define TXREGx TXREG2
- #define TXSTAx TXSTA2
- #define TXSTAxbits TXSTA2bits
- #define RCxIF PIR3bits.RC2IF
- #define TXxIF PIR3bits.TX2IF
- #define RCxIE PIE3bits.RC2IE
- #define TXxIE PIE3bits.TX2IE
- #define RCxIP IPR3bits.RC2IP
- #define TXxIP IPR3bits.TX2IP
- #endif
- #ifndef BAUDCON1
- #define SPBRG1 SPBRG
- #define SPBRGH1 SPBRGH
- #define BAUDCON1 BAUDCON
- #define BAUDCON1bits BAUDCONbits
- #define RCREG1 RCREG
- #define RCSTA1 RCSTA
- #define RCSTA1bits RCSTAbits
- #define TXREG1 TXREG
- #define TXSTA1 TXSTA
- #define TXSTA1bits TXSTAbits
- #define RC1IF RCIF
- #define TX1IF TXIF
- #define RC1IE RCIE
- #define TX1IE TXIE
- #define RC1IP RCIP
- #define TX1IP TXIP
- #endif
- static void Serial_Init_Receiver() {
- while(TXSTAxbits.TRMT == 0);
- SerDrv_Off();
- WREG=RCREGx;
- __asm nop __endasm ;
- WREG=RCREGx;
- RCSTAxbits.CREN = 0;
- RCSTAxbits.CREN = 1;
- RCSTAxbits.ADDEN = 1;
- RCxIE = 1;
- TXxIE = 0;
- }
- #define Serial_Init_Driver() do {\
- SerDrv_On(); \
- RCxIE = 0; \
- RCSTAxbits.CREN = 0;\
- } while(0)
- #define Serial_Is_Driver() SerDrv_isOn()
- unsigned char FrTXbuf[256];
- unsigned char FrTXin = 0,FrTXout = 0,FrTXbufFree = 255;
- #define FrTXempty (FrTXin == FrTXout)
- unsigned char FrTXpacket[35];
- unsigned char FrTXpacket_i;
- unsigned char FrTXpacket_len;
- unsigned char FrTXchksum;
- unsigned char FrTXtries;
- unsigned char FrRXbuf[128];
- unsigned char FrRXchksum;
- unsigned char FrRXin;
- unsigned char FrRXin_tmp;
- unsigned char FrRXin_end;
- unsigned char FrRXout;
- unsigned char FrRXout_end;
- unsigned char FrRXout_len;
- unsigned char FrRXout_first;
- union {
- unsigned char VAL;
- struct {
- unsigned RX_OERR :1 ;
- unsigned RX_FERR :1 ;
-
- unsigned RX_SERR :1 ;
-
-
-
- unsigned RX_BRDCST :1 ;
-
- unsigned RX_POLL :1 ;
-
- unsigned TX_ERR :1 ;
- };
- } FraiseStatus;
- char FrInterruptEnabled = 0;
- #define EE_ID 0
- #define EE_PREFIX 1
- #define EE_PREFIXMAXLEN 8
- #define EE_NAME (EE_PREFIX + EE_PREFIXMAXLEN + 1)
- #define EE_NAMEMAXLEN 16
- #define EE_NAMEMAX (EE_NAME + EE_NAMEMAXLEN)
- typedef enum {
- fIDLE
- ,fWAITACK
- ,fOUT
- ,fIN
- } tFraiseState;
- tFraiseState FraiseState;
- unsigned char FrID=0;
- void fraiseSetID(unsigned char id)
- {
- eeWriteByte(EE_ID,FrID = id);
- }
- void fraiseInit(void)
- {
- FrTXin = 0;
- FrTXout = 0;
- FrTXbufFree = 255;
-
-
- SerDrv_Off();
- InitSerDrv();
- #define BRGHL (FOSC/1000000 - 1)
- SPBRGHx = BRGHL/256;
- SPBRGx = BRGHL%256;
- BAUDCONxbits.BRG16 = 1;
- TXSTAxbits.TXEN = 1;
- TXSTAxbits.BRGH = 1;
- TXSTAxbits.TX9 = 1;
- TXSTAxbits.TX9D = 0;
- RCSTAxbits.RX9 = 1;
- RCSTAxbits.SPEN = 1;
- FraiseStatus.VAL = 0;
- FraiseState = fIDLE;
- FrRXin = 0;
- FrRXout = 0;
- FrTXpacket_len = 0;
-
- FrID = eeReadByte(EE_ID);
-
- TXxIP = 0;
- RCxIP = 0;
- FrInterruptEnabled = 1;
-
-
- stdout = STREAM_USER;
-
- Serial_Init_Receiver();
- }
- void fraiseSetInterruptEnable(char enable)
- {
- FrInterruptEnabled = enable;
- if(enable == 0) {
- Serial_Init_Receiver();
- RCxIE = 0;
- TXxIE = 0;
- }
- }
- char fraiseGetInterruptEnable(void)
- {
- return FrInterruptEnabled;
- }
- static void fraisePutChar(unsigned char c)
- {
- if((FrTXin + 1) == FrTXout) {
-
- return;
- }
- FrTXbuf[FrTXin] = c;
- FrTXin++;
- }
- static unsigned char fraiseGetTXChar()
- {
- unsigned char c;
-
- if(FrTXin == FrTXout) return 0;
- c = FrTXbuf[FrTXout];
- FrTXout++;
- return c;
- }
- char fraiseSend(const unsigned char *buf,unsigned char len)
- {
- unsigned char i,c;
-
- FrTXbufFree = FrTXout;
- FrTXbufFree -= FrTXin;
- FrTXbufFree -= 1;
-
- if ((len + 3) > FrTXbufFree) {
-
- return -1;
- }
- if (len < 2) {
-
- return 0;
- }
- len -= 1;
- fraisePutChar(len);
- i = 0;
- while(i < len) {
- c = buf[i];
- i++;
- fraisePutChar(c);
- }
-
- FrTXbufFree = FrTXout;
- FrTXbufFree -= FrTXin;
- FrTXbufFree -= 1;
- return 0;
- }
- #define fraiseSendInit(b) do { FrTXpacket_i = 0 ; FrTXchksum = (b); FrTXpacket[FrTXpacket_i] = (b); FrTXpacket_i++; } while(0)
- #define fraiseSendData(b) do { FrTXchksum += (b); FrTXpacket[FrTXpacket_i] = (b); FrTXpacket_i++; } while(0)
- #define fraiseSendClose() do { FrTXpacket[FrTXpacket_i] = -FrTXchksum; FrTXpacket_i++; FrTXpacket_len = FrTXpacket_i; } while(0)
- #define fraiseSendLaunch() \
- { \
- TXREGx = FrTXpacket[0]; \
- FrTXpacket_i = 1; \
- TXxIE = 1; \
- }
- static void fraiseDecodeNextTXPacket()
- {
- unsigned char len, c, txout_end, ischar;
-
- if(TXSTAxbits.TRMT == 0) return;
- len = fraiseGetTXChar();
- if(!len) {
-
- FrTXin = FrTXout=0;
- return;
- }
-
- txout_end = FrTXout;
- txout_end += len;
-
- c=fraiseGetTXChar();
- len -= 1;
-
- if(c == '#') {
-
- if(len < 1) goto discard;
- c = fraiseGetTXChar();
- if(c == 'i'){
-
- fraiseInit();
- goto discard;
- }
-
- else if(c == 'r'){
- Serial_Init_Receiver();
- goto discard;
- }
- else if(c == 's'){
-
- SerDrv_Off();
- RCSTAxbits.ADDEN = 1;
- RCxIE = 1;
- TXxIE = 0;
- c = RCREGx;
- c = RCREGx;
- RCSTAxbits.CREN = 0;
- RCSTAxbits.CREN = 1;
- goto discard;
- }
-
- goto discard;
- }
- if(c == 'C') {
- ischar = 1;
- goto fill_packet;
- }
-
- if(c == 'B') {
- ischar = 0;
- goto fill_packet;
- }
-
- goto discard;
-
- fill_packet:
- if(ischar) len |= 128;
- fraiseSendInit(len);
-
- while(FrTXout != txout_end) {
- c = fraiseGetTXChar();
- fraiseSendData(c);
- }
- fraiseSendClose();
- FrTXtries = 0;
-
- discard:
- FrTXout = txout_end;
- return;
- }
- void fraiseISR(void)
- {
- static unsigned char c, c2;
-
- if(FrInterruptEnabled == 0) return;
- if(TXxIE && TXxIF) {
- if(FrTXpacket_i == FrTXpacket_len) {
- Serial_Init_Receiver();
- FrTXpacket_len = 0;
- return;
- }
- c = FrTXpacket[FrTXpacket_i];
- FrTXpacket_i++;
- TXREGx = c;
-
- return;
- }
-
- if(RCxIF) {
- if(RCSTAxbits.OERR){
- FraiseStatus.RX_OERR = 1;
- Serial_Init_Receiver();
- return;
- }
- if(RCSTAxbits.FERR){
- FraiseStatus.RX_FERR = 1;
- Serial_Init_Receiver();
- return;
- }
- if (RCSTAxbits.RX9D) {
- c = RCREGx;
- if(c == (FrID | 128)) {
- FraiseStatus.RX_POLL = 1;
- RCSTAxbits.ADDEN = 0;
- return;
- }
- if ((c == 0) || (c == FrID)) {
- FraiseStatus.RX_POLL = 0;
- RCSTAxbits.ADDEN = 0;
- if(c) FraiseStatus.RX_BRDCST = 0;
- else FraiseStatus.RX_BRDCST = 1;
- FrRXchksum = c;
- FrRXin_tmp = FrRXin;
- FrRXin_end = FrRXin - 1;
- FrRXbuf[FrRXin_tmp] = c;
- FrRXin_tmp++;
- if(FrRXin_tmp == sizeof(FrRXbuf)) FrRXin_tmp = 0;
- return;
- }
- FraiseStatus.RX_POLL= 0;
- RCSTAxbits.ADDEN = 1;
- return;
- }
-
- c = RCREGx;
- if(FraiseStatus.RX_POLL) {
- if(c == (FrID | 128)){
-
- Serial_Init_Driver();
- if(FrTXpacket_len == 0) {
- TXREGx = 0;
- Serial_Init_Receiver();
- } else {
- fraiseSendLaunch();
- return;
- }
- }
- RCSTAxbits.ADDEN = 1;
- return;
- }
-
- FrRXchksum += c;
- if(FrRXin_tmp == FrRXin_end) {
- if(!FrRXchksum) {
- FrRXin = FrRXin_tmp;
- if(!FraiseStatus.RX_BRDCST){
- Serial_Init_Driver();
- TXREGx = 0;
- Serial_Init_Receiver();
- }
- }
- else {
- FraiseStatus.RX_SERR = 1;
- if(!FraiseStatus.RX_BRDCST){
- Serial_Init_Driver();
- TXREGx = 1;
- Serial_Init_Receiver();
- }
- }
- return;
- }
- if((FrRXin_tmp == FrRXout)&&(FrRXout != FrRXin)) {
- Serial_Init_Receiver();
- return;
- }
- c2 = (FrRXin + 1) % sizeof(FrRXbuf);
- if(FrRXin_tmp == c2) {
- FrRXin_end = (c & 31);
- FrRXin_end += 2;
- FrRXin_end += FrRXin;
- FrRXin_end %= sizeof(FrRXbuf);
- }
- FrRXbuf[FrRXin_tmp++] = c;
- if(FrRXin_tmp == sizeof(FrRXbuf)) FrRXin_tmp = 0;
- return;
- }
- }
- unsigned char fraiseGetChar()
- {
- unsigned char c;
-
- if((FrRXout == FrRXout_end) || (FrRXout == FrRXin)) return 0;
- c = FrRXbuf[FrRXout++];
- if(FrRXout == sizeof(FrRXbuf)) FrRXout = 0;
- return c;
- }
- unsigned char fraisePeekChar()
- {
- return FrRXbuf[FrRXout];
- }
- unsigned char fraiseGetLen()
- {
- return FrRXout_len;
- }
- unsigned char fraiseGetIndex()
- {
- return FrRXout;
- }
- unsigned char fraiseGetAt(unsigned char i)
- {
- return FrRXbuf[(i + FrRXout_first)%sizeof(FrRXbuf)];
- }
- void fraiseSendCopy()
- {
- char l;
- unsigned char i;
- l = (FrRXout - FrRXout_first)%sizeof(FrRXbuf);
- l--;
- i = FrRXout_first;
- putchar('C'); putchar(' ');
-
- while(l > 0) {
- printf("%d ", FrRXbuf[i]);
- i++;
- if(i == sizeof(FrRXbuf)) i = 0;
- l--;
- }
- }
- static char CompareName()
- {
- unsigned char c, c2, eei;
- eei = EE_PREFIX;
- while(c = fraiseGetChar()){
- c2 = eeReadByte(eei);
- if(c2 == 0) {
- if(eei < EE_NAME) {
- eei = EE_NAME;
- c2 = eeReadByte(eei);
- if(c2 == 0) {
- return -1;
- }
- }
- else {
- return -1;
- }
- }
- if(c2 != c) {
- return -1;
- }
- eei++;
- if(eei > EE_NAMEMAX) {
- return -1;
- }
- }
-
- return 0;
- }
- static void Assign()
- {
- unsigned char c, c2, tmpid;
- c = fraiseGetChar();
- c2 = fraiseGetChar();
- c -= '0'; if (c > 9) c -= 'A' - '9' - 1;
- c2 -= '0'; if (c2 > 9) c2 -= 'A' - '9' - 1;
- if((c > 7) || (c2 > 15)) {
- return;
- }
- tmpid = c2 + (c << 4);
- if(CompareName()) return;
- fraiseSetID(tmpid);
- return;
- }
- static void ResetToBld()
- {
- if(CompareName()) return;
- Reset();
- }
- void fraiseService(void)
- {
- unsigned char c, ischar, isbroadcast;
- if(FrRXout != FrRXin)
- {
- c = FrRXout;
- c += 1;
- c %= sizeof(FrRXbuf);
- FrRXout_len = FrRXbuf[c];
- FrRXout_len &= 31;
-
- FrRXout_end = FrRXout;
- FrRXout_end += FrRXout_len;
- FrRXout_end += 2;
- FrRXout_end %= sizeof(FrRXbuf);
-
- isbroadcast = (fraiseGetChar() == 0);
- FrRXout_len = fraiseGetChar();
- ischar = FrRXout_len & 128;
- if(!(FrRXout_len &= 31)){
- FrRXout = FrRXin;
- return;
- }
-
- if(isbroadcast)
- {
- if(ischar){
- c = fraiseGetChar();
- FrRXout_len -= 1;
- if (c == 'B') {
- #ifdef UD_RCVCB
- fraiseReceiveCharBroadcast();
- #endif
- }
- else if(c == 'N') Assign();
- else if(c == 'F') ResetToBld();
- else if(c == 'I') __asm reset __endasm;
- }
- #ifdef UD_RCVB
- else fraiseReceiveBroadcast();
- #endif
- }
- else
- {
- FrRXout_first = FrRXout;
- if(ischar) {
- #ifdef UD_RCVC
- fraiseReceiveChar();
- #endif
- }
- #ifdef UD_RCV
- else fraiseReceive();
- #endif
- }
-
- goto discard;
- discard:
- FrRXout = FrRXout_end;
- }
-
- if((!FrTXempty) && (!FrTXpacket_len)) {
- fraiseDecodeNextTXPacket();
- }
- else if(Serial_Is_Driver() && (!FrTXpacket_len) && TXSTAxbits.TRMT)
- Serial_Init_Receiver();
- return;
- }
-
- unsigned char txbuf[35];
- unsigned char txlen = 0;
- #ifndef PUTCHAR
- #define PUTCHAR(c) void putchar(char c) __wparam
- #endif
- PUTCHAR (c) {
- txbuf[txlen] = c;
- if(txlen < (sizeof(txbuf) - 1)) txlen++;
- if(c == '\n') {
- fraiseSend(txbuf, txlen);
- txlen = 0;
- }
- }
|