From cb940718e9c36c1d0609ed646cf9fcd2d11d2c8f Mon Sep 17 00:00:00 2001
From: kruger <kruger@astron.nl>
Date: Fri, 6 Dec 2024 14:14:31 +0100
Subject: [PATCH] DANTE readback added

---
 mainloop.c |  1 +
 src/HBAx.c | 85 +++++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/mainloop.c b/mainloop.c
index e180a42..5441fff 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 826e466..f39d71e 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);
-- 
GitLab