jadeku.c
Go to the documentation of this file.
1 
22 #include <app.h>
23 /*
24  - File system resources
25  REGS 500 pages 1 to 500 = 21500 regs.
26  UNIT 11 pages 501 to 511 = 957 units.
27  - Com
28  download regs at 500 regs per min.
29 */
44 // __CONFIG(UNPROTECT|FOSC0);
45 // __CONFIG(PROTECT|BKBUG|PWRTE|FOSC0);
46 //__CONFIG(PROTECT&XT&DEBUGDIS&WRTDIS&DPROT&BORDIS&PWRTDIS&WDTDIS);
47 // EDC - Added DP and LVPDIS. Removed PROTECT bit.
48 //__CONFIG(DP&XT&DEBUGDIS&WRTDIS&DPROT&BORDIS&PWRTDIS&WDTDIS&LVPDIS); // NORMAL
49 
50 #define _USESLEEP 1
51 
55 static BYTE SearchbyID(WORD id);
56 static BYTE Save(WORD id);
57 static void Process(void);
58 static BYTE CRO_Crc(volatile BYTE *data, BYTE size);
59 static void SendRegis(void);
60 static VOID xitoa(WORD n, BYTE* s, BYTE pad);
61 static VOID xreverse(BYTE* s);
62 static void InitialState(void);
63 //static void beep(BYTE time);
64 static void DoOK(void);
65 static void DoError(void);
66 static BYTE ccp(BYTE idx);
67 static void InitPacket(BYTE cmd);
68 static void Add(BYTE num);
69 static void Init0(void);
70 static void Init1(void);
71 static void SendRegis(void);
72 static void SendInfo(void);
73 static void SendFlash(void);
74 static void SetTime(BYTE dir);
75 static void CheckUnits(WORD id);
76 static void Process(void);
77 
81 volatile BYTE gFlags=0x00;
82 
83 static bank1 WORD gIbut;
84 static bank1 WORD gTbut;
85 static bank1 BYTE gBuf[10];
86 static bank2 BYTE gIdx;
87 
88 static volatile bank1 time_t gTimeout=0;
89 static volatile bank2 BYTE gRetry=0;
90 
91 volatile bank1 time_t TIME=0;
92 #define OUTBUFSIZE 20
93 volatile bank1 BYTE gOut[20];
94 #define INBUFSIZE 20
95 volatile bank1 BYTE gIn[20];
96 volatile bank2 BYTE gTXCount=0;
97 volatile bank2 BYTE gRXCount=0;
98 volatile bank2 BYTE gByte='A';
99 volatile bank2 BYTE gError=0x00;
100 
101 #ifdef _USESLEEP
102 volatile bank2 BYTE gSleepTime;
103 volatile BYTE gSleep=0;
104 #endif
105 
106 volatile bank2 time_t gTampTime;
107 volatile bank2 BYTE gState=FM_IDLE;
108 volatile bank2 BYTE gCrc=0;
109 
110 
111 #define WLONG 100
112 #define WSHORT 25
113 #define BLONG 2000
114 #define BSHORT 1000
115 
116 
120 void setports(void)
121 {
122  // set all ports as outputs (low current drain)
123  ADCON1=0x00;
124  PORTA=0x00; TRISA=0x00;
125  RA0=1;
126  DF_CS_HI(); // chip select HI of FLASH
127 
128  RB1=0; TRISB1=0;
129  RB2=0; TRISB2=0;
130  RB3=1; TRISB3=0;
131 } // setports
132 
136 static void InitialState(void)
137 {
138  di(); // disable all interrupts
139 
140  OPTION_REG=0b00111111; // 0011 1 111
141 
142  // set all ports as outputs (low current drain)
143  PORTA=0x00; TRISA=0x00;
144  PORTB=0x00; TRISB=0x00;
145  PORTC=0x00; TRISC=0x00;
146  RA0=1;
147  RB3=1;
148  DF_CS_HI(); // chip select HI of FLASH
149 
150  TRISC7=DIR_IN; // Set RX as input
151 #ifdef _USESLEEP
152  TRISB4=DIR_IN; // Set WAKE as input
153 #endif
154  TRISB5=DIR_IN; // Set TAMP as input
155  TRISB0=DIR_IN; // Set TOUCH as input
156 
157  // RTC
158  TMR1L=0x00;
159  TMR1H=0x00; // 2 sec at 32Khz
160  TMR1ON=OFF; // Stops timer1
161  T1CON=0x3E; // 0011 1110
162 
163  SCI_Init(9600,SCI_EIGHT);
164 
165  PIR1 = CLEAR; // clear any pending interrupts
166  PEIE = ENABLE; // enable perhipheral interrupts
167  // perform other setup
168  RCIE = ENABLE; // unmask receiver interrupts...
169  // an interrupt could now come from the SCI receiver at any time.
170  TXIE = ENABLE;
171  // WAKE and TAMP could now generate an interrupt
172  RBIF=CLEAR; // clear
173  RBIE=ENABLE;
174  // Enable Timer1 Interrupt
175  TMR1IE=ENABLE;
176  TMR1ON=ON; // TURN ON TIMER
177  // Enable RB0 Interrupt
178  INTEDG=CLEAR; // falling edge
179  INTF=CLEAR; // clear
180  INTE=ENABLE;
181 
182  SPI_Init(); // SPI bus init
183 
184  ei(); // global interrupts enabled
185 
186 } // InitialState
187 
192 #define beep(time) piezo(18,time)
193 
194 static void piezo(BYTE t, WORD d)
195 {
196  d=(WORD)(d/3);
197  bitclr(TRISB,1);
198  bitclr(TRISB,2);
199  LB2=ON;
200  LB1=ON;
201  while(--d){
202 // LB1=OFF;
203 // LB2=ON;
204  delay_10us(t);
205 // LB1=ON;
206 // LB2=OFF;
207  delay_10us(t);
208  }
209 //#define CONSUMO
210 #ifndef CONSUMO
211  LB1=OFF;
212  LB2=OFF;
213 #endif
214 }
215 
216 
221 static void DoOK(void)
222 {
223  BYTE tmp;
224  if( bittst(gFlags, FN_VSENS) ) // low batery
225  {
226  tmp = 4;
227  do{
228  beep(BSHORT);
229  delay_ms(WSHORT); // t2
230  }while(--tmp);
231  beep(BLONG);
232  return;
233  }
234  if( bittst(gFlags, FN_SPACE) ) // low space
235  {
236  beep(BSHORT);
237  return;
238  }
239  // All OK
240  beep(BLONG);
241 } // DoOK
242 
246 static void DoError(void)
247 {
248 BYTE f;
249  f = 3;
250  do {
251  bitclr(TRISB,1);
252  bitclr(TRISB,2);
253  LB1=ON;
254  delay_ms(25);
255  LB2=OFF;
256  delay_ms(25); // t1 = 100
257  LB1=OFF;
258  LB1=OFF;
259  delay_ms(25); // t2 = 50
260  }while(--f);
261 } /* DoError */
262 
263 //#pragma interrupt_level 1
268 static void interrupt isr(void)
269 {
270  // RTC must be always active
271  if( TMR1IF ) // RTC Overflow
272  {
273  TMR1IF=CLEAR;
274  TMR1H=0x00; // reload value;
275  T1CON=0x3F; // 0011 1110
276  TIME+=16;
277  CLRWDT(); // if TMR1 is turned off die.
278  return;
279  }// TMR1IF
280  // Serial Receive always active
281  if(RCIF)
282  {
283 #ifdef _USESLEEP
284  gSleep = 0;
285  gSleepTime=0;
286 #endif
287  gByte = SCI_Read();
288  if( gState == FM_END )
289  {
290  if( gCrc == gByte ){
291  SCI_Write(CR_ACK);
293  }
294  gState=FM_IDLE;
295  } else {
296 
297  switch(gByte)
298  {
299  case CR_NAK:
300  if( bittst(gFlags, FN_DOWN) )
301  TXIE=ENABLE; // send again
302  break;
303  case CR_ACK:
304  if( bittst(gFlags, FN_WAITACK) ) // waiting for an ACK ?
305  {
307  if( bittst(gFlags, FN_DOWN) )
309  }
310  break;
311  case CR_STX:
312  if( bittst(gFlags, FN_PCMD) ) // if waiting to finish a command
313  SCI_Write(CR_NAK);
314  else {
315  gRXCount=0;
316  gState=FM_INIT;
317  gCrc=CR_STX;
318  }
319  break;
320  case CR_ETX:
321  if( gState==FM_INIT)
322  {
323  gState=FM_END;
324  gCrc^=CR_ETX;
325  }
326  break;
327  default:
328  if( gRXCount > INBUFSIZE )
329  gRXCount=0;
330  gIn[gRXCount++]=gByte;
331  gCrc^=gByte;
332  }// switch
333  } // if-else
334  }// RCIF
335  if(TXIF && TXIE)
336  {
337  SCI_Write(gOut[gTXCount++]);
338  if(gTXCount >= gIdx)
339  {
340  TXIE = DISABLE; // finished
341  gTXCount=0;
342  gTimeout = TIME;
343  }
344  }// TXIF
345  if( RBIF ) // TAMP, VSENS, WAKEUP
346  {
347 #ifdef _USESLEEP
348  gSleep = 0;
349  gSleepTime=0;
350 #endif
351  if( !TAMP )
352  {
353  if( bittst(gFlags, FN_TAMP) )
354  bitclr(gFlags, FN_TAMP); // reset flag
355  else
357  }
358  PORTB=PORTB; // end mismatch condition
359  RBIF=0; // clear flag
360  }// RBIF
361  if( INTF ) // TOUCH
362  {
363  INTE=DISABLE; // disable ints
364 #ifdef _USESLEEP
365  gSleep = 0;
366  gSleepTime=0;
367 #endif
368  bitset(gFlags, FN_INTR); // mark
369  INTF=CLEAR; // clear flag
370  } // INTF
371 
372  if( SSPIF )
373  {
374  SSPIF=CLEAR;
375  if( gSpiTx )
376  gSpiTx=CLEAR;
377  else
378  gSpiRx=SET;
379  }// SSPIF
380 
381 }// isr
382 
386 void TestBat(void)
387 {
388  RA0=1;
389  TRISA=0x0F;
390  ADCON1=0x8C;
391  ADCON0=0x41;
392  RB3=0;
393  RA5=1; // ON
394  delay_ms(1);
395  //ADGO=1; // charge
396  ADCON0bits.GO =1;
397  while(ADCON0bits.GO);
398  delay_ms(1); // WAIT 2.0TAD
399 // ADGO=1; // sample
400  ADCON0bits.GO =1;
401  while(ADCON0bits.GO);
402  RA5=0; // OFF
403  RB3=1;
404  if( ADRESH < 3 ){ // 32D. 813*1.7=1.38*2=2,76V
405  if( ADRESL < 0x2D )
407  else
408  bitclr(gFlags, FN_VSENS); // reset flag
409  } else
410  bitclr(gFlags, FN_VSENS); // reset flag
411  ADCON0=0x00;
412 // ADCON1=0x07;
413  ADCON1=0x00;
414  TRISA=0x00;
415  RA0=1;
416 
417 }
418 
419 
423 void main(void)
424 {
425  // NOTE that Vsens (Low battery indicator) is reset only
426  // when a Master reset is done.
427  // gError is cleared when is TX to the host and on a reset
428 
429 
430  InitialState();
431  memset((char*)gOut,0, OUTBUFSIZE);
432  delay_ms(50);
433 
434 
435  // TO=1 and PD=1 ==> must init vars
436  // TO=0 a WDT reset occurs
437  if((STATUS & 0x10)) { // power on-reset?
438  SetTime(0); // default time
439  DoOK();
440  FS_Init();
441  } else { // watchdog reset
442  DoError();
443  }
444 
445  DoOK();
446  delay_ms(10); // t2
447  gTampTime=TIME;
448 #ifdef _USESLEEP
449  gSleepTime=0;
450 #endif
451  // Main loop
452  do {
453  if( bittst(gFlags, FN_NEXT) )
454  {
455  SendRegis(); // send next packet
456  }
457 
458  if(bittst(gFlags,FN_WAITACK)) // pending ACK
459  {
460  if( !TXIE ){ // not transmitting ?
461  if( (TIME - gTimeout) > 5 ) // timeout waiting ACK
462  {
463  gTimeout = TIME; // actualize
464  if( --gRetry )
465  TXIE=ENABLE; // send again
466  else { // sorry retries end
467  bitset(gError, GE_LTA); // (Last TX not ACK)
470  }//retry
471  }//TIME
472  }// TXIE
473  bitclr(gFlags, FN_INTR); // disable any require
474  }// ACK
475 
476  SCI_CheckOverrun(); // clear serial OVERRUN
477  if( bittst(gFlags,FN_PCMD) ) // pending command or in process
478  {
479  Process(); // process command
480  bitclr(gFlags, FN_PCMD); // finish
481  bitclr(gFlags, FN_INTR); // disable any require
482  } else { // CMD
483  // Sensor process
484  switch( OneWire_GetID(gBuf) )
485  {
486  case W1_OK:
487  gIbut = gBuf[2];
488  gIbut<<=8;
489  gIbut |= (WORD)(gBuf[1] & 0x00FF);
490  if( gIbut == 0 || gIbut == 0xFFFF ) break;
491  if( gIbut==gTbut ) break; // antiping
492  gTbut = gIbut;
493  if( SearchbyID(gIbut) )
494  {
495  TestBat(); // charge
496  if(Save(gIbut))
497  DoOK();
498  delay_ms(10); // t2
499  } else
500  DoError(); // Access denied
501  break;
502  case W1_FOUND:
503  gTbut=0xFFFF;
504  break;
505  }
506  }
507 
508  // Alarm flags
509  if( bittst(gFlags, FN_TAMP) )
510  {
511  if( (TIME-gTampTime) > 60 )
512  {
513  Save(0x0000); // case open
514  gTampTime=TIME;
515  }
516  bitclr(gFlags, FN_TAMP); // reset flag
517  }
518 
519  // File system
520  FS_Check(); // do clean up
521 
522  // Put all to low power
523  setports();
524 
525 #ifdef _USESLEEP
526  gSleepTime++;
527  if( gSleepTime > 200 )
528  {
529  gSleep=1;
530  gSleepTime=0;
531  }
532  // Now with all done go to sleep
533  if( gSleep )
534  {
535  // set RB0 as input
536  bitclr(gFlags , FN_INTR); // clear mark
537  TRISB0=DIR_IN; // INPUT
538  INTF=CLEAR; // Clear flag
539  INTE=ENABLE; // enable ints INT0 wakeup
540  SLEEP();
541  CLRWDT();
542  INTE=DISABLE; // disable ints
543  }
544 #endif
545  } while(1);
546 
547 } // main
548 
555 static BYTE ccp(BYTE idx)
556 {
557  memcpy(gBuf, &gIn[idx], 2); // YY
558  gBuf[2]=0;
559  return (BYTE)atoi(gBuf);
560 }// ccp
561 
562 
567 static void InitPacket(BYTE cmd)
568 {
569  gOut[0]=CR_STX;
570  gOut[1]=cmd;
571  gIdx=2;
572 }// Initpacket
573 
579 static void Add(BYTE num)
580 {
581  xitoa(num, gBuf, 2); // MM
582  gOut[gIdx++]=gBuf[0];
583  gOut[gIdx++]=gBuf[1];
584 }// Add
585 
589 static void Init0(void)
590 {
591 BYTE tmp;
592 struct date d;
593 struct time t;
594  // no wrap the buffer wait
595  while( TXIE ) continue;
596  unixtodos(TIME, &d, &t);
598  gOut[gIdx++]='0'; // to 3
599  Add(d.da_mon); // MM
600  Add(d.da_day); // DD
601  Add(t.ti_hour); // HH
602  Add(t.ti_min); // MM
603  FS_GetBoot(FSDN_OFF, (BYTE*)&tmp, sizeof(BYTE));
604  memset(&gOut[11],'0', 4);
605  gOut[15]= tmp;
606  gOut[16]=CR_ETX;
607  gOut[17]=CRO_Crc(gOut, 17);
608  gIdx=18;
609  bitset(gFlags, FN_WAITACK); // Wait ACK
610  gRetry=3;
611  TXIE=ENABLE; // Send
612  while( TXIE ) continue;
613 }// Init0
614 
619 static void Init1(void)
620 {
621 struct date d;
622 struct time t;
623 
624  // no wrap the buffer wait
625  while( TXIE ) continue;
626 
627  FS_GetBoot(FSDT_OFF,(BYTE*)&gTimeout,sizeof(DWORD));
628  unixtodos(gTimeout, &d, &t);
629 
631  gOut[gIdx++]='0'; // to 3
632  Add(d.da_mon); // MM
633  Add(d.da_day); // DD
634  Add(t.ti_hour); // HH
635  Add(t.ti_min); // MM
636  xitoa(gRnor, gBuf, 5); // regis
637  memcpy(&gOut[11],gBuf, 5);
638 
639  gOut[16]=CR_ETX;
640  gOut[17]=CRO_Crc(gOut, 17);
641  gIdx=18;
642  gRetry=3;
643  bitset(gFlags, FN_WAITACK); // Wait ACK
644  TXIE=ENABLE; // Send
645  while( TXIE ) continue;
646 }// Init1
647 
651 static void SendRegis(void)
652 {
653 REGIS r;
654 struct date d;
655 struct time t;
656  // no wrap the buffer wait
657  while( TXIE ) continue;
658 
659  bitclr(gFlags, FN_NEXT); // just do it
660 
661  if( FS_ReadRegis(&r)==FSOK)
662  {
663  InitPacket('2');
664  gOut[gIdx++]='0';
665  unixtodos(r.ttime, &d, &t);
666  Add(d.da_mon); // MM
667  Add(d.da_day); // DD
668  Add(t.ti_hour); // HH
669  Add(t.ti_min); // MM
670  xitoa(r.id, gBuf, 5); // regis
671  memcpy(&gOut[11],gBuf, 5);
672  gOut[16]=CR_ETX;
673  gOut[17]=CRO_Crc(gOut, 17);
674  gIdx=18;
675  gRetry=3;
676  bitset(gFlags, FN_WAITACK); // Wait ACK
677  TXIE=ENABLE; // send
678  while( TXIE ) continue;
679  } else // finish
680  bitclr(gFlags, FN_DOWN);
681 
682 
683 }// SendRegis
684 
685 
689 static void SendFlash(void)
690 {
691 WORD x;
692 WORD y;
693 BYTE n;
694  // no wrap the buffer wait
695  while( TXIE ) continue;
696  InitPacket(CR_FF);
697  gIdx=2;
698  TXIE=ENABLE; // send
699  while( TXIE ) continue;
700 
701  for( x=0; x<MAX_PAGE_1MBIT_DENSITY; x++)
702  {
703  DF_Page2Buffer1(x);
704  FS_WaitReady();
705  for(y=0; y<PAGESIZE; y++){
706  DF_ReadBuffer1(y, (BYTE*)&n, sizeof(BYTE));
707  FS_WaitReady();
708  gOut[0]=n;
709  gIdx=1;
710  TXIE=ENABLE; // send
711  while( TXIE ) continue;
712  }
713  }
714  gOut[0]=CR_ETX;
715  gOut[1]=0xFF;
716  gIdx=2;
717  TXIE=ENABLE; // send
718  while( TXIE ) continue;
719 
720 }// SendFlash
721 
725 static void SendInfo(void)
726 {
727 BYTE tmp;
728  // no wrap the buffer wait
729  while( TXIE ) continue;
731  // Device number
732  FS_GetBoot(FSDN_OFF, (BYTE*)&tmp, sizeof(BYTE));
733  gOut[gIdx++]=tmp;
734  // Error flag
735  xitoa(gError, gBuf, 3);
736  memcpy(&gOut[gIdx],gBuf, 3);
737  gOut[6]=CR_ETX;
738  gOut[7]=CRO_Crc(gOut, 7);
739  gIdx=8;
740  bitset(gFlags, FN_WAITACK); // Wait ACK
741  gRetry=3;
742  TXIE=ENABLE; // send
743  while( TXIE ) continue;
744 
745 }// SendInfo
746 
753 static void SetTime(BYTE dir)
754 {
755 struct date d;
756 struct time t;
757  if(dir) {
758  d.da_year = ccp(3)+2000; // YY 2000-1980
759  d.da_mon = ccp(5); // MM
760  d.da_day = ccp(7); // DD
761  t.ti_hour = ccp(10); // HH
762  t.ti_min = ccp(12); // MM
763  t.ti_sec = 0;
764  t.ti_hund = 0;
765  } else {
766  d.da_year = 2002; // YY def = 2002
767  d.da_mon = 1; // MM
768  d.da_day = 1; // DD
769  t.ti_hour = 12; // HH
770  t.ti_min = 0; // MM
771  t.ti_sec = 0;
772  t.ti_hund = 0;
773  }
774  // set time
775  TIME = dostounix(&d, &t);
776 }// SetTime
777 
778 
783 static void CheckUnits(WORD id)
784 {
785 UNIT u;
786  // search if exists
787  while( FS_ReadUnit( &u )!=FSEOF )
788  {
789  if( id == u.id )
790  {
791  // setup flag
792  u.state = (BYTE)((gIn[2]==CR_ENABLE)?U_ENABLE:U_DISABLE);
793  // set pos
794  gUcb-=sizeof(UNIT);
795  // update
796  FS_WriteUnit(&u);
797  return; // found
798  }
799  }// while
800  // not found
801  if( gIn[2]!=CR_ENABLE )
802  return;
803 
804  // rewind
805  FS_Open(DBUNIT);
806  // search for a free
807  while( FS_ReadUnit(&u)!=FSEOF )
808  {
809  if( u.state==U_DISABLE ) // new
810  {
811  // setup flag
812  u.state = U_ENABLE;
813  u.id = id;
814  // set pos
815  gUcb-=sizeof(UNIT);
816  // update
817  FS_WriteUnit(&u);
818  return; // found
819  }
820  }// while
821  // not found add
822  u.state = U_ENABLE;
823  u.id = id;
824  FS_AppendUnit(&u);
825 }// CheckUnits
826 
827 
831 static void Process(void)
832 {
833 WORD tmp;
834 
835  memset((char*)gOut,0, OUTBUFSIZE);
836  memset((char*)gBuf,0, 10);
837  if( gIn[0]==CR_START && gIn[1]==CR_DEV )
838  {
839  switch(gIn[2])
840  {
841  case CR_INIT0:
842  Init0();
843  break;
844  case CR_INIT1:
845  Init1();
846  break;
847  case CR_ENABLE:
848  case CR_DISABLE:
849  memcpy( gBuf, &gIn[3], 5);
850  tmp = (WORD)atoi(gBuf);
851  FS_Open(DBUNIT);
852  CheckUnits(tmp);
853  FS_Close(DBUNIT);
854  break;
855  case CR_NUM:
856  tmp=(WORD)gIn[3]&0x00FF;
857  FS_SetBoot(FSDN_OFF, (BYTE*)&tmp, sizeof(BYTE));
858  break;
859  case CR_DOWN:
860  FS_Open(DBREGIS);
862  SendRegis();
863  break;
864  case CR_DELETE:
865  FS_ZapRegis();
866  FS_SetBoot(FSDT_OFF,(BYTE*)&TIME,sizeof(DWORD)); // BUG!
867  bitclr(gFlags, FN_SPACE); // reset flag
868  break;
869  case CR_RESET:
870  break;
871  case CR_DATETIME:
872  SetTime(1);
873  break;
874  case CR_INFO:
875  SendInfo();
876  break;
877  case CR_FORMAT:
879  memcpy( gBuf, &gIn[3], 3);
880  tmp = (WORD)atoi(gBuf);
881  if( tmp == DEFMAXREGIS )
882  FS_Format();
883  DoOK();
884  break;
885  case CR_FF:
886  SendFlash();
887  break;
888  default:
889  DoError();
890  }
891  } // if
892 
893 }// Process
894 
900 static BYTE Save(WORD id)
901 {
902  BYTE tmp;
903  REGIS u;
904  FS_Open(DBREGIS);
905 
906  if( gRnor > (21400) )
907  {
908  bitset(gFlags, FN_SPACE); // Low disk warn
909  }
910  if( gRnor >= (21500) )
911  {
912  bitset(gError, GE_NOSPACE); // ( no more space )
913  // no more space indicator
914  tmp=3;
915  do {
916  beep(BLONG); // t1 = 50
917  delay_ms(WLONG); // t2 = 50
918  }while(--tmp);
919  return 0; // no save no space
920  }
921  u.id=id;
922  u.ttime = TIME;
923  FS_AppendRegis(&u);
924  FS_Close(DBREGIS);
925 return 1;
926 } // Save
927 
934 static BYTE SearchbyID(WORD id)
935 {
936  UNIT u;
937  if( FS_Open(DBUNIT)==FSOK )
938  {
939  while( FS_ReadUnit( &u )!=FSEOF )
940  {
941  if( id == u.id )
942  {
943  if( u.state==U_DISABLE )
944  return TRUE; // found and is disable
945  else
946  return FALSE; // found and enable
947  }
948  }// while
949  }
950 return TRUE; // not found (permit)
951 }// SearchbyID
952 
953 
960 static BYTE CRO_Crc(volatile BYTE *data, BYTE size)
961 {
962  BYTE crc;
963  crc=0x00;
964  do {
965  crc^=*data;
966  data++;
967  }while( --size );
968  return crc;
969 }// CRO_Crc
970 
971 
980 static VOID xitoa(WORD n, BYTE* s, BYTE pad)
981 {
982  BYTE* ptr;
983  ptr = s;
984  do {
985  *ptr++ = n % 10 + '0';
986  if(pad) pad--;
987  } while ((n = n / 10) > 0);
988  while(pad--) *ptr++='0'; // 0 padding
989  *ptr = 0x00;
990  xreverse(s);
991 }// xitoa
992 
997 static VOID xreverse(BYTE* s)
998 {
999  BYTE *j;
1000  BYTE c;
1001  j = s + strlen(s) - 1;
1002  while(s < j) {
1003  c = *s;
1004  *s++ = *j;
1005  *j-- = c;
1006  }
1007 } // xreverse
1008 
1012 // #define _FLTEST 1
1013 #ifdef _FLTEST
1014 void FS_FlashTest(void)
1015 {
1016  WORD x;
1017  WORD y;
1018  BYTE n;
1019 
1020 /*
1021  for( x=0; x<2; x++)
1022  {
1023  n=0xAA;
1024  for(y=0; y<PAGESIZE; y++){
1025  FS_WaitReady();
1026  DF_WriteBuffer1(y, (BYTE*)&n, sizeof(BYTE));
1027 // n++;
1028  }
1029  DF_Buffer12MainMemoryE(x);
1030  FS_WaitReady();
1031  }
1032 */
1033  for( x=0; x<2; x++)
1034 // for( x=REGSPA; x<DEFMAXREGIS; x++ )
1035  {
1036  DF_Page2Buffer1(x);
1037  FS_FS_WaitReady();
1038  for(y=0; y<PAGESIZE; y++){
1039  FS_FS_WaitReady();
1040  DF_ReadBuffer1(y, (BYTE*)&n, sizeof(BYTE));
1041  gOut[0]=n;
1042  gIdx=1;
1043  TXIE=ENABLE; // send
1044  while( TXIE ) continue;
1045  }
1046  }
1047 
1048 /* for( x=UNITSPA; x<DEFMAXUNIT; x++ )
1049  {
1050  DF_Page2Buffer1(x);
1051  FS_WaitReady();
1052  for(y=0; y<PAGESIZE; y++){
1053  FS_WaitReady();
1054  DF_ReadBuffer1(y, (BYTE*)&n, sizeof(BYTE));
1055  gOut[0]=n;
1056  gIdx=1;
1057  TXIE=ENABLE; // send
1058  while( TXIE ) continue;
1059  }
1060  }
1061 */
1062 }
1063 #endif
1064 //*******************************************************[ENDL]***************
1065 
static bank2 BYTE gIdx
index to build packets
Definition: jadeku.c:86
void FS_ZapRegis(void)
Definition: fs.c:295
#define CR_DOWN
Definition: app.h:108
static void DoOK(void)
Definition: jadeku.c:221
volatile bank1 time_t TIME
Timer in unix format.
Definition: jadeku.c:91
#define ON
Definition: pgrl.h:93
BYTE OneWire_GetID(BYTE *buff)
Definition: onewire.c:43
void main(void)
Definition: jadeku.c:423
long dostounix(struct date *d, struct time *t)
Definition: timecvt.c:40
void delay_10us(unsigned char x)
Definition: delay.c:29
#define FM_END
Definition: app.h:98
void FS_Format(void)
Definition: fs.c:143
void SCI_Write(BYTE byte)
Definition: sci.c:73
#define CR_FF
-> STX|E|1|D|ETX|XOR <- ACK > STX|nnnnnnn|ETX|XOR
Definition: app.h:118
BYTE FS_Close(BYTE file)
Definition: fs.c:228
#define VOID
Definition: pgrl.h:35
#define SLEEP()
Definition: pgrl.h:109
#define FN_PCMD
Definition: app.h:78
#define FSEOF
Definition: fs.h:45
#define CR_ETX
Definition: app.h:92
volatile bank1 BYTE gIn[20]
Input buffer.
Definition: jadeku.c:95
BYTE state
Definition: fs.h:82
#define BSHORT
Beep short time.
Definition: jadeku.c:114
unsigned char ti_hour
Hours.
Definition: time.h:50
#define CR_ENABLE
Definition: app.h:105
BYTE FS_AppendUnit(UNIT *data)
Definition: fs.c:392
void SPI_Init(void)
Definition: spi.c:33
static void Process(void)
Definition: jadeku.c:831
bank3 WORD gUcb
Definition: fs.c:30
#define bittst(var, bitno)
Definition: pgrl.h:83
WORD id
Definition: fs.h:78
volatile BYTE gSleep
Sleep mode enable.
Definition: jadeku.c:103
void DF_ReadBuffer1(WORD Address, BYTE *data, WORD size)
Definition: at45xx.c:79
#define CR_INIT0
Definition: app.h:103
void TestBat(void)
Definition: jadeku.c:386
#define GE_NOSPACE
No enogh disk space.
Definition: app.h:86
#define CR_DELETE
Definition: app.h:109
#define CR_DATETIME
Definition: app.h:111
#define U_ENABLE
Definition: fs.h:86
volatile bank2 BYTE gRXCount
Input buffer index.
Definition: jadeku.c:97
#define CR_INIT1
Definition: app.h:104
BYTE FS_Init(void)
Definition: fs.c:72
Definition: fs.h:76
volatile bank2 time_t gTampTime
Tamper loop time.
Definition: jadeku.c:106
#define FSDN_OFF
Device number.
Definition: fs.h:38
#define FN_INTR
Definition: app.h:77
static void Init0(void)
Definition: jadeku.c:589
#define OFF
Definition: pgrl.h:94
static void Add(BYTE num)
Definition: jadeku.c:579
#define CR_NAK
Definition: app.h:94
#define CR_STX
Definition: app.h:91
BYTE FS_WriteUnit(UNIT *data)
Definition: fs.c:428
void delay_ms(long t)
Definition: delay.c:40
BYTE FS_AppendRegis(REGIS *data)
Definition: fs.c:324
void unixtodos(long time, struct date *d, struct time *t)
Definition: timecvt.c:82
void FS_WaitReady(void)
Definition: fs.c:42
volatile bank2 BYTE gByte
Input byte.
Definition: jadeku.c:98
#define bitset(var, bitno)
Definition: pgrl.h:81
#define U_DISABLE
Definition: fs.h:87
static void SendInfo(void)
Definition: jadeku.c:725
void setports(void)
Definition: jadeku.c:120
#define DBREGIS
Definition: fs.h:89
BYTE FS_ReadRegis(REGIS *data)
Definition: fs.c:364
#define GE_LTA
Error on comm.
Definition: app.h:85
#define FM_IDLE
Definition: app.h:96
static bank1 WORD gTbut
antiping touch read
Definition: jadeku.c:84
#define W1_OK
Function call success.
Definition: onewire.h:26
#define FN_SPACE
Definition: app.h:81
WORD id
Definition: fs.h:83
#define SCI_EIGHT
Definition: sci.h:28
static BYTE SearchbyID(WORD id)
Definition: jadeku.c:934
void FS_Check(void)
Definition: fs.c:54
#define DF_CS_HI()
Definition: at45xx.h:33
#define FM_INIT
Definition: app.h:97
static void interrupt isr(void)
Definition: jadeku.c:268
volatile bank2 BYTE gError
Error flag state.
Definition: jadeku.c:99
#define WSHORT
Wait short time.
Definition: jadeku.c:112
#define FN_DOWN
Definition: app.h:80
static volatile bank2 BYTE gRetry
Retry count.
Definition: jadeku.c:89
BYTE SCI_Read(void)
Definition: sci.c:86
#define CR_ACK
Definition: app.h:93
unsigned char ti_min
Minutes.
Definition: time.h:49
#define SET
Definition: pgrl.h:104
static volatile bank1 time_t gTimeout
Protocol Timeout.
Definition: jadeku.c:88
#define TRUE
Definition: pgrl.h:97
static void Init1(void)
Definition: jadeku.c:619
#define CLEAR
Definition: pgrl.h:103
BYTE SCI_Init(DWORD baud, BYTE ninebits)
Definition: sci.c:31
Definition: time.h:55
#define FALSE
Definition: pgrl.h:98
#define CR_DISABLE
Definition: app.h:106
#define LB1
O.
Definition: app.h:50
#define DISABLE
Definition: pgrl.h:86
#define FN_NEXT
Definition: app.h:82
static void SetTime(BYTE dir)
Definition: jadeku.c:753
static void SendFlash(void)
Definition: jadeku.c:689
static void DoError(void)
Definition: jadeku.c:246
volatile bit gSpiTx
Definition: spi.c:28
static void CheckUnits(WORD id)
Definition: jadeku.c:783
#define WLONG
Wait long time.
Definition: jadeku.c:111
int da_year
Year - 1980.
Definition: time.h:56
static void InitPacket(BYTE cmd)
Definition: jadeku.c:567
BYTE SCI_CheckOverrun(void)
Definition: sci.c:98
#define FN_VSENS
Definition: app.h:76
char da_day
Day of the month.
Definition: time.h:57
#define MAX_PAGE_1MBIT_DENSITY
Definition: at45xx.h:91
void FS_GetBoot(WORD Offset, BYTE *data, BYTE size)
Definition: fs.c:132
static VOID xitoa(WORD n, BYTE *s, BYTE pad)
Definition: jadeku.c:980
volatile BYTE gFlags
Definition: jadeku.c:81
#define CR_INFO
-> STX|E|1|I|ETX|XOR <- ACK > STX|I|n|x|x|x|e|e|e|ETX|XOR
Definition: app.h:117
static BYTE Save(WORD id)
Definition: jadeku.c:900
#define ENABLE
Definition: pgrl.h:85
BYTE FS_Open(BYTE file)
Definition: fs.c:204
volatile bank2 BYTE gState
Protocol Receiver state machine.
Definition: jadeku.c:107
void FS_SetBoot(WORD Offset, BYTE *data, BYTE size)
Definition: fs.c:107
#define DBUNIT
Definition: fs.h:90
static VOID xreverse(BYTE *s)
Definition: jadeku.c:997
static void SendRegis(void)
Definition: jadeku.c:651
static void piezo(BYTE t, WORD d)
Definition: jadeku.c:194
#define CR_RESET
Definition: app.h:110
unsigned char ti_hund
Hundredths of seconds.
Definition: time.h:51
unsigned long DWORD
Definition: pgrl.h:46
#define FSOK
Definition: fs.h:40
unsigned char BYTE
Definition: pgrl.h:38
Definition: time.h:48
void DF_Page2Buffer1(WORD Pagenum)
Definition: at45xx.c:149
char da_mon
Month (1 = Jan)
Definition: time.h:58
#define DIR_IN
Definition: pgrl.h:106
volatile bank2 BYTE gTXCount
Output buffer index.
Definition: jadeku.c:96
volatile bank2 BYTE gSleepTime
Count to sleep.
Definition: jadeku.c:102
unsigned int WORD
Definition: pgrl.h:45
#define bitclr(var, bitno)
Definition: pgrl.h:82
JADEKU project defines and dependency headers.
#define PAGESIZE
Definition: at45xx.h:92
#define DEFMAXREGIS
Definition: fs.h:58
#define FN_TAMP
Definition: app.h:75
#define TAMP
I.
Definition: app.h:62
#define beep(time)
Definition: jadeku.c:192
#define FSDT_OFF
date time
Definition: fs.h:36
#define W1_FOUND
No device found.
Definition: onewire.h:28
bank3 WORD gRnor
Definition: fs.c:26
static void InitialState(void)
Definition: jadeku.c:136
volatile bank1 BYTE gOut[20]
Output buffer.
Definition: jadeku.c:93
static BYTE ccp(BYTE idx)
Definition: jadeku.c:555
Definition: fs.h:81
#define CR_NUM
Definition: app.h:107
#define CR_FORMAT
-> STX|E|1|F|x|x|x|ETX|XOR <- ACK
Definition: app.h:116
#define FN_WAITACK
Definition: app.h:79
#define CR_START
Definition: app.h:100
#define OUTBUFSIZE
Definition: jadeku.c:92
volatile bit gSpiRx
Definition: spi.c:29
time_t ttime
Definition: fs.h:77
unsigned char ti_sec
Seconds.
Definition: time.h:52
static BYTE CRO_Crc(volatile BYTE *data, BYTE size)
Definition: jadeku.c:960
BYTE FS_ReadUnit(UNIT *data)
Definition: fs.c:454
#define CR_DEV
Definition: app.h:101
volatile bank2 BYTE gCrc
Protocol Checksum.
Definition: jadeku.c:108
long time_t
Definition: time.h:34
void FS_FlashTest(void)
#define BLONG
Beep long time.
Definition: jadeku.c:113
static bank1 BYTE gBuf[10]
general buffer
Definition: jadeku.c:85
static bank1 WORD gIbut
Current touch read.
Definition: jadeku.c:83
#define INBUFSIZE
Definition: jadeku.c:94
#define LB2
O.
Definition: app.h:51