fraisemaster.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. /*********************************************************************
  2. *
  3. * Fraise master firmware v2.1
  4. *
  5. *********************************************************************
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software Foundation,
  16. Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. * Copyright (c) Antoine Rousseau 2009-2011
  19. ********************************************************************/
  20. #ifdef SDCC
  21. #include <pic18f2550.h>
  22. #else
  23. #include <p18cxxx.h>
  24. #endif
  25. #include <usart.h>
  26. #include <stdio.h>
  27. #include <ctype.h>
  28. #ifndef SDCC
  29. #include <delays.h>
  30. #endif
  31. //#include "system/typedefs.h"
  32. //#include "system/usb/usb.h"
  33. //#include "io_cfg.h" // I/O pin mapping
  34. #include "prj_usb_config.h"
  35. #include "fraisemaster.h"
  36. #define VERSION_STRING (STRING)"sV UsbFraise 2.1.4 (DP_USB) Antoine Rousseau 2015\n"
  37. #include "eeprom.h"
  38. //#pragma udata
  39. #define ID_EE_ADDRESS 0 //Address of ID in EEPROM
  40. extern int _user_putc(char c);
  41. typedef const rom far char *STRING;
  42. typedef unsigned char BYTE;
  43. BYTE LineFromUsb[LINE_FROM_USB_MAXLEN];
  44. BYTE LineFromUsbLen;
  45. BYTE FrGotLineFromUsb;
  46. extern void putc_cdc(BYTE c);
  47. #define putchar putc_cdc
  48. extern void CDC_Flush_In_Now(void);
  49. extern union USART USART_Status;
  50. //---------- FrTX : Host to Master -------------------------------------------
  51. /*unsigned char FrTXbuf[256]; //Fraise TX ring buffer; don't change size of this table : hardcoded in asm..
  52. unsigned char FrTXin=0,FrTXout=0; //Pointers to Fraise TX buffer
  53. unsigned char FrTXfree=255;
  54. #define FrTXempty (FrTXin==FrTXout)*/
  55. //---------- FrTXPacket : Master to Device(s) -------------------------------------------
  56. unsigned char FrTXpacket[64]; //Fraise TX packet buffer
  57. unsigned char FrTXpacket_i;
  58. unsigned char FrTXpacket_len;
  59. unsigned char FrTXchksum;
  60. unsigned char FrTXtries; //number of tries to send the TX packet
  61. //---------- FrRX : Device to Master -------------------------------------------
  62. unsigned char FrRXbuf[64]; //Fraise RX buffer:32 bytes
  63. unsigned char FrRXin;
  64. unsigned char FrRXout;
  65. //#define FrRXfull (FrRXin!=0)
  66. unsigned char FrRXchksum;
  67. unsigned char PollDelay;
  68. volatile unsigned char PollCount;
  69. //---------- FraiseStatus bits -------------------------------------------
  70. union {
  71. unsigned char VAL;
  72. struct {
  73. unsigned RXFULL :1; // a RX packet has been received
  74. unsigned RXCHAR :1; // the RX packet is char (do not convert to hexa string)
  75. // unsigned TXFULL :1; // the TX packet buffer is ready to be sent
  76. unsigned TXCHAR :1; // the TX packet was char (was not converted from hexa string)
  77. unsigned TX_NEEDACK :1; // the TX packet needs an acknowledge
  78. unsigned FBLDON :1;
  79. unsigned OERR :1;
  80. unsigned FERR :1;
  81. };
  82. } FraiseStatus;
  83. unsigned char i,c,c2; // general counter and tmp
  84. unsigned char t1,t2,t3; // general asm tmp
  85. unsigned int p;
  86. //---------- finite state machine FraiseState ----------------------------
  87. typedef enum {
  88. fIDLE
  89. ,fWAITACK
  90. ,fOUT
  91. ,fIN
  92. ,fBLOUT
  93. ,fBLIN
  94. } tFraiseState;
  95. tFraiseState FraiseState;
  96. //---------- FraiseMessage from interrupt routine -------------------------
  97. typedef enum {
  98. fmessNONE
  99. ,fmessFOUND // polled device has been found
  100. ,fmessLOST // polled device has been lost
  101. ,fmessCHKSUM // checksum error on a packet from polled device
  102. ,fmessNACK // destination device refused packet (packet error | buffer full)
  103. ,fmessTOUT // destination device didn't acknowledge packet (timeout)
  104. } tFraiseMessage;
  105. tFraiseMessage FraiseMessage;
  106. //---------- Devices State tables ----------------------------------------
  107. unsigned char _PolledChild; // id of the polled child
  108. unsigned char _bit_PolledChild; // 1<<PolledChild%8
  109. unsigned char MaxPolledChild; // maximum id of the polled child
  110. unsigned char Children[16]; // 16*8=128 bits: bit(Children[i],j)=child[i*8+j] is polled
  111. unsigned char ChildrenOK[16]; // 16*8=128 bits: bit(Children[i],j)=child[i*8+j] is present
  112. unsigned char AckChild; //child which must send a ACK now
  113. #define incPolledChild() { _PolledChild++ ; if(_PolledChild>MaxPolledChild) {_PolledChild=1;_bit_PolledChild =2;} else _bit_PolledChild = ((_bit_PolledChild << 1) | (_bit_PolledChild >> 7)); }
  114. //#define clearPolledChild() { _PolledChild=0 ; _bit_PolledChild=1 ; }
  115. #define PolledChild() _PolledChild
  116. #define bitset(var,bitno) ((var) |= (1 << (bitno)))
  117. #define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
  118. #define bittst(var,bitno) ((var) & (1 << (bitno)))
  119. /*const unsigned char _bits_table[8]={1,2,4,8,32,64,128};
  120. #define bitset(var,bitno) ((var) |= _bits_table[bitno])
  121. #define bitclr(var,bitno) ((var) &= ~_bits_table[bitno])
  122. #define bittst(var,bitno) (var& _bits_table[bitno])*/
  123. #define SET_CHILD(num) bitset(Children[(num)>>3],((num)&7))
  124. #define CLR_CHILD(num) bitclr(Children[(num)>>3],((num)&7))
  125. #define TST_CHILD(num) bittst(Children[(num)>>3],((num)&7))
  126. #define SET_CHILDOK(num) bitset(ChildrenOK[(num)>>3],((num)&7))
  127. #define CLR_CHILDOK(num) bitclr(ChildrenOK[(num)>>3],((num)&7))
  128. #define TST_CHILDOK(num) bittst(ChildrenOK[(num)>>3],((num)&7))
  129. #define SET_POLLEDCHILD() ( Children[_PolledChild>>3]|= _bit_PolledChild )
  130. #define CLR_POLLEDCHILD() ( Children[_PolledChild>>3]&= ~_bit_PolledChild )
  131. #define TST_POLLEDCHILD() ( Children[_PolledChild>>3]& _bit_PolledChild )
  132. #define SET_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]|= _bit_PolledChild )
  133. #define CLR_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]&= ~_bit_PolledChild )
  134. #define TST_POLLEDCHILDOK() ( ChildrenOK[_PolledChild>>3]& _bit_PolledChild )
  135. //------------- other globals -----------------------------------------
  136. //unsigned short nexttime; //timer
  137. //unsigned short time;
  138. //extern unsigned char g_TX_buf_free; //free space in "printf" buffer...
  139. //-------------- byte to HEX string -----------------------------------
  140. #define HI_CHAR(N) ( ((N)>>4)<10?((N)>>4)+'0':((N)>>4)-10+'A' )
  141. #define LO_CHAR(N) ( ((N)&15)<10?((N)&15)+'0':((N)&15)-10+'A' )
  142. //---------------serial macros ---------------------------------------
  143. void Serial_Init_Receiver(void)
  144. {
  145. while(TXSTAbits.TRMT==0);
  146. WREG=RCREG;
  147. WREG=RCREG;
  148. RCSTAbits.CREN=0;
  149. RCSTAbits.CREN=1;
  150. PIE1bits.RCIE=1;
  151. PIE1bits.TXIE=0;
  152. mSerDrv_Off();
  153. }
  154. #define Serial_Init_Driver() {\
  155. RCSTAbits.CREN=0; \
  156. mSerDrv_On(); \
  157. PIE1bits.RCIE=0; \
  158. }
  159. #define Serial_Init_None() {\
  160. RCSTAbits.CREN=0; \
  161. mSerDrv_Off(); \
  162. PIE1bits.RCIE=0; \
  163. PIE1bits.TXIE=0; \
  164. }
  165. //#define Serial_Is_Driver() mSerDrv_isOn()
  166. #define Serial_Is_Receiver() (PIE1bits.RCIE)
  167. //---------------------------------------------------------------------
  168. void FraiseInit(void)
  169. {
  170. /*FrTXin=0;
  171. FrTXout=0;
  172. FrTXfree=255;*/
  173. FrGotLineFromUsb=0;
  174. LineFromUsbLen=0;
  175. FraiseStatus.VAL=0;
  176. FraiseState=fIDLE;
  177. FraiseMessage=fmessNONE;
  178. FrRXin=0;
  179. FrRXout=0;
  180. PollDelay=0;
  181. //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
  182. BAUDCON = 0x08; // BRG16 = 1
  183. 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
  184. USART_Status.TX_NINE=1;
  185. // Initialize Timer2
  186. // The prescaler will be at 16
  187. T2CONbits.T2CKPS1 = 1;
  188. T2CONbits.T2CKPS0 = 1;
  189. // We want no TMR2 post scaler
  190. T2CONbits.T2OUTPS3 = 0;
  191. T2CONbits.T2OUTPS2 = 0;
  192. T2CONbits.T2OUTPS1 = 0;
  193. T2CONbits.T2OUTPS0 = 0;
  194. // Set our reload value
  195. //PR2 = kPR2_RELOAD;
  196. PR2 = 255;
  197. T2CONbits.TMR2ON = 1;
  198. // Initalize switchs and leds
  199. mInitAllLEDs();
  200. mInitSwitch();
  201. mInitSerDrv();
  202. //Serial_Init_Receiver();
  203. Serial_Init_Driver();
  204. for(i=0;i<16;i++) {
  205. Children[i]=0;
  206. ChildrenOK[i]=0;
  207. }
  208. MaxPolledChild=4;
  209. _PolledChild=1;_bit_PolledChild =2;
  210. // Set interrupt priorities
  211. PIE1bits.TMR2IE = 0;
  212. IPR1bits.TMR2IP = 1;
  213. IPR1bits.TXIP = 1;
  214. IPR1bits.RCIP = 1;
  215. INTCONbits.GIEH = 1;
  216. }
  217. /*-----------------------------------------------------------------------------------*/
  218. /* Send received fraise packet to usb. */
  219. /*-----------------------------------------------------------------------------------*/
  220. void FrSendtoUsb(void)
  221. {
  222. unsigned char i=0,c,c2;
  223. if(!FraiseStatus.RXFULL) return;
  224. c=FrRXbuf[i++]; //discard len byte
  225. // send hex string of PolledChild+128*packet_is_char
  226. /*c2=(PolledChild()>>4)+'0'; if(c2>'9') c2+='A'-'9'-1;
  227. if(FraiseStatus.RXCHAR) c2|=8;*/
  228. c2=(PolledChild()>>4);
  229. if(FraiseStatus.RXCHAR) c2|=8;
  230. c2+='0'; if(c2>'9') c2+='A'-'9'-1;
  231. putchar(c2);
  232. c2=(PolledChild()&15)+'0'; if(c2>'9') c2+='A'-'9'-1;
  233. putchar(c2);
  234. if(FraiseStatus.RXCHAR)
  235. while(i<FrRXin) putchar(FrRXbuf[i++]);
  236. else
  237. while(i<FrRXin) {
  238. c=FrRXbuf[i++];
  239. c2=(c>>4)+'0'; if(c2>'9') c2+='A'-'9'-1;
  240. putchar(c2);
  241. c2=(c&15)+'0'; if(c2>'9') c2+='A'-'9'-1;
  242. putchar(c2);
  243. }
  244. putchar('\n');
  245. FrRXout=FrRXin=0;
  246. FraiseStatus.RXFULL=0;
  247. }
  248. /*-----------------------------------------------------------------------------------*/
  249. /* Send fraise ISR message to usb. */
  250. /*-----------------------------------------------------------------------------------*/
  251. void FrSendMessagetoUsb(void)
  252. {
  253. /* fmessNONE
  254. ,fmessFOUND // polled device has been found
  255. ,fmessLOST // polled device has been lost
  256. ,fmessCHKSUM // checksum error on a packet from polled device
  257. ,fmessNACK // destination device didn't acknowledge packet (packet error | buffer full)
  258. ,fmessTOUT // destination device didn't acknowledge packet (timeout)
  259. */
  260. if(FraiseStatus.OERR) { FraiseStatus.OERR=0;printf((STRING)"OERR !!\n");}
  261. if(FraiseStatus.FERR) { FraiseStatus.FERR=0;printf((STRING)"FERR !!\n");}
  262. if(FraiseMessage==fmessNONE) return;
  263. switch(FraiseMessage) {
  264. case fmessFOUND : // print "sCdd"
  265. if(!TST_CHILDOK(AckChild)){
  266. SET_CHILDOK(AckChild);
  267. putchar('\n');
  268. putchar('s');
  269. putchar('C');
  270. putchar(HI_CHAR(AckChild));
  271. putchar(LO_CHAR(AckChild));
  272. putchar('\n');
  273. }
  274. break;
  275. case fmessLOST : // print "scdd"
  276. if(TST_CHILDOK(AckChild)){
  277. CLR_CHILDOK(AckChild);
  278. putchar('\n');
  279. putchar('s');
  280. putchar('c');
  281. putchar(HI_CHAR(AckChild));
  282. putchar(LO_CHAR(AckChild));
  283. putchar('\n');
  284. }
  285. break;
  286. case fmessCHKSUM : // print "sxdd"
  287. putchar('\n');
  288. putchar('s');
  289. putchar('x');
  290. putchar(HI_CHAR(AckChild));
  291. putchar(LO_CHAR(AckChild));
  292. putchar('\n');
  293. break;
  294. case fmessNACK :// print "sadd"
  295. putchar('\n');
  296. putchar('s');
  297. putchar('a');
  298. putchar(HI_CHAR(AckChild));
  299. putchar(LO_CHAR(AckChild));
  300. putchar('\n');
  301. break;
  302. case fmessTOUT :// print "sTdd"
  303. putchar('\n');
  304. putchar('s');
  305. putchar('T');
  306. putchar(HI_CHAR(AckChild));
  307. putchar(LO_CHAR(AckChild));
  308. putchar('\n');
  309. break;
  310. }
  311. FraiseMessage=fmessNONE;
  312. }
  313. /*-----------------------------------------------------------------------------------*/
  314. /* Analyse packet from usb, build a packet to send to fraise if applicable. */
  315. /*-----------------------------------------------------------------------------------*/
  316. #define FrTXPacketInit(b) { FrTXpacket_i=1 ; FrTXchksum=FrTXpacket[0]=(b);}
  317. #define FrTXPacketData(b) { FrTXchksum+=FrTXpacket[FrTXpacket_i]=(b);FrTXpacket_i++;}
  318. #define FrTXPacketClose() { FrTXpacket[FrTXpacket_i]=-(char)FrTXchksum; FrTXpacket_len=FrTXpacket_i+1; }
  319. #define FrTXPacketLaunch() \
  320. { \
  321. Serial_Init_Driver(); \
  322. TXSTAbits.TX9D=1; \
  323. TXREG=AckChild=FrTXpacket[0]; \
  324. TXSTAbits.TX9D=0; \
  325. FrTXpacket_i=1; \
  326. FraiseState=fOUT; \
  327. PIE1bits.TXIE=1; \
  328. }
  329. #define FrTXPacketLaunchBl() \
  330. { \
  331. Serial_Init_Driver(); \
  332. TXREG=FrTXpacket[0]; \
  333. FrTXpacket_i=1; \
  334. FraiseState=fBLOUT; \
  335. PIE1bits.TXIE=1; \
  336. }
  337. void FrGetLineFromUsb(void)
  338. {
  339. #define GETNEXTCHAR() LineFromUsb[i++]
  340. #define PEEKNEXTCHAR() LineFromUsb[i]
  341. #define SKIPNEXTCHAR() i++
  342. #define LINE_HAS_CHAR() (i<LineFromUsbLen)
  343. unsigned char len,c,c2,n;//,txout_end;
  344. unsigned char i;
  345. if(!FrGotLineFromUsb) goto discard;
  346. //printf((const far rom char*)"FrGetLineFromUsb()\n");
  347. //while(TXSTAbits.TRMT==0); //wait end of serial transmit
  348. FraiseStatus.TX_NEEDACK=0;
  349. FraiseStatus.TXCHAR=0;
  350. len=LineFromUsbLen;
  351. i=0;
  352. c=GETNEXTCHAR(); //1st byte = command (or hi nibble of address)
  353. //printf((const far rom char*)"parsing ; 1st char : %c\n",c);
  354. if(c=='#') {
  355. //printf((const far rom char*)"system command...\n");
  356. //****************** system command , begining by '#': **********************
  357. if(len<2) goto discard;
  358. c=GETNEXTCHAR(); //what is the command ?
  359. //printf((const far rom char*)"2nd char : %c\n",c);
  360. if(c=='S'){ // start device pulling
  361. if(len!=4) goto discard; //incorrect packet...
  362. c=GETNEXTCHAR();
  363. c-='0';if (c>9) c-='A'-'9'-1;
  364. c2=GETNEXTCHAR();
  365. c2-='0';if (c2>9) c2-='A'-'9'-1;
  366. if((c>15)||(c2>15)) goto discard; //invalid packet
  367. n=c2+(c<<4);
  368. if((n>0)&&(n<128)) {
  369. SET_CHILD(n);
  370. CLR_CHILDOK(n);
  371. if(MaxPolledChild<n) MaxPolledChild=n;
  372. }
  373. goto discard;
  374. }
  375. else if(c=='C'){ // stop device pulling
  376. if(len!=4) goto discard; //incorrect packet...
  377. c=GETNEXTCHAR();
  378. c-='0';if (c>9) c-='A'-'9'-1;
  379. c2=GETNEXTCHAR();
  380. c2-='0';if (c2>9) c2-='A'-'9'-1;
  381. if((c>15)||(c2>15)) goto discard; //invalid packet
  382. n=c2+(c<<4);
  383. if((n>0)&&(n<128)) {
  384. CLR_CHILDOK(n);
  385. CLR_CHILD(n);
  386. }
  387. goto discard;
  388. }
  389. else if(c=='i'){
  390. printf((STRING)"s fraise init...\n");
  391. FraiseInit();
  392. goto discard;
  393. }
  394. else if(c=='L'){ //get log
  395. printf((STRING)"\ns fraise log :\n");
  396. c2=0;
  397. printf((STRING)"FraiseState : %d ; FraiseStatus: %d\n",FraiseState,FraiseStatus);
  398. for(n=1;n<=MaxPolledChild;n++){
  399. if (TST_CHILD(n)){
  400. printf((STRING)"%d:%d ",n,TST_CHILDOK(n)!=0);
  401. if((++c2)%16==0) putchar('\n');
  402. }
  403. }
  404. putchar('\n');
  405. goto discard; //return;
  406. }
  407. else if(c=='F'){ //quit bootloader mode
  408. //INTCONbits.GIEL = 0;
  409. FraiseStatus.FBLDON=0;
  410. FraiseState=fIDLE;
  411. Serial_Init_None();
  412. printf((STRING)"Quit bootloader mode.\n");
  413. goto discard; //return;
  414. }
  415. else if(c=='V'){ //get version string
  416. printf(VERSION_STRING);
  417. goto discard; //return;
  418. }
  419. else if(c=='R') { //read id
  420. n=ee_read_byte(ID_EE_ADDRESS);
  421. printf ((STRING)"sID%c%c\n",HI_CHAR(n),LO_CHAR(n));
  422. }
  423. else if(c=='W') { //write id
  424. c=GETNEXTCHAR();
  425. c-='0';if (c>9) c-='A'-'9'-1;
  426. c2=GETNEXTCHAR();
  427. c2-='0';if (c2>9) c2-='A'-'9'-1;
  428. if((c>15)||(c2>15)) goto discard; //invalid packet
  429. n=c2+(c<<4);
  430. ee_write_byte(ID_EE_ADDRESS,n);
  431. }
  432. else if(c=='E') { //echo
  433. while(LINE_HAS_CHAR()) {
  434. c=GETNEXTCHAR();
  435. putchar(c);
  436. }
  437. putchar('\n');
  438. }
  439. else if(c=='D') { //delay between each device polling (ms)
  440. if(len!=4) goto discard; //incorrect packet...
  441. c=GETNEXTCHAR();
  442. c-='0';if (c>9) c-='A'-'9'-1;
  443. c2=GETNEXTCHAR();
  444. c2-='0';if (c2>9) c2-='A'-'9'-1;
  445. if((c>15)||(c2>15)) goto discard; //invalid packet
  446. n=c2+(c<<4);
  447. PollDelay=n;
  448. }
  449. goto discard; //unknown system command ; discard packet.
  450. }
  451. else if(c=='!') {
  452. //****************** broadcast tx , begining by '!': *****************
  453. len-=1; // discard '!' byte
  454. if(len<1) goto discard;
  455. FrTXPacketInit(0);
  456. c=PEEKNEXTCHAR(); //what is the command ?
  457. if(c=='B'||c=='I'||c=='N'||c=='R'||c=='P'||c=='F'){
  458. FraiseStatus.TXCHAR=1;
  459. if(c=='F') {
  460. FraiseStatus.FBLDON=1;
  461. printf((STRING)"Enter bootloader mode.\n");
  462. }
  463. else FraiseStatus.FBLDON=0;
  464. //printf((STRING)"Broadcast %c : len = %d.\n", c,(int)len);
  465. goto fill_packet;
  466. }
  467. if(c=='b'){
  468. SKIPNEXTCHAR(); len-=1; // discard 'b' byte
  469. goto fill_packet;
  470. }
  471. goto discard;
  472. }
  473. if(FraiseStatus.FBLDON) {
  474. //putchar('\n');
  475. //printf((STRING)"bl tx\n");
  476. FrTXPacketInit(len+1);
  477. FrTXPacketData(c);
  478. while(LINE_HAS_CHAR()) FrTXPacketData(GETNEXTCHAR());
  479. FrTXPacketClose();
  480. FrTXtries=0;
  481. FrTXPacketLaunchBl();
  482. goto discard;
  483. }
  484. //else
  485. //****************** normal master to device tx:
  486. //the 2 first bytes must be device id + 128 if it is a char packet:
  487. if(len<3) goto discard;
  488. //c=GETNEXTCHAR();
  489. c-='0';if (c>9) c-='A'-'9'-1;
  490. c2=GETNEXTCHAR();
  491. //if (c2=='\n') return; //incomplete packet...
  492. c2-='0';if (c2>9) c2-='A'-'9'-1;
  493. if((c>15)||(c2>15)) goto discard; //invalid id
  494. n=c2+(c<<4);
  495. if(n&128) FraiseStatus.TXCHAR=1;
  496. else FraiseStatus.TXCHAR=0;
  497. n&=127;
  498. if (n==0) goto discard;
  499. FrTXPacketInit(n);
  500. //printf((STRING)"tx to dev %d\n",n);
  501. len-=2; //remove the two id bytes
  502. FraiseStatus.TX_NEEDACK=1;
  503. fill_packet:
  504. if(FraiseStatus.TXCHAR) len|=128;
  505. else len>>=1; //if not TXCHAR, data len in serial stream will be half than at text input (e.g two text bytes "00" -> one null byte )
  506. FrTXPacketData(len);
  507. if(FraiseStatus.TXCHAR) {
  508. while(LINE_HAS_CHAR()) FrTXPacketData(GETNEXTCHAR());
  509. }
  510. else while(LINE_HAS_CHAR()) {
  511. c=GETNEXTCHAR();
  512. c-='0';if (c>9) c-='A'-'9'-1;
  513. if(!LINE_HAS_CHAR()) goto discard; //incomplete...
  514. c2=GETNEXTCHAR();
  515. c2-='0';if (c2>9) c2-='A'-'9'-1;
  516. if((c>15)||(c2>15)) goto discard; //invalid hex string
  517. c2+=(c<<4);
  518. FrTXPacketData(c2);
  519. }
  520. FrTXPacketClose();
  521. //printf((STRING)"FrTXpacket_len=%d.\n",FrTXpacket_len);
  522. FrTXtries=0;
  523. FrTXPacketLaunch();
  524. discard:
  525. LineFromUsbLen=0;
  526. FrGotLineFromUsb=0;
  527. return;
  528. }
  529. //------------- time constants and macros --------------------------------------
  530. //#define T_1SERBYTE (256-((40*12)/16)) // For 40us TMR2 tick , 10*4us
  531. #define T_2SERBYTES (256UL-((65UL*12UL)/16UL)) // For 80us TMR2 tick , 20*4us, 15us before
  532. #define T_1ms (256UL-((600UL*12UL/3UL)/16UL)) // postscaler=3
  533. #define InitTimer1ms() { PIE1bits.TMR2IE=0;T2CON=31;/*post=3*/TMR2=T_1ms;PIR1bits.TMR2IF=0; }
  534. #define ResetTimer1ms() { TMR2=T_1ms;PIR1bits.TMR2IF=0;}
  535. #define InitTimer(time) { PIE1bits.TMR2IE=0;T2CON=7;/*no post*/TMR2=time;PIR1bits.TMR2IF=0;PIE1bits.TMR2IE=1; }
  536. #define TimerOut() (PIR1bits.TMR2IF)
  537. #define StopTimer() {T2CON=3;PIE1bits.TMR2IE=0;/*stop tmr2*/PIR1bits.TMR2IF=0;}
  538. /*#ifndef SDCC
  539. #pragma interruptlow low_ISR
  540. #endif
  541. void low_ISR(void)
  542. #ifdef SDCC
  543. shadowregs interrupt 2
  544. #endif*/
  545. void FraiseISR()
  546. {
  547. unsigned char c;
  548. //if(PIR1bits.RCIF) mLED_2_On();
  549. if(RCSTAbits.OERR) FraiseStatus.OERR=1;
  550. if(RCSTAbits.FERR) FraiseStatus.FERR=1;
  551. if(FraiseState==fWAITACK)
  552. {
  553. if (!Serial_Is_Receiver()) {
  554. if (TimerOut()) {
  555. Serial_Init_Receiver();
  556. InitTimer1ms();
  557. }
  558. return;
  559. }
  560. if(PIR1bits.RCIF) {
  561. StopTimer();
  562. c=RCREG;
  563. Serial_Init_None();
  564. if(c!=0) {//nACK
  565. if(++FrTXtries<3) {
  566. FrTXPacketLaunch(); // resend packet maximum 3 times
  567. return;
  568. }
  569. else {//printf("sS%c%c\n",HI_CHAR(PolledChild()),LO_CHAR(PolledChild()));
  570. FraiseMessage=fmessNACK;
  571. }
  572. }
  573. FraiseState=fIDLE;
  574. return;
  575. }
  576. return;
  577. }//endif(FraiseState==fWAITACK)
  578. else if(FraiseState==fIN)
  579. {
  580. if (!Serial_Is_Receiver()) {
  581. if (TimerOut()) {
  582. Serial_Init_Receiver();
  583. InitTimer1ms();
  584. }
  585. //mLED_2_Off();
  586. return;
  587. }
  588. if(PIR1bits.RCIF) {
  589. c=RCREG;
  590. FrRXbuf[FrRXin]=c;
  591. FrRXin++;
  592. ResetTimer1ms();
  593. if(FrRXin==1) { //first byte
  594. FrRXchksum=0;
  595. FrRXout=(c&63); //get length
  596. FrRXout++;
  597. if(c==0){ //device answered : nothing to say
  598. StopTimer();
  599. Serial_Init_None();
  600. FraiseState=fIDLE;
  601. //if(!TST_POLLEDCHILDOK()){
  602. //printf("\nsC%c%c\n",HI_CHAR(PolledChild()),LO_CHAR(PolledChild()));
  603. FraiseMessage=fmessFOUND;
  604. //SET_POLLEDCHILDOK();
  605. //}
  606. } else {
  607. if(c&128) FraiseStatus.RXCHAR=1;
  608. else FraiseStatus.RXCHAR=0;
  609. //printf("in len=%d ",FrRXout-1);
  610. }
  611. }
  612. //else
  613. FrRXchksum+=c;
  614. if(FrRXin>FrRXout){ //end of packet
  615. StopTimer();
  616. Serial_Init_None();
  617. FraiseState=fIDLE;
  618. if(!FrRXchksum) { //checksum ok
  619. //printf(" ok\n");
  620. FrRXin--; //discard checksum
  621. FraiseStatus.RXFULL=1;
  622. //FrRXout=0;
  623. //if(!TST_POLLEDCHILDOK()){
  624. //printf("\nsC%c%c\n",HI_CHAR(PolledChild()),LO_CHAR(PolledChild()));
  625. FraiseMessage=fmessFOUND;
  626. //SET_POLLEDCHILDOK();
  627. //}
  628. TXREG=0; //ACK
  629. } else {//checksum error
  630. //printf("\nsRxCsErr\n");
  631. FraiseMessage=fmessCHKSUM;
  632. TXREG=1; //NACK
  633. }
  634. }//end of if end of packet
  635. return;
  636. } //endif(PIR1bits.RCIF)
  637. return;
  638. }//endif (FraiseState==fIn)
  639. else if(FraiseState==fOUT) //if we are sending a packet to a child:
  640. {
  641. if (TimerOut()&&(FrTXpacket_i==FrTXpacket_len)) { //end of transmission
  642. StopTimer();
  643. FraiseState=fIDLE; // return to IDLE state.
  644. Serial_Init_Receiver();
  645. Serial_Init_None();
  646. return;
  647. }
  648. if(PIR1bits.TXIF==0) return;
  649. StopTimer();
  650. TXREG=FrTXpacket[FrTXpacket_i++]; // send next byte
  651. if(FrTXpacket_i==FrTXpacket_len) { //if end of the packet:
  652. PIE1bits.TXIE=0;
  653. if(FraiseStatus.TX_NEEDACK){
  654. InitTimer(T_2SERBYTES); //2 bytes wait inside of hardware serial tx buffer
  655. //InitTMR0(TMR0_1ms);
  656. FraiseState=fWAITACK; // goto to WAITACK state.
  657. }
  658. else {
  659. if(FraiseStatus.FBLDON) {
  660. Serial_Init_Receiver();
  661. FraiseState=fBLIN;
  662. }
  663. else {
  664. InitTimer(T_2SERBYTES);
  665. //FraiseState=fIDLE; // return to IDLE state.
  666. //Serial_Init_None();
  667. }
  668. }
  669. }
  670. return;
  671. }
  672. else if(FraiseState==fBLOUT) //if we are sending a bootloader packet :
  673. {
  674. StopTimer();
  675. if(PIR1bits.TXIF==0) return;
  676. TXREG=FrTXpacket[FrTXpacket_i++]; // send next byte
  677. if(FrTXpacket_i==FrTXpacket_len) { //if end of the packet:
  678. PIE1bits.TXIE=0;
  679. InitTimer(T_2SERBYTES); //2 bytes wait inside of hardware serial tx buffer
  680. FraiseState=fBLIN; // goto to BLIN state.
  681. FrRXin=FrRXout=0;
  682. }
  683. return;
  684. } //endif(FraiseState==fBLOUT)
  685. else if(FraiseState==fBLIN)
  686. {
  687. if (!Serial_Is_Receiver()) {
  688. if (TimerOut()) {
  689. Serial_Init_Receiver();
  690. StopTimer();
  691. }
  692. return;
  693. }
  694. if(PIR1bits.RCIF) {
  695. //StopTimer();
  696. c=RCREG;
  697. FrRXbuf[FrRXin]=c;
  698. FrRXin++;
  699. return;
  700. }
  701. return;
  702. } //endif(FraiseState==fBLIN)
  703. else if(FraiseState==fIDLE) //should't happen... clear interrupt flags:
  704. {
  705. StopTimer();
  706. //PIE1bits.TMR2IE=0;
  707. PIE1bits.TXIE=0;
  708. PIE1bits.RCIE=0;
  709. return;
  710. }
  711. } //end of LowISR
  712. void FraiseService(void)
  713. {
  714. //unsigned char c;
  715. //static char TXNtries=0; //number of tries to send the TX packet
  716. //if(FrGotLineFromUsb&&(FraiseState==fIDLE)) FrGetLineFromUsb();
  717. //goto _fin;
  718. //FraiseState=fIDLE;
  719. /*if(fIDLE==FraiseState) {
  720. mLED_2_On();
  721. if(FrGotLineFromUsb) {
  722. FrGetLineFromUsb(); //
  723. goto _fin;
  724. }
  725. } else { mLED_2_Off(); }*/
  726. FrSendMessagetoUsb();
  727. if(FraiseState==fBLIN) {
  728. if(FrRXin!=FrRXout) {
  729. while(FrRXin!=FrRXout) putchar(FrRXbuf[FrRXout++]);
  730. CDC_Flush_In_Now();
  731. }
  732. if(FrGotLineFromUsb) FrGetLineFromUsb();
  733. goto _fin;
  734. }
  735. INTCONbits.GIEH = 0;
  736. if(FraiseState==fIDLE) {
  737. StopTimer();
  738. if(FrGotLineFromUsb) {
  739. FrGetLineFromUsb();
  740. goto _fin;
  741. }
  742. //goto _fin;
  743. if(!FraiseStatus.RXFULL){
  744. if(PollCount>=PollDelay) {
  745. PollCount=0;
  746. //while(TXSTAbits.TRMT==0);
  747. incPolledChild();
  748. if(TST_POLLEDCHILD())
  749. {
  750. //PIE1bits.TXIE=0;
  751. FrRXchksum=FrRXin=FrRXout=0;
  752. TXSTAbits.TX9D=1;
  753. Serial_Init_Driver();
  754. FrSendMessagetoUsb();
  755. INTCONbits.GIEL=0;
  756. AckChild=PolledChild();
  757. TXREG=(PolledChild()|128);
  758. TXSTAbits.TX9D=0;
  759. TXREG=(PolledChild()|128);
  760. InitTimer(T_2SERBYTES);
  761. FraiseState=fIN;
  762. INTCONbits.GIEL=1;
  763. }
  764. }
  765. }
  766. } else if(FraiseState==fWAITACK) {
  767. if((Serial_Is_Receiver()) && TimerOut() ){ //didn't rcved ACK before Timeout
  768. StopTimer();
  769. Serial_Init_None();
  770. if(++FrTXtries<3) { FrTXPacketLaunch(); }// resend packet maximum 3 times
  771. else
  772. {
  773. //printf((STRING)"sT%c%c\n",HI_CHAR(AckChild),LO_CHAR(AckChild));
  774. FraiseMessage=fmessTOUT;
  775. FraiseState=fIDLE;
  776. }
  777. }
  778. } else if(FraiseState==fIN){
  779. if( (Serial_Is_Receiver()) && TimerOut() ){ //Timeout
  780. StopTimer();
  781. /*if(TST_POLLEDCHILDOK()){
  782. printf((STRING)"\nsc%c%c\n",HI_CHAR(PolledChild()),LO_CHAR(PolledChild()));
  783. CLR_POLLEDCHILDOK();
  784. }*/
  785. FraiseMessage=fmessLOST;
  786. //printf("fIN timeout!\n");
  787. Serial_Init_None();
  788. FraiseState=fIDLE;
  789. }
  790. }
  791. _fin :
  792. INTCONbits.GIEH = 1;
  793. FrSendtoUsb();
  794. }
  795. void FraiseSOF(void)
  796. {
  797. static BYTE il;
  798. if((il++)==200) { il=0; mLED_2_Toggle(); }
  799. if(++PollCount==0) PollCount=255;
  800. }