diff --git a/mainloop.c b/mainloop.c index e180a42483de862fb43feb91196e71d9b989f531..5441fffa9f57962a99c9c955b89295c6736288ad 100644 --- a/mainloop.c +++ b/mainloop.c @@ -33,6 +33,7 @@ inline void HBA_(mainloop)() //IC1_Start(); if (IC_(CON1bits).ICBNE) IC_(_CaptureDataRead)(); //clear buffer if (IC2IntFlag) IC2IntFlag=0; //clear interupt flag + ClrWdt(); } break; case HBA_STATE_WAIT: //Wait until we have a edge or a time-out diff --git a/src/HBAx.c b/src/HBAx.c index 826e466b4b3eb4a2288fc43a4669320c2475cdf3..f39d71ecb784bfee2f79305322c1475400aa1179 100644 --- a/src/HBAx.c +++ b/src/HBAx.c @@ -1,6 +1,8 @@ #include "registers.h" #include "crc16.h" //Buffer len need to be 2x I2C length +#define HBAMAXDATALEN 16 +#define HBABUFFERSIZE 264 //2+6+16*16 = 256+6=264 #define HBAXYlen 38 //6+32 #define HBAreqlen 4 //6+32 @@ -8,23 +10,55 @@ #define HBA_XYpacket HBA_(XYpacket) #define HBA_reqpacket HBA_(reqpacket) -uint8_t HBA_(XYpacket)[HBAXYlen+2]={0,0x25,0x4,0x0,0x1,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +uint8_t HBA_(XYpacket)[HBABUFFERSIZE]={0,0x25,0x4,0x0,0x1,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Broadcast 0, length=37, set word 4, register=0, start=1, stop=16,32xdata, data start at [6] uint8_t HBA_(reqpacket)[HBAreqlen]={0x1, 0x3, 0x5, 0x0}; //Server number, length=3, get word=5, register=0 uint8_t HBA_(req_adr)=0; +uint8_t HBA_(req_datalen)=2; +uint8_t HBA_(req_register)=0; bool HBA_(read_to_tx)=false; bool HBA_(I2CReg_to_request)(uint8_t I2C_length,uint8_t* Buffer) //Mode 2: I2C read { int adr=Buffer[0]; - if ((adr>=0x10) && (adr<=0x2F)) //readback from HBA - { HBA_req_adr=1; + if (adr==0x10) //readback XY from HBA + { HBA_req_adr=1; + HBA_(req_datalen)=2; + HBA_(req_register)=0; HBA_(I2CReg_waiting()); return true; } + if (adr==0x31) //readback uid from HBA + { HBA_req_adr=1; + HBA_(req_datalen)=8; + HBA_(req_register)=0x04; + HBA_(I2CReg_waiting()); + return true; + } + if (adr==0x32) //readback version from HBA + { HBA_req_adr=1; + HBA_(req_datalen)=4; + HBA_(req_register)=0x0C; + HBA_(I2CReg_waiting()); + return true; + } + if (adr==0x33) //readback ADC values + { HBA_req_adr=1; + HBA_(req_datalen)=8; + HBA_(req_register)=0x50; + HBA_(I2CReg_waiting()); + return true; + } + if ((adr>=0x38) && (adr<=0x3d)) //readback pages (0x00,0x08,0x10,...) + { HBA_req_adr=1; + HBA_(req_datalen)=8; + HBA_(req_register)=(adr-0x38)<<3; + HBA_(I2CReg_waiting()); + return true; + }; return false; } bool HBA_(I2CReg_to_packet)(uint8_t I2C_length,uint8_t* Buffer) //Mode 2: I2C write @@ -37,16 +71,33 @@ bool HBA_(I2CReg_to_packet)(uint8_t I2C_length,uint8_t* Buffer) //Mode 2: I2C w for (x=1;x<I2C_length;x++) if (adr+x<HBAXYlen) HBA_XYpacket[adr+x]=Buffer[x]; if (adr+I2C_length==HBAXYlen) //When the last one is written -> send to HBA - { + { HBA_(req_datalen)=2; + HBA_(req_register)=0x00; + HBA_(XYpacket)[2]=HBA_(req_datalen)*2; + HBA_(XYpacket)[3]=HBA_(req_register); + HBA_(XYpacket)[1]=HBA_(req_datalen)*16+5; //length: 2*16+5=37 HBA_(Make_packet)(HBAXYlen,HBA_XYpacket); if (Get_waitPPS()) { HBA_(read_to_tx)=true; return false; } - if (Get_autoread()) HBA_req_adr=1; + if (Get_autoread()) { + HBA_req_adr=1; + } return true; } } + if (adr==0x33) + { HBA_(req_datalen)=8; + HBA_(req_register)=0x50; + HBA_(XYpacket)[2]=4; + HBA_(XYpacket)[3]=HBA_(req_register); + HBA_(XYpacket)[1]=37; //length: 16+5=21 + for (uint8_t x=0;x<32;x++) + HBA_(XYpacket)[x+6]=Buffer[1]; + HBA_(Make_packet)(HBAXYlen,HBA_XYpacket); + return true; + } return false; } @@ -60,7 +111,7 @@ uint8_t* HBA_(I2CReg_get_buffer)(uint8_t HBARegister,uint8_t* length) // for (;HBARegister<0x30;HBARegister++) // I2C_Buffer[x++]=HBA_XYpacket[HBARegister-0x10+6]; //} - *length=32+1; + *length=HBA_(req_datalen)*16+1; return &HBA_XYpacket[6]; // I2C_Buffer[0]=HBA_XYpacket[6]; // for (x=0;x<32;x++) @@ -73,15 +124,15 @@ void HBA_(I2CReg_decode_responce)() uint8_t* Buffer=HBA_(RX2_Buffer)(); uint8_t length=HBA_(RX2_length)(); uint8_t adr; - if (length==8) + if (length==6+HBA_(req_datalen)) //4 header, 2 CRC { - adr=Buffer[2]&0x1F; //start counting at 1 - if (adr>16) adr=16; - if (adr<1) adr=1; + adr=(Buffer[2]&0x1F)-1; //start counting at 0 + if (adr>15) adr=15; + if (adr<0) adr=0; if ((Buffer[2]&0x80)==0x80) //we have a responce { - HBA_XYpacket[adr*2+6-2]=Buffer[2+2]; - HBA_XYpacket[adr*2+7-2]=Buffer[2+3]; + for (uint8_t x=0;x<HBA_(req_datalen);x++) + HBA_XYpacket[adr*HBA_(req_datalen)+6+x]=Buffer[4+x]; } } } @@ -99,11 +150,11 @@ bool HBA_(I2CReg_waiting)() if (HBA_req_adr>16) HBA_req_adr=0; if (HBA_req_adr>0) { HBA_reqpacket[0]=HBA_req_adr; //start at 1, request X and Y together - HBA_XYpacket[HBA_req_adr*2+4]=0x0; //clear before reading so we can see if we have new data - HBA_XYpacket[HBA_req_adr*2+5]=0x0; - HBA_reqpacket[1]=3; - HBA_reqpacket[2]=5; - HBA_reqpacket[3]=0; + for (uint8_t x=0;x<HBA_(req_datalen);x++) + HBA_XYpacket[(HBA_req_adr-1)*HBA_(req_datalen)+6+x]=0x0; //clear before reading so we can see if we have new data + HBA_reqpacket[1]=3;//length + HBA_reqpacket[2]=HBA_(req_datalen)*2+1; + HBA_reqpacket[3]=HBA_(req_register); HBA_req_adr++; HBA_(Make_packet)(HBAreqlen,HBA_reqpacket);