From 7db266244d7eb64b57f6267ff984fdf5ee435e4a Mon Sep 17 00:00:00 2001
From: Paulus <kruger@astron.nl>
Date: Mon, 6 Sep 2021 12:34:58 +0100
Subject: [PATCH] HBAT2 pico first working

---
 config/HBAT2.yaml       |   4 +-
 i2cserv/hbat_pico_io.py | 105 ++++++++++++++++++++++++----------------
 2 files changed, 66 insertions(+), 43 deletions(-)

diff --git a/config/HBAT2.yaml b/config/HBAT2.yaml
index d0e6c68..74c086c 100644
--- a/config/HBAT2.yaml
+++ b/config/HBAT2.yaml
@@ -4,11 +4,11 @@ description: "1234"
 drivers:
  - name: hbaio #TCA9548
    type: hbat_pico_io
-   parameters: ['COM3'] #serial port number
+   parameters: ['/dev/ttyACM0'] #serial port number
  - name: hbat2
    type: i2c_array #An array of similar devices connected to an I2C switch
    parent: hbaio
-   parameters: [1,4] #start,number of RCUs
+   parameters: [2,5] #start,number of RCUs
    status: HBAT2_COMM_STATUS
 
 #This is the I2C devices in the RCU
diff --git a/i2cserv/hbat_pico_io.py b/i2cserv/hbat_pico_io.py
index c04e102..d3a0f86 100644
--- a/i2cserv/hbat_pico_io.py
+++ b/i2cserv/hbat_pico_io.py
@@ -37,39 +37,8 @@ def Decode(D2):
         S.append(v1)
     return(S)
 
-CRCtab=np.load("CRC_HBAT1.npy")
-CRCtabl=[d%256 for d in CRCtab]
-CRCtabh=[d//256 for d in CRCtab]
-def CRCcheck(S1):
-    crcl=0;crch=0;
-    for b in S1:
-        i=crcl ^ b
-        crcl=crch ^ CRCtabl[i]
-        crch=CRCtabh[i]
-#    print(i,CRCtabh[i])
-#    crch=crcl ^ CRCtabh[i]
-#    crcl= CRCtabl[i]
-    return crch*256+crcl
-
-
-def MakeBroadcast(data,func=4,reg=0,serv1=1,serv2=16):
-    assert(len(data)==32)
-    data2=[func,reg,serv1,serv2]+data
-    l=len(data2)+1
-    data2=[0,l]+data2
-    CRC=CRCcheck(data2)
-    data2=data2+[CRC%256,CRC//256]
-    assert(CRCcheck(data2)==0)
-    return data2
-
-def MakeRequest(serv,data=[],func=5,reg=0):
-    data2=[func,reg]+data
-    l=len(data2)+1
-    data2=[serv,l]+data2
-    CRC=CRCcheck(data2)
-    data2=data2+[CRC%256,CRC//256]
-    assert(CRCcheck(data2)==0)
-    return data2
+
+
 
 #Mlookup=[0x55,0x56,0x59,0x5A,0x65,0x66,0x69,0x6A,0x95,0x96,0x99,0x9A,0xA5,0xA6,0xA9,0xAA]
 Mlookup=[0xAA,0x6A,0x9A,0x5A,0xA6,0x66,0x96,0x56,0xA9,0x69,0x99,0x59,0xA5,0x65,0x95,0x55]
@@ -105,6 +74,39 @@ class hbat_pico_io(hwdev):
        self.ser = serial.Serial(port,115200,timeout=0.1)  # open serial port      
        logging.info("hba-pico connecting to: "+self.ser.name)         # check which port was really used 
        self.CurrentChannel=0;
+       CRCtab=np.load("CRC_HBAT1.npy")
+       self.CRCtabl=[d%256 for d in CRCtab]
+       self.CRCtabh=[d//256 for d in CRCtab]
+
+    def CRCcheck(self,S1):
+     crcl=0;crch=0;
+     for b in S1:
+        i=crcl ^ b
+        crcl=crch ^ self.CRCtabl[i]
+        crch=self.CRCtabh[i]
+#    print(i,CRCtabh[i])
+#    crch=crcl ^ CRCtabh[i]
+#    crcl= CRCtabl[i]
+     return crch*256+crcl
+
+    def MakeBroadcast(self,data,func=4,reg=0,serv1=1,serv2=16):
+      assert(len(data)==32)
+      data2=[func,reg,serv1,serv2]+data
+      l=len(data2)+1
+      data2=[0,l]+data2
+      CRC=self.CRCcheck(data2)
+      data2=data2+[CRC%256,CRC//256]
+      assert(self.CRCcheck(data2)==0)
+      return data2
+
+    def MakeRequest(self,serv,data=[],func=5,reg=0):
+      data2=[func,reg]+data
+      l=len(data2)+1
+      data2=[serv,l]+data2
+      CRC=self.CRCcheck(data2)
+      data2=data2+[CRC%256,CRC//256]
+      assert(self.CRCcheck(data2)==0)
+      return data2
 
     def SetSW1(self,channel):
         if (channel)==self.CurrentChannel: return True;
@@ -119,15 +121,16 @@ class hbat_pico_io(hwdev):
         return True
 
     def i2csetget(self,addr,data,reg=None,read=0):
-        #addr = BF address 
+       addr = self.CurrentChannel
        print("I2cget",addr,data,reg,read)
-       try:
+#       try:
+       if True:
               if read==3:
                      time.sleep(data[0]/1000.)
                      return True
               if read==1:
                 func=len(data)*2+1;
-                TX1=MakeRequest(addr,[],func,reg);
+                TX1=self.MakeRequest(addr,[],func,reg);
                 logging.debug(str(("Packet to TX",TX1)))
                 TX2=ManchesterEncode(TX1)
                 self.ser.write(bytearray(TX2))
@@ -138,15 +141,15 @@ class hbat_pico_io(hwdev):
 #         print("I2C read",addr,reg,data,read)
               else:
                 func=len(data)*2;
-                TX1=MakeRequest(addr,data,func,reg);
+                TX1=self.MakeRequest(addr,data,func,reg);
                 logging.debug(str(("Packet to TX",TX1)))
                 TX2=ManchesterEncode(TX1)
                 self.ser.write(bytearray(TX2))
                 self.GetPackets();
                 return True;
-       except:
-              logging.debug("I2C failed!")
-              return False;
+#       except:
+#              logging.debug("I2C failed!")
+       return False;
 
     def GetDelay(self,Start=0x1000):
         a=0;
@@ -166,4 +169,24 @@ class hbat_pico_io(hwdev):
             D.append(a)
         return D;
 
-
+    def GetPackets(self):
+      D=self.GetDelay(self.ser);
+      D2=NormDelays(D)
+      #print("Received delays:",D2[:10])
+      NoData=True;
+      S=Decode(D2)
+      RXdata=[]
+#      print("Received packets:",S)
+      while len(S)>0:
+        NoData=False;
+        L=S[1]
+        S1=S[:L+3]
+        CRC=self.CRCcheck(S1);
+        logging.debug(str(("Received packet:",S1,"CRC=",CRC)))
+        if (CRC==0) and (S1[0]>0x80):
+          #print("Reply from Addr=",S1[0]-0x80," data=",S[2:-2])
+          RXdata=S[2:-2]   
+          logging.info(str(("Reply from Addr=",S1[0]-0x80," data=",[hex(a) for a in RXdata])))
+        S=S[L+3:]
+      if NoData: logging.info("Communication error!")
+      return RXdata;
-- 
GitLab