123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907 |
-
- #ifdef SDCC
- #include <pic18f2550.h>
- #else
- #include <p18cxxx.h>
- #endif
- #include <usart.h>
- #include <stdio.h>
- #include <ctype.h>
- #ifndef SDCC
- #include <delays.h>
- #endif
- #include "prj_usb_config.h"
- #include "fraisemaster.h"
- #define VERSION_STRING (STRING)"sV UsbFraise 2.1.4 (DP_USB) Antoine Rousseau 2015\n"
- #include "eeprom.h"
- #define ID_EE_ADDRESS 0
- extern int _user_putc(char c);
- typedef const rom far char *STRING;
- typedef unsigned char BYTE;
- BYTE LineFromUsb[LINE_FROM_USB_MAXLEN];
- BYTE LineFromUsbLen;
- BYTE FrGotLineFromUsb;
- extern void putc_cdc(BYTE c);
- #define putchar putc_cdc
- extern void CDC_Flush_In_Now(void);
- extern union USART USART_Status;
- unsigned char FrTXpacket[64];
- unsigned char FrTXpacket_i;
- unsigned char FrTXpacket_len;
- unsigned char FrTXchksum;
- unsigned char FrTXtries;
- unsigned char FrRXbuf[64];
- unsigned char FrRXin;
- unsigned char FrRXout;
- unsigned char FrRXchksum;
- unsigned char PollDelay;
- volatile unsigned char PollCount;
- union {
- unsigned char VAL;
- struct {
- unsigned RXFULL :1;
- unsigned RXCHAR :1;
- unsigned TXCHAR :1;
- unsigned TX_NEEDACK :1;
- unsigned FBLDON :1;
- unsigned OERR :1;
- unsigned FERR :1;
- };
- } FraiseStatus;
- unsigned char i,c,c2;
- unsigned char t1,t2,t3;
- unsigned int p;
- typedef enum {
- fIDLE
- ,fWAITACK
- ,fOUT
- ,fIN
- ,fBLOUT
- ,fBLIN
- } tFraiseState;
- tFraiseState FraiseState;
- typedef enum {
- fmessNONE
- ,fmessFOUND
- ,fmessLOST
- ,fmessCHKSUM
- ,fmessNACK
- ,fmessTOUT
- } tFraiseMessage;
- tFraiseMessage FraiseMessage;
- unsigned char _PolledChild;
- unsigned char _bit_PolledChild;
- unsigned char MaxPolledChild;
- unsigned char Children[16];
- unsigned char ChildrenOK[16];
- unsigned char AckChild;
- #define incPolledChild() { _PolledChild++ ; if(_PolledChild>MaxPolledChild) {_PolledChild=1;_bit_PolledChild =2;} else _bit_PolledChild = ((_bit_PolledChild << 1) | (_bit_PolledChild >> 7)); }
- #define PolledChild() _PolledChild
- #define bitset(var,bitno) ((var) |= (1 << (bitno)))
- #define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
- #define bittst(var,bitno) ((var) & (1 << (bitno)))
- /*const unsigned char _bits_table[8]={1,2,4,8,32,64,128};
- #define bitset(var,bitno) ((var) |= _bits_table[bitno])
- #define bitclr(var,bitno) ((var) &= ~_bits_table[bitno])
- #define bittst(var,bitno) (var& _bits_table[bitno])*/
- #define SET_CHILD(num) bitset(Children[(num)>>3],((num)&7))
- #define CLR_CHILD(num) bitclr(Children[(num)>>3],((num)&7))
- #define TST_CHILD(num) bittst(Children[(num)>>3],((num)&7))
- #define SET_CHILDOK(num) bitset(ChildrenOK[(num)>>3],((num)&7))
- #define CLR_CHILDOK(num) bitclr(ChildrenOK[(num)>>3],((num)&7))
- #define TST_CHILDOK(num) bittst(ChildrenOK[(num)>>3],((num)&7))
- #define SET_POLLEDCHILD() ( Children[_PolledChild>>3]|= _bit_PolledChild )
- #define CLR_POLLEDCHILD() ( Children[_PolledChild>>3]&= ~_bit_PolledChild )
- #define TST_POLLEDCHILD() ( Children[_PolledChild>>3]& _bit_PolledChild )
- #define SET_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]|= _bit_PolledChild )
- #define CLR_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]&= ~_bit_PolledChild )
- #define TST_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]& _bit_PolledChild )
- #define HI_CHAR(N) ( ((N)>>4)<10?((N)>>4)+'0':((N)>>4)-10+'A' )
- #define LO_CHAR(N) ( ((N)&15)<10?((N)&15)+'0':((N)&15)-10+'A' )
- //---------------serial macros ---------------------------------------
- void Serial_Init_Receiver(void)
- {
- while(TXSTAbits.TRMT==0);
- WREG=RCREG;
- WREG=RCREG;
- RCSTAbits.CREN=0;
- RCSTAbits.CREN=1;
- PIE1bits.RCIE=1;
- PIE1bits.TXIE=0;
- mSerDrv_Off();
- }
- #define Serial_Init_Driver() {\
- RCSTAbits.CREN=0; \
- mSerDrv_On(); \
- PIE1bits.RCIE=0; \
- }
- #define Serial_Init_None() {\
- RCSTAbits.CREN=0; \
- mSerDrv_Off(); \
- PIE1bits.RCIE=0; \
- PIE1bits.TXIE=0; \
- }
- //#define Serial_Is_Driver() mSerDrv_isOn()
- #define Serial_Is_Receiver() (PIE1bits.RCIE)
- //---------------------------------------------------------------------
- void FraiseInit(void)
- {
- /*FrTXin=0;
- FrTXout=0;
- FrTXfree=255;*/
- FrGotLineFromUsb=0;
- LineFromUsbLen=0;
- FraiseStatus.VAL=0;
- FraiseState=fIDLE;
- FraiseMessage=fmessNONE;
- FrRXin=0;
- FrRXout=0;
- PollDelay=0;
- //OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 103); // 48 MHz/4/115200 = 104
- BAUDCON = 0x08; // BRG16 = 1
- OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_NINE_BIT & USART_CONT_RX & USART_BRGH_HIGH & USART_ADDEN_OFF, 47); // 48 MHz/4/250000 = 48
- USART_Status.TX_NINE=1;
- // Initialize Timer2
- // The prescaler will be at 16
- T2CONbits.T2CKPS1 = 1;
- T2CONbits.T2CKPS0 = 1;
- // We want no TMR2 post scaler
- T2CONbits.T2OUTPS3 = 0;
- T2CONbits.T2OUTPS2 = 0;
- T2CONbits.T2OUTPS1 = 0;
- T2CONbits.T2OUTPS0 = 0;
- // Set our reload value
- //PR2 = kPR2_RELOAD;
- PR2 = 255;
- T2CONbits.TMR2ON = 1;
- // Initalize switchs and leds
- mInitAllLEDs();
- mInitSwitch();
- mInitSerDrv();
- //Serial_Init_Receiver();
- Serial_Init_Driver();
- for(i=0;i<16;i++) {
- Children[i]=0;
- ChildrenOK[i]=0;
- }
- MaxPolledChild=4;
- _PolledChild=1;_bit_PolledChild =2;
- // Set interrupt priorities
- PIE1bits.TMR2IE = 0;
- IPR1bits.TMR2IP = 1;
- IPR1bits.TXIP = 1;
- IPR1bits.RCIP = 1;
- INTCONbits.GIEH = 1;
- }
- /*-----------------------------------------------------------------------------------*/
- /* Send received fraise packet to usb. */
- /*-----------------------------------------------------------------------------------*/
- void FrSendtoUsb(void)
- {
- unsigned char i=0,c,c2;
- if(!FraiseStatus.RXFULL) return;
- c=FrRXbuf[i++]; //discard len byte
- // send hex string of PolledChild+128*packet_is_char
-
- /*c2=(PolledChild()>>4)+'0'; if(c2>'9') c2+='A'-'9'-1;
- if(FraiseStatus.RXCHAR) c2|=8;*/
- c2=(PolledChild()>>4);
- if(FraiseStatus.RXCHAR) c2|=8;
- c2+='0'; if(c2>'9') c2+='A'-'9'-1;
- putchar(c2);
- c2=(PolledChild()&15)+'0'; if(c2>'9') c2+='A'-'9'-1;
- putchar(c2);
- if(FraiseStatus.RXCHAR)
- while(i<FrRXin) putchar(FrRXbuf[i++]);
- else
- while(i<FrRXin) {
- c=FrRXbuf[i++];
- c2=(c>>4)+'0'; if(c2>'9') c2+='A'-'9'-1;
- putchar(c2);
- c2=(c&15)+'0'; if(c2>'9') c2+='A'-'9'-1;
- putchar(c2);
- }
- putchar('\n');
- FrRXout=FrRXin=0;
- FraiseStatus.RXFULL=0;
- }
- void FrSendMessagetoUsb(void)
- {
-
- if(FraiseStatus.OERR) { FraiseStatus.OERR=0;printf((STRING)"OERR !!\n");}
- if(FraiseStatus.FERR) { FraiseStatus.FERR=0;printf((STRING)"FERR !!\n");}
- if(FraiseMessage==fmessNONE) return;
- switch(FraiseMessage) {
- case fmessFOUND :
- if(!TST_CHILDOK(AckChild)){
- SET_CHILDOK(AckChild);
- putchar('\n');
- putchar('s');
- putchar('C');
- putchar(HI_CHAR(AckChild));
- putchar(LO_CHAR(AckChild));
- putchar('\n');
- }
- break;
- case fmessLOST :
- if(TST_CHILDOK(AckChild)){
- CLR_CHILDOK(AckChild);
- putchar('\n');
- putchar('s');
- putchar('c');
- putchar(HI_CHAR(AckChild));
- putchar(LO_CHAR(AckChild));
- putchar('\n');
- }
- break;
- case fmessCHKSUM :
- putchar('\n');
- putchar('s');
- putchar('x');
- putchar(HI_CHAR(AckChild));
- putchar(LO_CHAR(AckChild));
- putchar('\n');
- break;
- case fmessNACK :
- putchar('\n');
- putchar('s');
- putchar('a');
- putchar(HI_CHAR(AckChild));
- putchar(LO_CHAR(AckChild));
- putchar('\n');
- break;
- case fmessTOUT :
- putchar('\n');
- putchar('s');
- putchar('T');
- putchar(HI_CHAR(AckChild));
- putchar(LO_CHAR(AckChild));
- putchar('\n');
- break;
- }
- FraiseMessage=fmessNONE;
- }
- #define FrTXPacketInit(b) { FrTXpacket_i=1 ; FrTXchksum=FrTXpacket[0]=(b);}
- #define FrTXPacketData(b) { FrTXchksum+=FrTXpacket[FrTXpacket_i]=(b);FrTXpacket_i++;}
- #define FrTXPacketClose() { FrTXpacket[FrTXpacket_i]=-(char)FrTXchksum; FrTXpacket_len=FrTXpacket_i+1; }
- #define FrTXPacketLaunch() \
- { \
- Serial_Init_Driver(); \
- TXSTAbits.TX9D=1; \
- TXREG=AckChild=FrTXpacket[0]; \
- TXSTAbits.TX9D=0; \
- FrTXpacket_i=1; \
- FraiseState=fOUT; \
- PIE1bits.TXIE=1; \
- }
- #define FrTXPacketLaunchBl() \
- { \
- Serial_Init_Driver(); \
- TXREG=FrTXpacket[0]; \
- FrTXpacket_i=1; \
- FraiseState=fBLOUT; \
- PIE1bits.TXIE=1; \
- }
- void FrGetLineFromUsb(void)
- {
- #define GETNEXTCHAR() LineFromUsb[i++]
- #define PEEKNEXTCHAR() LineFromUsb[i]
- #define SKIPNEXTCHAR() i++
- #define LINE_HAS_CHAR() (i<LineFromUsbLen)
- unsigned char len,c,c2,n;//,txout_end;
- unsigned char i;
- if(!FrGotLineFromUsb) goto discard;
-
- //printf((const far rom char*)"FrGetLineFromUsb()\n");
- //while(TXSTAbits.TRMT==0); //wait end of serial transmit
- FraiseStatus.TX_NEEDACK=0;
- FraiseStatus.TXCHAR=0;
- len=LineFromUsbLen;
- i=0;
-
- c=GETNEXTCHAR(); //1st byte = command (or hi nibble of address)
-
- //printf((const far rom char*)"parsing ; 1st char : %c\n",c);
- if(c=='#') {
- //printf((const far rom char*)"system command...\n");
- //****************** system command , begining by '#': **********************
- if(len<2) goto discard;
- c=GETNEXTCHAR(); //what is the command ?
- //printf((const far rom char*)"2nd char : %c\n",c);
- if(c=='S'){ // start device pulling
- if(len!=4) goto discard; //incorrect packet...
- c=GETNEXTCHAR();
- c-='0';if (c>9) c-='A'-'9'-1;
- c2=GETNEXTCHAR();
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- n=c2+(c<<4);
- if((n>0)&&(n<128)) {
- SET_CHILD(n);
- CLR_CHILDOK(n);
- if(MaxPolledChild<n) MaxPolledChild=n;
- }
- goto discard;
- }
- else if(c=='C'){
- if(len!=4) goto discard;
- c=GETNEXTCHAR();
- c-='0';if (c>9) c-='A'-'9'-1;
- c2=GETNEXTCHAR();
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- n=c2+(c<<4);
- if((n>0)&&(n<128)) {
- CLR_CHILDOK(n);
- CLR_CHILD(n);
- }
- goto discard;
- }
- else if(c=='i'){
- printf((STRING)"s fraise init...\n");
- FraiseInit();
- goto discard;
- }
- else if(c=='L'){
- printf((STRING)"\ns fraise log :\n");
- c2=0;
- printf((STRING)"FraiseState : %d ; FraiseStatus: %d\n",FraiseState,FraiseStatus);
- for(n=1;n<=MaxPolledChild;n++){
- if (TST_CHILD(n)){
- printf((STRING)"%d:%d ",n,TST_CHILDOK(n)!=0);
- if((++c2)%16==0) putchar('\n');
- }
- }
- putchar('\n');
- goto discard;
- }
- else if(c=='F'){
-
- FraiseStatus.FBLDON=0;
- FraiseState=fIDLE;
- Serial_Init_None();
- printf((STRING)"Quit bootloader mode.\n");
- goto discard;
- }
- else if(c=='V'){
- printf(VERSION_STRING);
- goto discard;
- }
- else if(c=='R') {
- n=ee_read_byte(ID_EE_ADDRESS);
- printf ((STRING)"sID%c%c\n",HI_CHAR(n),LO_CHAR(n));
- }
- else if(c=='W') {
- c=GETNEXTCHAR();
- c-='0';if (c>9) c-='A'-'9'-1;
- c2=GETNEXTCHAR();
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- n=c2+(c<<4);
- ee_write_byte(ID_EE_ADDRESS,n);
- }
- else if(c=='E') {
- while(LINE_HAS_CHAR()) {
- c=GETNEXTCHAR();
- putchar(c);
- }
- putchar('\n');
- }
- else if(c=='D') {
- if(len!=4) goto discard;
- c=GETNEXTCHAR();
- c-='0';if (c>9) c-='A'-'9'-1;
- c2=GETNEXTCHAR();
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- n=c2+(c<<4);
- PollDelay=n;
- }
- goto discard;
- }
- else if(c=='!') {
-
- len-=1;
- if(len<1) goto discard;
-
- FrTXPacketInit(0);
-
- c=PEEKNEXTCHAR();
-
- if(c=='B'||c=='I'||c=='N'||c=='R'||c=='P'||c=='F'){
- FraiseStatus.TXCHAR=1;
-
- if(c=='F') {
- FraiseStatus.FBLDON=1;
- printf((STRING)"Enter bootloader mode.\n");
- }
- else FraiseStatus.FBLDON=0;
-
-
-
- goto fill_packet;
- }
- if(c=='b'){
- SKIPNEXTCHAR(); len-=1;
- goto fill_packet;
- }
- goto discard;
- }
- if(FraiseStatus.FBLDON) {
-
-
- FrTXPacketInit(len+1);
- FrTXPacketData(c);
-
- while(LINE_HAS_CHAR()) FrTXPacketData(GETNEXTCHAR());
- FrTXPacketClose();
- FrTXtries=0;
- FrTXPacketLaunchBl();
- goto discard;
- }
-
-
-
- if(len<3) goto discard;
-
-
- c-='0';if (c>9) c-='A'-'9'-1;
- c2=GETNEXTCHAR();
-
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- n=c2+(c<<4);
- if(n&128) FraiseStatus.TXCHAR=1;
- else FraiseStatus.TXCHAR=0;
- n&=127;
- if (n==0) goto discard;
- FrTXPacketInit(n);
-
- len-=2;
- FraiseStatus.TX_NEEDACK=1;
-
- fill_packet:
- if(FraiseStatus.TXCHAR) len|=128;
- else len>>=1;
- FrTXPacketData(len);
- if(FraiseStatus.TXCHAR) {
- while(LINE_HAS_CHAR()) FrTXPacketData(GETNEXTCHAR());
- }
- else while(LINE_HAS_CHAR()) {
- c=GETNEXTCHAR();
- c-='0';if (c>9) c-='A'-'9'-1;
- if(!LINE_HAS_CHAR()) goto discard;
- c2=GETNEXTCHAR();
- c2-='0';if (c2>9) c2-='A'-'9'-1;
- if((c>15)||(c2>15)) goto discard;
- c2+=(c<<4);
- FrTXPacketData(c2);
- }
- FrTXPacketClose();
-
- FrTXtries=0;
- FrTXPacketLaunch();
- discard:
- LineFromUsbLen=0;
- FrGotLineFromUsb=0;
- return;
- }
- #define T_2SERBYTES (256UL-((65UL*12UL)/16UL))
- #define T_1ms (256UL-((600UL*12UL/3UL)/16UL))
- #define InitTimer1ms() { PIE1bits.TMR2IE=0;T2CON=31;TMR2=T_1ms;PIR1bits.TMR2IF=0; }
- #define ResetTimer1ms() { TMR2=T_1ms;PIR1bits.TMR2IF=0;}
- #define InitTimer(time) { PIE1bits.TMR2IE=0;T2CON=7;TMR2=time;PIR1bits.TMR2IF=0;PIE1bits.TMR2IE=1; }
- #define TimerOut() (PIR1bits.TMR2IF)
- #define StopTimer() {T2CON=3;PIE1bits.TMR2IE=0;PIR1bits.TMR2IF=0;}
- void FraiseISR()
- {
- unsigned char c;
-
-
- if(RCSTAbits.OERR) FraiseStatus.OERR=1;
- if(RCSTAbits.FERR) FraiseStatus.FERR=1;
- if(FraiseState==fWAITACK)
- {
- if (!Serial_Is_Receiver()) {
- if (TimerOut()) {
- Serial_Init_Receiver();
- InitTimer1ms();
- }
- return;
- }
- if(PIR1bits.RCIF) {
- StopTimer();
- c=RCREG;
- Serial_Init_None();
- if(c!=0) {
- if(++FrTXtries<3) {
- FrTXPacketLaunch();
- return;
- }
- else {
- FraiseMessage=fmessNACK;
- }
- }
- FraiseState=fIDLE;
- return;
- }
- return;
- }
- else if(FraiseState==fIN)
- {
- if (!Serial_Is_Receiver()) {
- if (TimerOut()) {
- Serial_Init_Receiver();
- InitTimer1ms();
- }
-
- return;
- }
- if(PIR1bits.RCIF) {
- c=RCREG;
- FrRXbuf[FrRXin]=c;
- FrRXin++;
- ResetTimer1ms();
- if(FrRXin==1) {
- FrRXchksum=0;
- FrRXout=(c&63);
- FrRXout++;
- if(c==0){
- StopTimer();
- Serial_Init_None();
- FraiseState=fIDLE;
-
-
- FraiseMessage=fmessFOUND;
-
-
- } else {
- if(c&128) FraiseStatus.RXCHAR=1;
- else FraiseStatus.RXCHAR=0;
-
- }
- }
-
- FrRXchksum+=c;
-
- if(FrRXin>FrRXout){
- StopTimer();
- Serial_Init_None();
- FraiseState=fIDLE;
- if(!FrRXchksum) {
-
- FrRXin--;
- FraiseStatus.RXFULL=1;
-
-
-
- FraiseMessage=fmessFOUND;
-
-
- TXREG=0;
- } else {
-
- FraiseMessage=fmessCHKSUM;
- TXREG=1;
- }
- }
- return;
- }
-
- return;
- }
- else if(FraiseState==fOUT)
- {
- if (TimerOut()&&(FrTXpacket_i==FrTXpacket_len)) {
- StopTimer();
- FraiseState=fIDLE;
- Serial_Init_Receiver();
- Serial_Init_None();
- return;
- }
- if(PIR1bits.TXIF==0) return;
- StopTimer();
- TXREG=FrTXpacket[FrTXpacket_i++];
- if(FrTXpacket_i==FrTXpacket_len) {
- PIE1bits.TXIE=0;
- if(FraiseStatus.TX_NEEDACK){
- InitTimer(T_2SERBYTES);
-
- FraiseState=fWAITACK;
- }
- else {
- if(FraiseStatus.FBLDON) {
- Serial_Init_Receiver();
- FraiseState=fBLIN;
- }
- else {
- InitTimer(T_2SERBYTES);
-
-
- }
- }
- }
- return;
- }
- else if(FraiseState==fBLOUT)
- {
- StopTimer();
- if(PIR1bits.TXIF==0) return;
- TXREG=FrTXpacket[FrTXpacket_i++];
- if(FrTXpacket_i==FrTXpacket_len) {
- PIE1bits.TXIE=0;
- InitTimer(T_2SERBYTES);
- FraiseState=fBLIN;
- FrRXin=FrRXout=0;
- }
- return;
- }
- else if(FraiseState==fBLIN)
- {
- if (!Serial_Is_Receiver()) {
- if (TimerOut()) {
- Serial_Init_Receiver();
- StopTimer();
- }
- return;
- }
- if(PIR1bits.RCIF) {
-
- c=RCREG;
- FrRXbuf[FrRXin]=c;
- FrRXin++;
- return;
- }
- return;
- }
- else if(FraiseState==fIDLE)
- {
- StopTimer();
-
- PIE1bits.TXIE=0;
- PIE1bits.RCIE=0;
- return;
- }
- }
- void FraiseService(void)
- {
-
-
-
-
-
-
-
- FrSendMessagetoUsb();
- if(FraiseState==fBLIN) {
- if(FrRXin!=FrRXout) {
- while(FrRXin!=FrRXout) putchar(FrRXbuf[FrRXout++]);
- CDC_Flush_In_Now();
- }
- if(FrGotLineFromUsb) FrGetLineFromUsb();
- goto _fin;
- }
-
- INTCONbits.GIEH = 0;
- if(FraiseState==fIDLE) {
- StopTimer();
-
- if(FrGotLineFromUsb) {
- FrGetLineFromUsb();
- goto _fin;
- }
-
- if(!FraiseStatus.RXFULL){
- if(PollCount>=PollDelay) {
- PollCount=0;
-
- incPolledChild();
- if(TST_POLLEDCHILD())
- {
-
- FrRXchksum=FrRXin=FrRXout=0;
- TXSTAbits.TX9D=1;
- Serial_Init_Driver();
- FrSendMessagetoUsb();
- INTCONbits.GIEL=0;
- AckChild=PolledChild();
- TXREG=(PolledChild()|128);
- TXSTAbits.TX9D=0;
- TXREG=(PolledChild()|128);
- InitTimer(T_2SERBYTES);
- FraiseState=fIN;
- INTCONbits.GIEL=1;
- }
- }
- }
- } else if(FraiseState==fWAITACK) {
- if((Serial_Is_Receiver()) && TimerOut() ){
- StopTimer();
- Serial_Init_None();
- if(++FrTXtries<3) { FrTXPacketLaunch(); }
- else
- {
-
- FraiseMessage=fmessTOUT;
- FraiseState=fIDLE;
- }
- }
- } else if(FraiseState==fIN){
- if( (Serial_Is_Receiver()) && TimerOut() ){
- StopTimer();
-
- FraiseMessage=fmessLOST;
-
- Serial_Init_None();
- FraiseState=fIDLE;
- }
- }
- _fin :
- INTCONbits.GIEH = 1;
- FrSendtoUsb();
- }
-
- void FraiseSOF(void)
- {
- static BYTE il;
- if((il++)==200) { il=0; mLED_2_Toggle(); }
- if(++PollCount==0) PollCount=255;
- }
|