]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/am230x/pd.py
avr_isp: Add more parts
[libsigrokdecode.git] / decoders / am230x / pd.py
index 483dc9be9792497b471c11c46cefa5fc21445b0d..eedf9428e70595b6e2680e03aa2cf430b237518c 100644 (file)
@@ -14,8 +14,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
 ##
 
 import sigrokdecode as srd
@@ -35,14 +34,15 @@ class SamplerateError(Exception):
     pass
 
 class Decoder(srd.Decoder):
-    api_version = 2
+    api_version = 3
     id = 'am230x'
-    name = 'AM230x/DHTxx/RHTxx'
+    name = 'AM230x'
     longname = 'Aosong AM230x/DHTxx/RHTxx'
-    desc = 'Aosong AM230x/DHTxx/RHTxx humidity/temperature sensor protocol.'
+    desc = 'Aosong AM230x/DHTxx/RHTxx humidity/temperature sensor.'
     license = 'gplv2+'
     inputs = ['logic']
-    outputs = ['am230x']
+    outputs = []
+    tags = ['IC', 'Sensor']
     channels = (
         {'id': 'sda', 'name': 'SDA', 'desc': 'Single wire serial data line'},
     )
@@ -56,8 +56,8 @@ class Decoder(srd.Decoder):
         ('bit', 'Bit'),
         ('end', 'End'),
         ('byte', 'Byte'),
-        ('humidity', 'Relative humidity in percent'),
-        ('temperature', 'Temperature in degrees Celsius'),
+        ('humidity', 'Relative humidity'),
+        ('temperature', 'Temperature'),
         ('checksum', 'Checksum'),
     )
     annotation_rows = (
@@ -75,9 +75,8 @@ class Decoder(srd.Decoder):
     def putv(self, data):
         self.put(self.bytepos[-2], self.samplenum, self.out_ann, data)
 
-    def reset(self):
+    def reset_variables(self):
         self.state = 'WAIT FOR START LOW'
-        self.samplenum = 0
         self.fall = 0
         self.rise = 0
         self.bits = []
@@ -124,9 +123,12 @@ class Decoder(srd.Decoder):
         return checksum % 256
 
     def __init__(self):
-        self.samplerate = None
         self.reset()
 
+    def reset(self):
+        self.samplerate = None
+        self.reset_variables()
+
     def start(self):
         self.out_ann = self.register(srd.OUTPUT_ANN)
 
@@ -164,72 +166,64 @@ class Decoder(srd.Decoder):
                 self.state = 'WAIT FOR END'
             self.bytepos.append(self.samplenum)
 
-    def decode(self, ss, es, data):
+    def decode(self):
         if not self.samplerate:
             raise SamplerateError('Cannot decode without samplerate.')
-        for (self.samplenum, (sda,)) in data:
+        while True:
             # State machine.
             if self.state == 'WAIT FOR START LOW':
-                if sda != 0:
-                    continue
+                self.wait({0: 'f'})
                 self.fall = self.samplenum
                 self.state = 'WAIT FOR START HIGH'
             elif self.state == 'WAIT FOR START HIGH':
-                if sda != 1:
-                    continue
+                self.wait({0: 'r'})
                 if self.is_valid('START LOW'):
                     self.rise = self.samplenum
                     self.state = 'WAIT FOR RESPONSE LOW'
                 else:
-                    self.reset()
+                    self.reset_variables()
             elif self.state == 'WAIT FOR RESPONSE LOW':
-                if sda != 0:
-                    continue
+                self.wait({0: 'f'})
                 if self.is_valid('START HIGH'):
                     self.putfs([0, ['Start', 'S']])
                     self.fall = self.samplenum
                     self.state = 'WAIT FOR RESPONSE HIGH'
                 else:
-                    self.reset()
+                    self.reset_variables()
             elif self.state == 'WAIT FOR RESPONSE HIGH':
-                if sda != 1:
-                    continue
+                self.wait({0: 'r'})
                 if self.is_valid('RESPONSE LOW'):
                     self.rise = self.samplenum
                     self.state = 'WAIT FOR FIRST BIT'
                 else:
-                    self.reset()
+                    self.reset_variables()
             elif self.state == 'WAIT FOR FIRST BIT':
-                if sda != 0:
-                    continue
+                self.wait({0: 'f'})
                 if self.is_valid('RESPONSE HIGH'):
                     self.putfs([1, ['Response', 'R']])
                     self.fall = self.samplenum
                     self.bytepos.append(self.samplenum)
                     self.state = 'WAIT FOR BIT HIGH'
                 else:
-                    self.reset()
+                    self.reset_variables()
             elif self.state == 'WAIT FOR BIT HIGH':
-                if sda != 1:
-                    continue
+                self.wait({0: 'r'})
                 if self.is_valid('BIT LOW'):
                     self.rise = self.samplenum
                     self.state = 'WAIT FOR BIT LOW'
                 else:
-                    self.reset()
+                    self.reset_variables()
             elif self.state == 'WAIT FOR BIT LOW':
-                if sda != 0:
-                    continue
+                self.wait({0: 'f'})
                 if self.is_valid('BIT 0 HIGH'):
                     bit = 0
                 elif self.is_valid('BIT 1 HIGH'):
                     bit = 1
                 else:
-                    self.reset()
+                    self.reset_variables()
                     continue
                 self.handle_byte(bit)
             elif self.state == 'WAIT FOR END':
-                if sda != 1:
-                    continue
+                self.wait({0: 'r'})
                 self.putfs([3, ['End', 'E']])
-                self.reset()
+                self.reset_variables()