fraisemaster.c 26 KB

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