Adds an additional annotation and annotation_row to provide the
PWM period in scaled units of time.
---
 decoders/pwm/pd.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/decoders/pwm/pd.py b/decoders/pwm/pd.py
index 148b34b..21732a9 100644
--- a/decoders/pwm/pd.py
+++ b/decoders/pwm/pd.py
@@ -39,6 +39,11 @@ class Decoder(srd.Decoder):
     )
     annotations = (
         ('duty-cycle', 'Duty cycle'),
+        ('period', 'Period'),
+    )
+    annotation_rows = (
+         ('duty-cycle', 'Duty cycle', (0,)),
+         ('period', 'Period', (1,)),
     )
     binary = (
         ('raw', 'RAW file'),
@@ -54,6 +59,10 @@ class Decoder(srd.Decoder):
         self.num_cycles = 0
         self.average = 0
 
+    def metadata(self, key, value):
+        if key == srd.SRD_CONF_SAMPLERATE:
+            self.samplerate = value
+
     def start(self):
         self.startedge = 0 if self.options['polarity'] == 'active-low' else 1
         self.out_ann = self.register(srd.OUTPUT_ANN)
@@ -65,6 +74,23 @@ class Decoder(srd.Decoder):
     def putx(self, data):
         self.put(self.ss, self.es, self.out_ann, data)
 
+    def putp(self, period_t):
+        # Adjust granularity.
+        if period_t == 0 or period_t >= 1:
+            period_s = u"%u s" % (period_t)
+        elif period_t <= 1e-12:
+            period_s = u"%.1f fs" % (period_t * 1e15)
+        elif period_t <= 1e-9:
+            period_s = u"%.1f ps" % (period_t * 1e12)
+        elif period_t <= 1e-6:
+            period_s = u"%.1f ns" % (period_t * 1e9)
+        elif period_t <= 1e-3:
+            period_s = u"%.1f μs" % (period_t * 1e6)
+        else:
+            period_s = u"%.1f ms" % (period_t * 1e3)
+
+        self.put(self.ss, self.es, self.out_ann, [1, [period_s]])
+
     def putb(self, data):
         self.put(self.num_cycles, self.num_cycles, self.out_bin, data)
 
@@ -108,6 +134,10 @@ class Decoder(srd.Decoder):
                     # Report the duty cycle in the binary output.
                     self.putb((0, bytes([int(ratio * 256)])))
 
+                    # Report the period in units of time.
+                    period_t = float(period / self.samplerate)
+                    self.putp(period_t)
+
                     # Update and report the new duty cycle average.
                     self.num_cycles += 1
                     self.average += percent
-- 
2.1.4


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to