fraisedevice.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. /*********************************************************************
  2. *
  3. * Fraise device 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-2015
  19. ********************************************************************/
  20. //#include <config.h>
  21. //#include <pic18fregs.h>
  22. //#include <boardconfig.h>
  23. //#include <boardio.h>
  24. //#include <stdlib.h>
  25. //#include <stdio.h>
  26. //#include <string.h>
  27. //#include <typedefs.h>
  28. //#include <ctype.h>
  29. //#include <typedefs.h>
  30. #include "fraisedevice.h"
  31. //--------------- Serial macros : -----------------
  32. //serial drive:
  33. #define InitSerDrv() do { SERDRV_TRI = 0; } while(0)
  34. #define SerDrv_On() do { SERDRV_PIN = SERDRV_POL; } while(0)
  35. #define SerDrv_Off() do { SERDRV_PIN =! SERDRV_POL; } while(0)
  36. #define SerDrv_isOn() (SERDRV_PIN == SERDRV_POL)
  37. //serial port:
  38. #if UART_PORT==1
  39. #define SPBRGx SPBRG1
  40. #define SPBRGHx SPBRGH1
  41. #define BAUDCONx BAUDCON1
  42. #define BAUDCONxbits BAUDCON1bits
  43. #define RCREGx RCREG1
  44. #define RCSTAx RCSTA1
  45. #define RCSTAxbits RCSTA1bits
  46. #define TXREGx TXREG1
  47. #define TXSTAx TXSTA1
  48. #define TXSTAxbits TXSTA1bits
  49. #define RCxIF PIR1bits.RC1IF
  50. #define TXxIF PIR1bits.TX1IF
  51. #define RCxIE PIE1bits.RC1IE
  52. #define TXxIE PIE1bits.TX1IE
  53. #define RCxIP IPR1bits.RC1IP
  54. #define TXxIP IPR1bits.TX1IP
  55. #else
  56. #define SPBRGx SPBRG2
  57. #define SPBRGHx SPBRGH2
  58. #define BAUDCONx BAUDCON2
  59. #define BAUDCONxbits BAUDCON2bits
  60. #define RCREGx RCREG2
  61. #define RCSTAx RCSTA2
  62. #define RCSTAxbits RCSTA2bits
  63. #define TXREGx TXREG2
  64. #define TXSTAx TXSTA2
  65. #define TXSTAxbits TXSTA2bits
  66. #define RCxIF PIR3bits.RC2IF
  67. #define TXxIF PIR3bits.TX2IF
  68. #define RCxIE PIE3bits.RC2IE
  69. #define TXxIE PIE3bits.TX2IE
  70. #define RCxIP IPR3bits.RC2IP
  71. #define TXxIP IPR3bits.TX2IP
  72. #endif
  73. //(1 port equ)
  74. #ifndef BAUDCON1
  75. #define SPBRG1 SPBRG
  76. #define SPBRGH1 SPBRGH
  77. #define BAUDCON1 BAUDCON
  78. #define BAUDCON1bits BAUDCONbits
  79. #define RCREG1 RCREG
  80. #define RCSTA1 RCSTA
  81. #define RCSTA1bits RCSTAbits
  82. #define TXREG1 TXREG
  83. #define TXSTA1 TXSTA
  84. #define TXSTA1bits TXSTAbits
  85. #define RC1IF RCIF
  86. #define TX1IF TXIF
  87. #define RC1IE RCIE
  88. #define TX1IE TXIE
  89. #define RC1IP RCIP
  90. #define TX1IP TXIP
  91. #endif
  92. static void Serial_Init_Receiver() {
  93. while(TXSTAxbits.TRMT == 0);
  94. SerDrv_Off();
  95. WREG=RCREGx;
  96. __asm nop __endasm ;
  97. WREG=RCREGx;
  98. RCSTAxbits.CREN = 0;
  99. RCSTAxbits.CREN = 1;
  100. RCSTAxbits.ADDEN = 1;
  101. RCxIE = 1;
  102. TXxIE = 0;
  103. }
  104. #define Serial_Init_Driver() do {\
  105. SerDrv_On(); \
  106. RCxIE = 0; \
  107. RCSTAxbits.CREN = 0;\
  108. } while(0)
  109. #define Serial_Is_Driver() SerDrv_isOn()
  110. //---------- FrTX : App to Device -------------------------------------------
  111. unsigned char FrTXbuf[256]; //Fraise TX ring buffer
  112. unsigned char FrTXin = 0,FrTXout = 0,FrTXbufFree = 255; //Pointers to Fraise TX buffer
  113. #define FrTXempty (FrTXin == FrTXout)
  114. //---------- fraiseSend : Device to Master -------------------------------------------
  115. unsigned char FrTXpacket[35]; //Fraise TX packet buffer
  116. unsigned char FrTXpacket_i;
  117. unsigned char FrTXpacket_len;
  118. unsigned char FrTXchksum;
  119. unsigned char FrTXtries; //number of tries to send the TX packet
  120. //---------- FrRX : Master to device -------------------------------------------
  121. unsigned char FrRXbuf[128]; //Fraise RX ring buffer
  122. unsigned char FrRXchksum;
  123. unsigned char FrRXin; //index following last validated packet
  124. unsigned char FrRXin_tmp; //index following last received byte==next address to write to
  125. unsigned char FrRXin_end; //index that will follow incoming packet
  126. unsigned char FrRXout; //index of next byte to read from buffer
  127. unsigned char FrRXout_end; //index following index of last byte of currently scanned packet
  128. unsigned char FrRXout_len; //length of currently scanned packet
  129. unsigned char FrRXout_first; //index of 1st byte of currently scanned packet
  130. /*
  131. packets in FrRXbuf ring buffer:
  132. 1st byte=length+128*buffer_was_char, then _length_ bytes of data.
  133. when writing to buffer, if FrRXin_tmp==FrRXout then next write would overwrite some unread data.
  134. when reading from buffer, if FrRXin==FrRXout then there's nothing more to read.
  135. */
  136. //---------- FraiseStatus bits -------------------------------------------
  137. union {
  138. unsigned char VAL;
  139. struct {
  140. unsigned RX_OERR :1 ; // an OVERRUN ERROR occured on fraise RX side (firmware timing issue)
  141. unsigned RX_FERR :1 ; // an FRAME ERROR occured on fraise RX side (too much noise on physical transport,
  142. // e.g. bad connection, bug from another device...)
  143. unsigned RX_SERR :1 ; // an checksum error occured on fraise RX side (noise, bug...)
  144. //unsigned RX_BFUL :1 ; // couldn't get rx packet : buffer was full.
  145. unsigned RX_BRDCST :1 ; //current RX is broadcast
  146. unsigned RX_POLL :1 ; //current RX is poll signal
  147. /*unsigned TX_NACK :1 ; // master returned a NACK : checksum error on TX (noise, bug...)
  148. unsigned TX_NOACK :1 ; // master didn't acknowledge at all (noise, bug...)*/
  149. unsigned TX_ERR :1 ; //couldn't achieve to transmit data to master (noise, bug...)
  150. };
  151. } FraiseStatus;
  152. char FrInterruptEnabled = 0;
  153. //---------- eeprom addresses ----------------------------
  154. #define EE_ID 0
  155. #define EE_PREFIX 1
  156. #define EE_PREFIXMAXLEN 8
  157. #define EE_NAME (EE_PREFIX + EE_PREFIXMAXLEN + 1)
  158. #define EE_NAMEMAXLEN 16
  159. #define EE_NAMEMAX (EE_NAME + EE_NAMEMAXLEN)
  160. //---------- finite state machine FraiseState ----------------------------
  161. typedef enum {
  162. fIDLE
  163. ,fWAITACK
  164. ,fOUT
  165. ,fIN
  166. } tFraiseState;
  167. tFraiseState FraiseState;
  168. //---------- Devices State tables ----------------------------------------
  169. unsigned char FrID=0; // device fraise id
  170. /*#define bitset(var,bitno) ((var) |= (1 << (bitno)))
  171. #define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
  172. #define bittst(var,bitno) (var & (1 << (bitno)))*/
  173. void fraiseSetID(unsigned char id)
  174. {
  175. eeWriteByte(EE_ID,FrID = id);
  176. }
  177. void fraiseInit(void)
  178. {
  179. FrTXin = 0;
  180. FrTXout = 0;
  181. FrTXbufFree = 255;
  182. //SERIAL:
  183. SerDrv_Off();
  184. InitSerDrv();
  185. //baud rate : br = FOSC/[4 (n+1)] : n = FOSC / (4 * br) - 1 : br = 250kHz, n = FOSC/1000000 - 1
  186. #define BRGHL (FOSC/1000000 - 1)
  187. SPBRGHx = BRGHL/256;
  188. SPBRGx = BRGHL%256;
  189. BAUDCONxbits.BRG16 = 1;
  190. TXSTAxbits.TXEN = 1;
  191. TXSTAxbits.BRGH = 1;
  192. TXSTAxbits.TX9 = 1;
  193. TXSTAxbits.TX9D = 0;
  194. RCSTAxbits.RX9 = 1;
  195. RCSTAxbits.SPEN = 1;
  196. FraiseStatus.VAL = 0;
  197. FraiseState = fIDLE;
  198. FrRXin = 0;
  199. FrRXout = 0;
  200. FrTXpacket_len = 0;
  201. FrID = eeReadByte(EE_ID);
  202. // set serial interrupts to low priority
  203. TXxIP = 0;
  204. RCxIP = 0;
  205. FrInterruptEnabled = 1;
  206. // Use our own special output function for STDOUT
  207. stdout = STREAM_USER;
  208. Serial_Init_Receiver();
  209. }
  210. void fraiseSetInterruptEnable(char enable)
  211. {
  212. FrInterruptEnabled = enable;
  213. if(enable == 0) {
  214. Serial_Init_Receiver();
  215. RCxIE = 0;
  216. TXxIE = 0;
  217. }
  218. }
  219. char fraiseGetInterruptEnable(void)
  220. {
  221. return FrInterruptEnabled;
  222. }
  223. //----------------- RX buffer utils : --------------------------------------------
  224. static void fraisePutChar(unsigned char c)
  225. {
  226. if((FrTXin + 1) == FrTXout) {
  227. //printf("!50 Err: undetected FrTX full !!!\r\n");
  228. return; //overflow check done by fraiseSend, but...
  229. }
  230. FrTXbuf[FrTXin] = c;
  231. FrTXin++;
  232. }
  233. static unsigned char fraiseGetTXChar()
  234. {
  235. unsigned char c;
  236. if(FrTXin == FrTXout) return 0; //underflow check
  237. c = FrTXbuf[FrTXout];
  238. FrTXout++;
  239. return c;
  240. }
  241. char fraiseSend(const unsigned char *buf,unsigned char len)
  242. {
  243. unsigned char i,c;
  244. FrTXbufFree = FrTXout;
  245. FrTXbufFree -= FrTXin;
  246. FrTXbufFree -= 1;
  247. if ((len + 3) > FrTXbufFree) {
  248. //printf("!10 Err: Fraise TXbuf full\r\n");
  249. return -1;
  250. }
  251. if (len < 2) {
  252. //printf("!11 Err: null Fraise TXpacket\r\n");
  253. return 0;
  254. }
  255. len -= 1; //don't keep '\n' terminator
  256. fraisePutChar(len); //prefix tx packet buffer by its length
  257. i = 0;
  258. while(i < len) { //fill tx packet buffer
  259. c = buf[i];
  260. i++;
  261. fraisePutChar(c);
  262. }
  263. //FrTXbufFree = ((int)FrTXout - (int)FrTXin + (sizeof(FrTXbuf) - 1)) %sizeof(FrTXbuf);
  264. FrTXbufFree = FrTXout;
  265. FrTXbufFree -= FrTXin;
  266. FrTXbufFree -= 1;
  267. return 0;
  268. }
  269. #define fraiseSendInit(b) do { FrTXpacket_i = 0 ; FrTXchksum = (b); FrTXpacket[FrTXpacket_i] = (b); FrTXpacket_i++; } while(0)
  270. #define fraiseSendData(b) do { FrTXchksum += (b); FrTXpacket[FrTXpacket_i] = (b); FrTXpacket_i++; } while(0)
  271. #define fraiseSendClose() do { FrTXpacket[FrTXpacket_i] = -FrTXchksum; FrTXpacket_i++; FrTXpacket_len = FrTXpacket_i; } while(0)
  272. #define fraiseSendLaunch() \
  273. { \
  274. TXREGx = FrTXpacket[0]; \
  275. FrTXpacket_i = 1; \
  276. TXxIE = 1; \
  277. }
  278. static void fraiseDecodeNextTXPacket()
  279. {
  280. unsigned char len, c, txout_end, ischar;
  281. if(TXSTAxbits.TRMT == 0) return; //return if a serial transmission is in progress
  282. len = fraiseGetTXChar(); //1st byte = len
  283. if(!len) {
  284. //printf("!12 Err: TXbuffer inconsistency !\n");
  285. FrTXin = FrTXout=0;
  286. return; //?
  287. }
  288. txout_end = FrTXout;
  289. txout_end += len;
  290. c=fraiseGetTXChar(); //2nd byte = command (or hi nibble of address)
  291. len -= 1;
  292. if(c == '#') {
  293. //****************** system command , begining by '#': **********************
  294. if(len < 1) goto discard;
  295. c = fraiseGetTXChar(); //what is the command ?
  296. if(c == 'i'){
  297. //printf("s fraise init...\n");
  298. fraiseInit();
  299. goto discard;
  300. }
  301. /*else if(c=='l'){
  302. printf("flog:stat=%d,rxout=%d,rxin=%d,adden=%d,cren=%d,rcie=%d,rcif=%d\n",
  303. FraiseStatus.VAL,FrRXout,FrRXin,RCSTAbits.ADDEN,RCSTAbits.CREN,PIE1bits.RCIE,PIR1bits.RCIF);
  304. goto discard;
  305. }*/
  306. else if(c == 'r'){
  307. Serial_Init_Receiver();
  308. goto discard;
  309. }
  310. else if(c == 's'){
  311. //FraiseStatus.VAL=0;
  312. SerDrv_Off();
  313. RCSTAxbits.ADDEN = 1;
  314. RCxIE = 1;
  315. TXxIE = 0;
  316. c = RCREGx;
  317. c = RCREGx;
  318. RCSTAxbits.CREN = 0;
  319. RCSTAxbits.CREN = 1;
  320. goto discard;
  321. }
  322. goto discard; //unknown system command ; discard packet.
  323. }
  324. if(c == 'C') { //"char" packet
  325. ischar = 1;
  326. goto fill_packet;
  327. }
  328. if(c == 'B') { //"bytes" packet
  329. ischar = 0;
  330. goto fill_packet;
  331. }
  332. goto discard;
  333. fill_packet:
  334. if(ischar) len |= 128;
  335. fraiseSendInit(len);
  336. while(FrTXout != txout_end) {
  337. c = fraiseGetTXChar();
  338. fraiseSendData(c);
  339. }
  340. fraiseSendClose();
  341. FrTXtries = 0;
  342. discard:
  343. FrTXout = txout_end;
  344. return;
  345. }
  346. //--------------------- Interrupt routine : -------------------------------
  347. void fraiseISR(void)
  348. {
  349. static unsigned char c, c2;
  350. if(FrInterruptEnabled == 0) return;
  351. if(TXxIE && TXxIF) {
  352. if(FrTXpacket_i == FrTXpacket_len) { //if end of the packet:
  353. Serial_Init_Receiver();
  354. FrTXpacket_len = 0;
  355. return;
  356. }
  357. c = FrTXpacket[FrTXpacket_i];
  358. FrTXpacket_i++;
  359. TXREGx = c; // send next byte
  360. return;
  361. }
  362. if(RCxIF) {
  363. if(RCSTAxbits.OERR){
  364. FraiseStatus.RX_OERR = 1;
  365. Serial_Init_Receiver();
  366. return;
  367. }
  368. if(RCSTAxbits.FERR){
  369. FraiseStatus.RX_FERR = 1;
  370. Serial_Init_Receiver();
  371. return;
  372. }
  373. if (RCSTAxbits.RX9D) { // ------- address :
  374. c = RCREGx; // get byte
  375. if(c == (FrID | 128)) { // poll signal
  376. FraiseStatus.RX_POLL = 1;
  377. RCSTAxbits.ADDEN = 0;
  378. return;
  379. }
  380. if ((c == 0) || (c == FrID)) {
  381. FraiseStatus.RX_POLL = 0;
  382. RCSTAxbits.ADDEN = 0;
  383. if(c) FraiseStatus.RX_BRDCST = 0;
  384. else FraiseStatus.RX_BRDCST = 1;
  385. FrRXchksum = c;
  386. FrRXin_tmp = FrRXin;
  387. FrRXin_end = FrRXin - 1; // protect FrRXin_end
  388. FrRXbuf[FrRXin_tmp] = c;
  389. FrRXin_tmp++;
  390. if(FrRXin_tmp == sizeof(FrRXbuf)) FrRXin_tmp = 0;
  391. return;
  392. }
  393. FraiseStatus.RX_POLL= 0;
  394. RCSTAxbits.ADDEN = 1;
  395. return;
  396. }
  397. // ----------- data :
  398. c = RCREGx; // get byte
  399. if(FraiseStatus.RX_POLL) { // had a poll signal
  400. if(c == (FrID | 128)){ // confirmation byte of poll signal:
  401. // answer poll signal :
  402. Serial_Init_Driver();
  403. if(FrTXpacket_len == 0) {
  404. TXREGx = 0;
  405. Serial_Init_Receiver();
  406. } else {
  407. fraiseSendLaunch();
  408. return;
  409. }
  410. }
  411. RCSTAxbits.ADDEN = 1;
  412. return;
  413. }
  414. FrRXchksum += c;
  415. if(FrRXin_tmp == FrRXin_end) {// RX packet complete
  416. if(!FrRXchksum) { // RX packet checksum ok
  417. FrRXin = FrRXin_tmp; //validation of packet
  418. if(!FraiseStatus.RX_BRDCST){
  419. Serial_Init_Driver();
  420. TXREGx = 0; //Acknowldge
  421. Serial_Init_Receiver();
  422. }
  423. }
  424. else { // RX packet checksum error
  425. FraiseStatus.RX_SERR = 1;
  426. if(!FraiseStatus.RX_BRDCST){
  427. Serial_Init_Driver();
  428. TXREGx = 1; //Checksum nack
  429. Serial_Init_Receiver();
  430. }
  431. }
  432. return;
  433. }// endof RX packet complete
  434. if((FrRXin_tmp == FrRXout)&&(FrRXout != FrRXin)) { //collision case : RX buffer full !
  435. Serial_Init_Receiver(); // discard current packet... TODO:send an buffer full nack (2)
  436. return;
  437. }
  438. c2 = (FrRXin + 1) % sizeof(FrRXbuf);
  439. if(FrRXin_tmp == c2) { //FrRXin_tmp == (FrRXin + 1): first byte following address = data length...
  440. FrRXin_end = (c & 31);
  441. FrRXin_end += 2;
  442. FrRXin_end += FrRXin;
  443. FrRXin_end %= sizeof(FrRXbuf);
  444. }
  445. FrRXbuf[FrRXin_tmp++] = c;
  446. if(FrRXin_tmp == sizeof(FrRXbuf)) FrRXin_tmp = 0; //ring buffer index
  447. return;
  448. }
  449. }
  450. //----------------- RX buffer utils : --------------------------------------------
  451. unsigned char fraiseGetChar()
  452. {
  453. unsigned char c;
  454. if((FrRXout == FrRXout_end) || (FrRXout == FrRXin)) return 0; //underflow error
  455. c = FrRXbuf[FrRXout++];
  456. if(FrRXout == sizeof(FrRXbuf)) FrRXout = 0;
  457. return c;
  458. }
  459. unsigned char fraisePeekChar()
  460. {
  461. return FrRXbuf[FrRXout];
  462. }
  463. unsigned char fraiseGetLen()
  464. {
  465. return FrRXout_len;
  466. }
  467. unsigned char fraiseGetIndex()
  468. {
  469. return FrRXout;
  470. }
  471. unsigned char fraiseGetAt(unsigned char i)
  472. {
  473. return FrRXbuf[(i + FrRXout_first)%sizeof(FrRXbuf)];
  474. }
  475. void fraiseSendCopy()
  476. {
  477. char l;
  478. unsigned char i;
  479. l = (FrRXout - FrRXout_first)%sizeof(FrRXbuf);
  480. l--;
  481. i = FrRXout_first;
  482. putchar('C'); putchar(' ');
  483. while(l > 0) {
  484. printf("%d ", FrRXbuf[i]);
  485. i++;
  486. if(i == sizeof(FrRXbuf)) i = 0;
  487. l--;
  488. }
  489. }
  490. //----------------- System : --------------------------------------------
  491. static char CompareName()
  492. {
  493. unsigned char c, c2, eei;
  494. eei = EE_PREFIX;
  495. while(c = fraiseGetChar()){
  496. c2 = eeReadByte(eei);
  497. if(c2 == 0) { //end of string
  498. if(eei < EE_NAME) { //end of prefix
  499. eei = EE_NAME; //goto to name first char
  500. c2 = eeReadByte(eei);
  501. if(c2 == 0) { //no name?!
  502. return -1;
  503. }
  504. }
  505. else { //end of name before end of spelled name ; discard.
  506. return -1;
  507. }
  508. }
  509. if(c2 != c) { //spelled name differs from device name; discard.
  510. return -1;
  511. }
  512. eei++;
  513. if(eei > EE_NAMEMAX) { //spelled name too long; discard.
  514. return -1;
  515. }
  516. }
  517. return 0;
  518. }
  519. static void Assign() //"N" command
  520. {
  521. unsigned char c, c2, tmpid;
  522. c = fraiseGetChar();
  523. c2 = fraiseGetChar();
  524. c -= '0'; if (c > 9) c -= 'A' - '9' - 1;
  525. c2 -= '0'; if (c2 > 9) c2 -= 'A' - '9' - 1;
  526. if((c > 7) || (c2 > 15)) { // bad id... discard
  527. return;
  528. }
  529. tmpid = c2 + (c << 4);
  530. if(CompareName()) return;
  531. fraiseSetID(tmpid);
  532. return;
  533. }
  534. static void ResetToBld() //"F" command
  535. {
  536. if(CompareName()) return;
  537. Reset();
  538. }
  539. //----------------- Main Service : -----------------------------------------
  540. void fraiseService(void)
  541. {
  542. unsigned char c, ischar, isbroadcast;
  543. if(FrRXout != FrRXin) //FraiseStatus.RX_FULL
  544. {
  545. c = FrRXout;
  546. c += 1;
  547. c %= sizeof(FrRXbuf);
  548. FrRXout_len = FrRXbuf[c];
  549. FrRXout_len &= 31;
  550. FrRXout_end = FrRXout;
  551. FrRXout_end += FrRXout_len;
  552. FrRXout_end += 2;
  553. FrRXout_end %= sizeof(FrRXbuf);
  554. isbroadcast = (fraiseGetChar() == 0);
  555. FrRXout_len = fraiseGetChar();
  556. ischar = FrRXout_len & 128;
  557. if(!(FrRXout_len &= 31)){ //packet error
  558. FrRXout = FrRXin;
  559. return;
  560. }
  561. if(isbroadcast) //Broadcast packet
  562. {
  563. if(ischar){
  564. c = fraiseGetChar();
  565. FrRXout_len -= 1;
  566. if (c == 'B') {
  567. #ifdef UD_RCVCB
  568. fraiseReceiveCharBroadcast();
  569. #endif
  570. }
  571. else if(c == 'N') Assign(); /* assign to id if name matchs */
  572. else if(c == 'F') ResetToBld(); /* goto Fraisebootloader if name matchs */
  573. else if(c == 'I') __asm reset __endasm; //init
  574. }
  575. #ifdef UD_RCVB
  576. else fraiseReceiveBroadcast();
  577. #endif
  578. }
  579. else //Normal device packet
  580. {
  581. FrRXout_first = FrRXout;
  582. if(ischar) {
  583. #ifdef UD_RCVC
  584. fraiseReceiveChar();
  585. #endif
  586. }
  587. #ifdef UD_RCV
  588. else fraiseReceive();
  589. #endif
  590. }
  591. goto discard;
  592. discard:
  593. FrRXout = FrRXout_end;
  594. }
  595. if((!FrTXempty) && (!FrTXpacket_len)) { // if there is sth to send to master and nothing in TXpacket :
  596. fraiseDecodeNextTXPacket();
  597. }
  598. else if(Serial_Is_Driver() && (!FrTXpacket_len) && TXSTAxbits.TRMT)// security:
  599. Serial_Init_Receiver();
  600. return;
  601. }
  602. //-------------------------------------------------------------------
  603. // user putchar :
  604. unsigned char txbuf[35];
  605. unsigned char txlen = 0;
  606. #ifndef PUTCHAR
  607. #define PUTCHAR(c) void putchar(char c) __wparam
  608. #endif
  609. //PUTCHAR (c){c;} //dummy putchar
  610. PUTCHAR (c) {
  611. txbuf[txlen] = c;
  612. if(txlen < (sizeof(txbuf) - 1)) txlen++;
  613. if(c == '\n') {
  614. fraiseSend(txbuf, txlen);
  615. txlen = 0;
  616. }
  617. }