<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Relay Plate Python Code</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Relay%2520Plate%2520Python%2520Code/</link><description>Recent changes to Relay Plate Python Code</description><language>en</language><lastBuildDate>Sat, 07 Dec 2019 16:11:29 -0000</lastBuildDate><atom:link href="https://forge.codesys.com/drv/relay-pi-plate/wiki/Relay%20Plate%20Python%20Code/feed" rel="self" type="application/rss+xml"></atom:link><item><title>Relay Plate Python Code modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Relay%2520Plate%2520Python%2520Code/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 16:11:29 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com6fbbc17c204b5682d6969259bf1f8bfdba93b34e</guid></item><item><title>Discussion for Pi-Plate Code to Convert To SPI page</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Pi-Plate%2520Code%2520to%2520Convert%2520To%2520SPI/?limit=100#7f90</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Nice posting&lt;br/&gt;
Seems to me not too difficult to rewrite it into Structured Text.&lt;/p&gt;
&lt;p&gt;Little advice;&lt;br/&gt;
1) Just write an FB (class!) which extends the SPI baseclass and try to translate this python class into it. This will be your Function Block based driver. &lt;br/&gt;
2) Study other SPI drivers for extra help.&lt;br/&gt;
3) Use CfUnit for debugging and write unit tests for your FB driver in your library &lt;strong&gt; ;-) &lt;/strong&gt;&lt;br/&gt;
It will help you develop the more driver quicker and will also serve as useful information for other developers. If you first write some tests and then develop your code you will reap the benefits from it!&lt;/p&gt;
&lt;p&gt;*) Extra Bonus stage: You can always embed your FB into a SPI based IoDrv. There is loads of info on this topic available here, but it will take you extra work and effort depending on your skill level.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">aliazzz</dc:creator><pubDate>Fri, 06 Dec 2019 17:57:44 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com628046139e0783e486f8b0f66f2da5e14544ad34</guid></item><item><title>Pi-Plate Code to Convert To SPI modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Pi-Plate%2520Code%2520to%2520Convert%2520To%2520SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -39,11 +39,8 @@
     resp=ppCMD(addr,0x14,relay,0,1) 
     return resp[0]

-
-~~~
-
-  ~~~
-  #***************************BASE
+    
+      #***************************BASE
 import spidev
 import RPi.GPIO as GPIO

@@ -213,7 +210,10 @@
     VerifyADDR(addr)
     resp=ppCMD(addr,0x0F,0,0,0)
     time.sleep(.10)
+
 ~~~
+
+



&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Fri, 06 Dec 2019 13:43:56 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com7d0584dcc86edf58b88f4a6717c53dee741fece5</guid></item><item><title>Pi-Plate Code to Convert To SPI modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Pi-Plate%2520Code%2520to%2520Convert%2520To%2520SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -1,20 +1,221 @@
-The code to turn on the relay is as follows
-
-Setup arguments
-Arg 1 = Base Address + Board Address
-Arg 2 = Command
-Arg 3 = Parameter 1
-Arg 4 = Parameter 2
-
-Command =
-Parameter 1 =
-Parameter 2 =
-
-Turn On GPIO output 25
-
-Transfer Arguments, 300000 , 60
-
-It is unknown what 300000 and 60 is for, more than likely something internal
-
-
-
+~~~
+#**********************Relay
+import os
+import sys
+file_dir = os.path.dirname(__file__)
+sys.path.append(file_dir)
+from BASE import *
+
+#==============================================================================#   
+# RELAY Functions                                                             #
+#==============================================================================#  
+def relayON(addr,relay):
+    VerifyADDR(addr)
+    assert ((relay&amp;gt;=1) and (relay&amp;lt;=2)),"Relay number out of range. Must be between 1 and 2"
+    relay -= 1
+    ppCMD(addr,0x10,relay,0,0)
+
+def relayOFF(addr,relay):
+    VerifyADDR(addr)
+    assert ((relay&amp;gt;=1) and (relay&amp;lt;=2)),"Relay number out of range. Must be between 1 and 2"
+    relay -= 1
+    ppCMD(addr,0x11,relay,0,0)
+    
+def relayTOGGLE(addr,relay):
+    VerifyADDR(addr)
+    assert ((relay&amp;gt;=1) and (relay&amp;lt;=2)),"Relay number out of range. Must be between 1 and 2"
+    relay -= 1
+    ppCMD(addr,0x12,relay,0,0)   
+
+def relayALL(addr,relays):
+    VerifyADDR(addr)
+    assert ((relays&amp;gt;=0) and (relays&amp;lt;=3)),"Argument out of range. Must be between 0 and 3"
+    ppCMD(addr,0x13,relays,0,0) 
+    
+def relaySTATE(addr,relay):
+    VerifyADDR(addr)
+    assert ((relay&amp;gt;=1) and (relay&amp;lt;=2)),"Relay number out of range. Must be between 1 and 2"
+    relay -= 1
+    resp=ppCMD(addr,0x14,relay,0,1) 
+    return resp[0]
+    
+
+~~~
+
+  ~~~
+  #***************************BASE
+import spidev
+import RPi.GPIO as GPIO
+
+baseADDR=48
+ppNAME='TINKERplate'
+
+GPIO.setwarnings(False)
+GPIO.setmode(GPIO.BCM)
+baseADDR=48
+MAXADDR=8
+ppFRAME = 25
+ppINT = 22
+ppACK = 23
+GPIO.setup(ppFRAME,GPIO.OUT)
+GPIO.output(ppFRAME,False)  #Initialize FRAME signal
+time.sleep(.001)            #pause to let Pi-Plate reset SPI HW if necessary
+GPIO.setup(ppINT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
+GPIO.setup(ppACK, GPIO.IN, pull_up_down=GPIO.PUD_UP)
+try:
+    spi = spidev.SpiDev()
+    spi.open(0,1)
+except:
+    print("Did you enable the SPI hardware interface on your Raspberry Pi?")
+    print("Go to https://pi-plates.com/getting_started/ and learn how.")
+
+DataGood=False
+platesPresent = list(range(8))
+
+def VerifyADDR(addr):
+    assert ((addr&amp;gt;=0) and (addr&amp;lt;maxaddr)),ppname+" range"="" "+addr_str="" found="" of="" +="" (platespresent[addr]="=1),"No" "+ppname+"="" assert="" verifychan(chan):="" at="" address="" addr_str="str(addr)" +def="" ((chan="" out=""&amp;gt;=1) and (chan&amp;lt;9)),"Invalid channel number - must be between 1 and 8"
+  
+def ppCMD(addr,cmd,param1,param2,bytes2return):
+    global baseADDR
+    global DataGood
+    DataGood=True
+    arg = list(range(4))
+    resp = []
+    arg[0]=addr+baseADDR;
+    arg[1]=cmd;
+    arg[2]=param1;
+    arg[3]=param2;
+    DataGood=True
+    t0=time.time()
+    wait=True    
+    while(wait):
+        if (GPIO.input(ppACK)==1):              
+            wait=False
+        if ((time.time()-t0)&amp;gt;0.05):   #timeout
+            wait=False
+            DataGood=False
+    if (DataGood==True):
+        ppFRAME = 25    
+        GPIO.output(ppFRAME,True)
+        null=spi.xfer(arg,500000,5)
+        #DataGood=True
+        t0=time.time()
+        wait=True
+        while(wait):
+            if (GPIO.input(ppACK)!=1):
+                wait=False
+            if ((time.time()-t0)&amp;gt;0.05):   #timeout
+                wait=False
+                DataGood=False    
+        if (bytes2return&amp;gt;0) and DataGood:
+            t0=time.time()
+            wait=True
+            while(wait):
+                if (GPIO.input(ppACK)!=1):              
+                    wait=False
+                if ((time.time()-t0)&amp;gt;0.08):   #timeout
+                    wait=False
+                    DataGood=False
+            if (DataGood==True):
+                for i in range(0,bytes2return+1):  
+                    dummy=spi.xfer([00],500000,5)
+                    resp.append(dummy[0])
+                csum=0;
+                for i in range(0,bytes2return):
+                    csum+=resp[i]
+                if ((~resp[bytes2return]&amp;amp; 0xFF) != (csum &amp;amp; 0xFF)):
+                    DataGood=False
+        GPIO.output(ppFRAME,False)
+    return resp
+
+def getID(addr):
+    global baseADDR
+    VerifyADDR(addr)
+    addr=addr+baseADDR
+    id=""
+    arg = list(range(4))
+    resp = []
+    arg[0]=addr;
+    arg[1]=0x1;
+    arg[2]=0;
+    arg[3]=0;
+    DataGood=True
+    t0=time.time()
+    wait=True
+    while(wait):
+        if (GPIO.input(ppACK)==1):              
+            wait=False
+        if ((time.time()-t0)&amp;gt;0.05):   #timeout
+            wait=False
+            DataGood=False
+    if (DataGood==True): 
+        ppFRAME = 25
+        GPIO.output(ppFRAME,True)
+        null=spi.xfer(arg,500000,50)
+        #DataGood=True
+        t0=time.time()
+        wait=True
+        while(wait):
+            if (GPIO.input(ppACK)!=1):              
+                wait=False
+            if ((time.time()-t0)&amp;gt;0.05):   #timeout
+                wait=False
+                DataGood=False
+        if (DataGood==True):
+            count=0 
+            csum=0
+            go=True
+            while (go): 
+                dummy=spi.xfer([00],500000,40)
+                if (dummy[0] != 0):
+                    num = dummy[0]
+                    csum += num
+                    id = id + chr(num)
+                    count += 1
+                else:
+                    dummy=spi.xfer([00],500000,40)  
+                    checkSum=dummy[0]                
+                    go=False 
+                if (count&amp;gt;25):
+                    go=False
+                    DataGood=False
+            #print checkSum, ~checkSum &amp;amp; 0xFF, csum &amp;amp; 0xFF
+            if ((~checkSum &amp;amp; 0xFF) != (csum &amp;amp; 0xFF)):
+                DataGood=False
+        GPIO.output(ppFRAME,False)
+    return id   
+    
+def getADDR(addr):
+    global baseADDR
+    resp=ppCMD(addr,0x00,0,0,1)
+    #print resp, DataGood;
+    if (DataGood):
+        return resp[0]-baseADDR
+    else:
+        return 8
+    
+def quietPoll():   
+    global platesPresent
+    ppFoundCount=0
+    for i in range (0,8):
+        platesPresent[i]=0
+        rtn = getADDR(i)
+        if (rtn==i):           
+            platesPresent[i]=1
+            ppFoundCount += 1
+        
+def RESET(addr):
+    VerifyADDR(addr)
+    resp=ppCMD(addr,0x0F,0,0,0)
+    time.sleep(.10)
+~~~
+  
+    
+    
+
+
&amp;lt;/maxaddr)),ppname+"&amp;gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Fri, 06 Dec 2019 13:42:41 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com685e643601db254acadf88016a6066ba49e63f09</guid></item><item><title>Sudo Code For Relay On modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Sudo%2520Code%2520For%2520Relay%2520On/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;The code to turn on the relay is as follows&lt;/p&gt;
&lt;p&gt;Setup arguments&lt;br/&gt;
Arg 1 = Base Address + Board Address&lt;br/&gt;
Arg 2 = Command&lt;br/&gt;
Arg 3 = Parameter 1&lt;br/&gt;
Arg 4 = Parameter 2&lt;/p&gt;
&lt;p&gt;Command =&lt;br/&gt;
Parameter 1 =&lt;br/&gt;
Parameter 2 =&lt;/p&gt;
&lt;p&gt;Turn On GPIO output 25&lt;/p&gt;
&lt;p&gt;Transfer Arguments, 300000 , 60&lt;/p&gt;
&lt;p&gt;It is unknown what 300000 and 60 is for, more than likely something internal&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Wed, 04 Dec 2019 02:24:44 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com73796757c21d3939c71dfe482ee5cf5aa797f5f0</guid></item></channel></rss>