Exemple #1
0
 def handle_reg_0x0d(self, b):  # Alarm 2 Day/Date
     self.alarm2.m4 = bcd2int(b & 0b10000000) >> 7
     self.putd(7, 7, [
         Ann.BIT_AE,
         ['A2M4: %d' % self.alarm2.m4,
          'A4: %d' % self.alarm2.m4, 'A4']
     ])
     self.alarm2.dy_dt = 1 if bcd2int(b & 0b01000000) else 0
     date = bcd2int(b & 0b00111111)
     if self.alarm2.dy_dt:
         self.putd(6, 6, [Ann.BIT_DY_DT, ['Day of week', 'DT', 'D']])
         self.putd(5, 0, [
             Ann.BIT_DAY, ['Day of week: %d' % date,
                           'DOW: %d' % date, 'D']
         ])
         self.alarm2.dow = date
     else:
         self.putd(6, 6, [Ann.BIT_DY_DT, ['Day of month', 'DT', 'D']])
         self.putd(5, 0, [
             Ann.BIT_DATE,
             ['Day of month: %d' % date,
              'DOM: %d' % date, 'D']
         ])
         self.alarm2.dom = date
     self.putd(7, 0, [Ann.REG_ALARM_2_DAY_DATE, ['Day/Date', 'Dy/Dt', 'D']])
Exemple #2
0
 def handle_reg_0x0c(self, b, rw):  # Alarm2 Hours (1-12+AM/PM or 0-23)
     self.putd(7, 0,
               [Ann.REG_ALARM2_HOURS, ['Alarm2 Hours', 'Al2 Hr', 'A2H']])
     self.a2m3 = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [Ann.BIT_A2M3, ['A2M3: %d' % self.a2m3, 'A2M3']])
     if (b & (1 << 6)):
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['12-hour mode', '12h mode', '12h']])
         self.a2ampm = 'PM' if (b & (1 << 5)) else 'AM'
         self.putd(5, 5, [Ann.BIT_AM_PM, [self.a2ampm, self.a2ampm[0]]])
         h = self.al2hours = bcd2int(b & 0x1f)
         self.putd(4, 0,
                   [Ann.BIT_HOURS, ['Hour: %d' % h,
                                    'H: %d' % h, 'H']])
     else:
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['24-hour mode', '24h mode', '24h']])
         self.a2ampm = ''
         h = self.al2hours = bcd2int(b & 0x3f)
         self.putd(5, 0,
                   [Ann.BIT_HOURS, ['Hour: %d' % h,
                                    'H: %d' % h, 'H']])
     self.inblock = 0x0c if self.inblock == 0x0b and self.blockmode == rw else -1
Exemple #3
0
 def handle_reg_0x09(self, b, rw):  # Alarm1 Hours (1-12+AM/PM or 0-23)
     self.putd(7, 0,
               [Ann.REG_ALARM1_HOURS, ['Alarm1 Hours', 'Al1 Hr', 'A1H']])
     self.a1m3 = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [Ann.BIT_A1M3, ['A1M3: %d' % self.a1m3, 'A1M3']])
     if (b & (1 << 6)):
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['12-hour mode', '12h mode', '12h']])
         self.a1ampm = 'PM' if (b & (1 << 5)) else 'AM'
         self.putd(5, 5, [Ann.BIT_AM_PM, [self.a1ampm, self.a1ampm[0]]])
         self.al1hours = bcd2int(b & 0x1f)
         self.putd(4, 0, [
             Ann.BIT_HOURS,
             ['Hour: %d' % self.al1hours,
              'H: %d' % self.al1hours, 'H']
         ])
     else:
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['24-hour mode', '24h mode', '24h']])
         self.a1ampm = ''
         self.al1hours = bcd2int(b & 0x3f)
         self.putd(5, 0, [
             Ann.BIT_HOURS,
             ['Hour: %d' % self.al1hours,
              'H: %d' % self.al1hours, 'H']
         ])
     self.inblock = 9 if self.inblock == 8 and self.blockmode == rw else -1
Exemple #4
0
 def handle_reg_0x02(self, b, rw):  # Hours (1-12+AM/PM or 0-23)
     self.putd(7, 0, [Ann.REG_HOURS, ['Hours', 'H']])
     self.putr(7)
     if (b & (1 << 6)):
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['12-hour mode', '12h mode', '12h']])
         self.ampm = 'PM' if (b & (1 << 5)) else 'AM'
         self.putd(5, 5, [Ann.BIT_AM_PM, [self.ampm, self.ampm[0]]])
         self.hours = bcd2int(b & 0x1f)
         self.putd(4, 0, [
             Ann.BIT_HOURS,
             ['Hour: %d' % self.hours,
              'H: %d' % self.hours, 'H']
         ])
     else:
         self.putd(
             6, 6,
             [Ann.BIT_12_24_HOURS, ['24-hour mode', '24h mode', '24h']])
         self.ampm = ''
         self.hours = bcd2int(b & 0x3f)
         self.putd(5, 0, [
             Ann.BIT_HOURS,
             ['Hour: %d' % self.hours,
              'H: %d' % self.hours, 'H']
         ])
     self.inblock = 2 if self.inblock == 1 and self.blockmode == rw else -1
Exemple #5
0
    def handle_reg_0x02(self, databyte):
        """Process hours (1-12+AM/PM or 0-23) and 12/24 hours mode.

        - In case of 12 hours mode convert hours to 24 hours mode to instance
          variable for formatting.
        """
        # Bits row
        self.putb(7)
        mode12h = databyte >> TimeBits.MODE & 1
        if mode12h:
            # Bits row - 12h mode
            ann = AnnBits.MODE
            val = "12h"
            annots = hlp.compose_annot(bits[ann], ann_value=val)
            self.putd(TimeBits.MODE, TimeBits.MODE, [ann, annots])
            # Bits row - AM/PM mode
            pm = databyte >> TimeBits.AMPM & 1
            pm_l = ("AM", "PM")[pm]
            pm_s = pm_l[0].upper()
            ann = AnnBits.AMPM
            val = [pm, pm_l, pm_s]
            annots = hlp.compose_annot(bits[ann], ann_value=val)
            self.putd(TimeBits.AMPM, TimeBits.AMPM, [ann, annots])
            # Bits row - hours
            self.hour = hlp.bcd2int(databyte & 0x1f)
            # Convert to 24h expression
            self.hour %= 12
            if pm:
                self.hour += 12
            ann = AnnBits.HOUR
            val = self.hour
            annots = hlp.compose_annot(bits[ann], ann_value=val)
            self.putd(0, TimeBits.AMPM - 1, [ann, annots])
        else:
            # Bits row - 24h mode
            ann = AnnBits.MODE
            val = "24h"
            annots = hlp.compose_annot(bits[ann], ann_value=val)
            self.putd(TimeBits.MODE, TimeBits.MODE, [ann, annots])
            # Bits row - hours
            self.hour = hlp.bcd2int(databyte & 0x3f)
            ann = AnnBits.HOUR
            val = self.hour
            annots = hlp.compose_annot(bits[ann], ann_value=val)
            self.putd(0, TimeBits.MODE - 1, [ann, annots])
        # Registers row
        ann = AnnRegs.HOUR
        act = self.format_rw()
        annots = hlp.compose_annot(registers[ann], ann_action=act)
        self.put(self.ssd, self.es, self.out_ann, [ann, annots])
Exemple #6
0
 def handle_reg_0x02(self, b): # Hours (1-12+AM/PM or 0-23)
     self.putd(7, 0, [2, ['Hours', 'H']])
     self.putr(7)
     ampm_mode = True if (b & (1 << 6)) else False
     if ampm_mode:
         self.putd(6, 6, [13, ['12-hour mode', '12h mode', '12h']])
         a = 'AM' if (b & (1 << 6)) else 'PM'
         self.putd(5, 5, [14, [a, a[0]]])
         h = self.hours = bcd2int(b & 0x1f)
         self.putd(4, 0, [15, ['Hour: %d' % h, 'H: %d' % h, 'H']])
     else:
         self.putd(6, 6, [13, ['24-hour mode', '24h mode', '24h']])
         h = self.hours = bcd2int(b & 0x3f)
         self.putd(5, 0, [15, ['Hour: %d' % h, 'H: %d' % h, 'H']])
Exemple #7
0
 def handle_reg_0x05(self, b):
     self.putr(6)
     self.putr(5)
     self.time.months = bcd2int(b & 0x0f)
     self.putd(4, 0, [
         Ann.BIT_MONTH,
         ['Month: %d' % self.time.months,
          'M: %d' % self.time.months, 'M']
     ])
     c = bcd2int(b & 0x80)
     self.putd(7, 7,
               [Ann.BIT_CENTURY, ['Century: %d' % c,
                                  'C: %d' % c, 'C']])
     self.putd(7, 0, [Ann.REG_MONTH, ['Month', 'Mon.', 'M']])
Exemple #8
0
 def handle_reg_0x02(self, b): # Hours (1-12+AM/PM or 0-23)
     self.putd(7, 0, [2, ['Hours', 'H']])
     self.putr(7)
     ampm_mode = True if (b & (1 << 6)) else False
     if ampm_mode:
         self.putd(6, 6, [13, ['12-hour mode', '12h mode', '12h']])
         a = 'PM' if (b & (1 << 5)) else 'AM'
         self.putd(5, 5, [14, [a, a[0]]])
         h = self.hours = bcd2int(b & 0x1f)
         self.putd(4, 0, [15, ['Hour: %d' % h, 'H: %d' % h, 'H']])
     else:
         self.putd(6, 6, [13, ['24-hour mode', '24h mode', '24h']])
         h = self.hours = bcd2int(b & 0x3f)
         self.putd(5, 0, [15, ['Hour: %d' % h, 'H: %d' % h, 'H']])
Exemple #9
0
 def handle_reg_0x0a(self, b, rw):  # Alarm1 Date or Day / day of week (1-7)
     self.putd(7, 0, [
         Ann.REG_ALARM1_DAY_DATE,
         ['Alarm1 Date or Day of week', 'Al1 Day / DOW', 'A1DD']
     ])
     a1m4 = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [Ann.BIT_A1M4, ['A1M4: %d' % a1m4, 'A1M4']])
     a1dydt = 1 if (b & (1 << 6)) else 0
     self.putd(6, 6, [Ann.BIT_DAY_DATE, ['DYDT: %d' % a1dydt, 'DYDT']])
     if a1dydt == 1:
         w = bcd2int(b & 0x07)
         ws = days_of_week[self.options['fdw']][w - 1]
         self.putd(
             2, 0,
             [Ann.BIT_DAY, ['Weekday: %s' % ws,
                            'WD: %d' % w, 'WD', 'W']])
     else:
         da = bcd2int(b & 0x3f)
         self.putd(
             5, 0,
             [Ann.BIT_DATE, ['Date / Day: %d' % da,
                             'D: %d' % da, 'D']])
     #block
     if self.inblock == 9 and self.blockmode == rw:
         if (self.a1m1, self.a1m2, self.a1m3, a1m4) == (1, 1, 1, 1):
             d = 'every second'
         elif (self.a1m1, self.a1m2, self.a1m3, a1m4) == (0, 1, 1, 1):
             d = 'every minute, second=%02d' % self.al1seconds
         elif (self.a1m1, self.a1m2, self.a1m3, a1m4) == (0, 0, 1, 1):
             d = 'every hour, mm:ss=%02d:%02d' % (self.al1minutes,
                                                  self.al1seconds)
         elif (self.a1m1, self.a1m2, self.a1m3, a1m4) == (0, 0, 0, 1):
             d = 'daily, hh:mm:ss=%02d:%02d:%02d%s' % (
                 self.al1hours, self.al1minutes, self.al1seconds,
                 self.a1ampm)
         elif (self.a1m1, self.a1m2, self.a1m3, a1m4) == (0, 0, 0, 0):
             if a1dydt == 1:
                 daydate = ws
             else:
                 daydate = '%d. of every month' % da
             d = '%s, %02d:%02d:%02d' % (daydate, self.al1hours,
                                         self.al1minutes, self.al1seconds)
         else:
             d = 'invalid setting'  #FIXME: print warning
         d = 'Alarm1: ' + d
         self.put(self.startreg, self.es, self.out_ann,
                  [Ann.BLOCK_ALARM1, ['%s %s' % (rw, d)]])
     self.inblock = -1
Exemple #10
0
    def handle_reg_0x03(self, databyte):
        """Process weekday (1-7).

        - Recalculate weekday in respect to starting weekday option to instance
          variable for formatting.
        """
        # Bits row - reserved
        self.putb(3, 8)
        # Bits row - calculate weekday
        self.weekday = hlp.bcd2int(databyte & 0x07)
        start_weekday_index = 0
        for i, weekday in enumerate(weekdays):
            if weekday == self.options["start_weekday"]:
                start_weekday_index = i
                break
        start_weekday_index += self.weekday - 1
        start_weekday_index %= 7
        self.weekday = start_weekday_index
        weekday = weekdays[self.weekday]
        # Bits row - weekday
        ann = AnnBits.WEEKDAY
        val = weekday
        annots = hlp.compose_annot(bits[ann], ann_value=val)
        self.putd(0, 2, [ann, annots])
        # Registers row
        ann = AnnRegs.WEEKDAY
        act = self.format_rw()
        annots = hlp.compose_annot(registers[ann], ann_action=act)
        self.put(self.ssd, self.es, self.out_ann, [ann, annots])
Exemple #11
0
 def handle_reg_0x04(self, b, rw):  # Date (1-31)
     self.putd(7, 0, [Ann.REG_DATE, ['Date', 'D']])
     for i in (7, 6):
         self.putr(i)
     d = self.date = bcd2int(b & 0x3f)
     self.putd(5, 0, [Ann.BIT_DATE, ['Date: %d' % d, 'D: %d' % d, 'D']])
     self.inblock = 4 if self.inblock == 3 and self.blockmode == rw else -1
Exemple #12
0
 def handle_reg_0x00(self, b): # Seconds (0-59) / Clock halt bit
     self.putd(7, 0, [0, ['Seconds', 'Sec', 'S']])
     ch = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [9, ['Clock halt: %d' % ch, 'Clk hlt: %d' % ch,
                     'CH: %d' % ch, 'CH']])
     s = self.seconds = bcd2int(b & 0x7f)
     self.putd(6, 0, [10, ['Second: %d' % s, 'Sec: %d' % s, 'S: %d' % s, 'S']])
Exemple #13
0
 def handle_reg_0x0b(self, b):  # Alarm 2 minutes
     self.alarm2.m2 = bcd2int(b & 0b10000000) >> 7
     self.putd(7, 7, [
         Ann.BIT_AE,
         ['A2M2: %d' % self.alarm2.m2,
          'A2: %d' % self.alarm2.m2, 'A2']
     ])
     self.alarm2.minutes = bcd2int(b & 0b01111111)
     self.putd(6, 0, [
         Ann.BIT_MINUTES,
         [
             'Minutes: %d' % self.alarm2.minutes,
             'Min: %d' % self.alarm2.minutes, 'M'
         ]
     ])
     self.putd(7, 0, [Ann.REG_ALARM_2_MINS, ['Minutes', 'Mins', 'M']])
Exemple #14
0
 def handle_reg_0x00(self, b): # Seconds (0-59) / Clock halt bit
     self.putd(7, 0, [0, ['Seconds', 'Sec', 'S']])
     ch = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [9, ['Clock halt: %d' % ch, 'Clk hlt: %d' % ch,
                     'CH: %d' % ch, 'CH']])
     s = self.seconds = bcd2int(b & 0x7f)
     self.putd(6, 0, [10, ['Second: %d' % s, 'Sec: %d' % s, 'S: %d' % s, 'S']])
Exemple #15
0
 def handle_reg_0x03(self, b):  # Minutes
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0,
               [3, ['Minute: %d' % m,
                    'Min: %d' % m,
                    'M: %d' % m, 'M']])
Exemple #16
0
 def handle_reg_0x03(self, b): # Day / day of week (1-7)
     self.putd(7, 0, [3, ['Day of week', 'Day', 'D']])
     for i in (7, 6, 5, 4, 3):
         self.putr(i)
     w = self.days = bcd2int(b & 0x07)
     ws = days_of_week[self.days - 1]
     self.putd(2, 0, [16, ['Weekday: %s' % ws, 'WD: %s' % ws, 'WD', 'W']])
Exemple #17
0
 def handle_reg_0x07(self, b):  # Alarm 1 seconds
     self.alarm1.m1 = bcd2int(b & 0b10000000) >> 7
     self.putd(7, 7, [
         Ann.BIT_AE,
         ['A1M1: %d' % self.alarm1.m1,
          'A1: %d' % self.alarm1.m1, 'A1']
     ])
     self.alarm1.seconds = bcd2int(b & 0b01111111)
     self.putd(6, 0, [
         Ann.BIT_SECONDS,
         [
             'Seconds: %d' % self.alarm1.seconds,
             'S: %d' % self.alarm1.seconds, 'S'
         ]
     ])
     self.putd(7, 0, [Ann.REG_ALARM_1_SECS, ['Seconds', 'Secs', 'S']])
Exemple #18
0
 def handle_reg_0x09(self, b):  # Alarm 1 hours
     self.alarm1.m3 = bcd2int(b & 0b10000000) >> 7
     self.putd(7, 7, [
         Ann.BIT_AE,
         ['A1M3: %d' % self.alarm1.m3,
          'A3: %d' % self.alarm1.m3, 'A3']
     ])
     self.alarm1.hours = bcd2int(b & 0b01111111)
     self.putd(6, 0, [
         Ann.BIT_HOURS,
         [
             'Hours: %d' % self.alarm1.hours,
             'HH: %d' % self.alarm1.hours, 'H'
         ]
     ])
     self.putd(7, 0, [Ann.REG_ALARM_1_HOURS, ['Hours', 'Hrs.', 'H']])
Exemple #19
0
 def handle_reg_0x03(self, b): # Day / day of week (1-7)
     self.putd(7, 0, [3, ['Day of week', 'Day', 'D']])
     for i in (7, 6, 5, 4, 3):
         self.putr(i)
     w = self.days = bcd2int(b & 0x07)
     ws = days_of_week[self.days - 1]
     self.putd(2, 0, [16, ['Weekday: %s' % ws, 'WD: %s' % ws, 'WD', 'W']])
Exemple #20
0
 def handle_reg_0x01(self, b):  # Minutes (0-59)
     self.putd(7, 0, [1, ['Minutes', 'Min', 'M']])
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0,
               [12, ['Minute: %d' % m,
                     'Min: %d' % m,
                     'M: %d' % m, 'M']])
Exemple #21
0
 def handle_reg_0x06(self, b):
     self.time.years = bcd2int(b & 0xff)
     self.putd(7, 0, [
         Ann.BIT_YEAR,
         ['Year: %d' % self.time.years,
          'Y: %d' % self.time.years, 'Y']
     ])
     self.putd(7, 0, [Ann.REG_YEAR, ['Year', 'Yr.', 'Y']])
Exemple #22
0
 def handle_reg_0x07(self, b): # Months / century bit
     c = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [13, ['Century bit: %d' % c, 'Century: %d' % c,
                           'Cent: %d' % c, 'C: %d' % c, 'C']])
     self.putr(6)
     self.putr(5)
     m = self.months = bcd2int(b & 0x1f)
     self.putd(4, 0, [7, ['Month: %d' % m, 'Mon: %d' % m, 'M: %d' % m, 'M']])
Exemple #23
0
 def handle_reg_0x05(self, b):  # Month (1-12)
     self.putd(7, 0, [5, ['Month', 'Mon', 'M']])
     for i in (7, 6, 5):
         self.putr(i)
     m = self.months = bcd2int(b & 0x1f)
     self.putd(4, 0,
               [18, ['Month: %d' % m,
                     'Mon: %d' % m,
                     'M: %d' % m, 'M']])
Exemple #24
0
 def handle_reg_0x01(self, b):  # Minutes (0-59)
     self.putd(7, 0, [Ann.REG_MINUTES, ['Minutes', 'Min', 'M']])
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [
         Ann.BIT_MINUTES,
         ['Minute: %d' % m,
          'Min: %d' % m, 'M: %d' % m, 'M']
     ])
Exemple #25
0
 def handle_reg_0x0d(self, b, rw):  # Alarm2 Date or Day / day of week (1-7)
     self.putd(7, 0, [
         Ann.REG_ALARM2_DAY_DATE,
         ['Alarm2 Date or Day of week', 'Al2 Day / DOW', 'A2DD']
     ])
     a2m4 = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [Ann.BIT_A2M4, ['A2M4: %d' % a2m4, 'A2M4']])
     a2dydt = 1 if (b & (1 << 6)) else 0
     self.putd(6, 6, [Ann.BIT_DAY_DATE, ['DYDT: %d' % a2dydt, 'DYDT']])
     if a2dydt == 1:
         w = bcd2int(b & 0x07)
         ws = days_of_week[self.options['fdw']][w - 1]
         self.putd(
             2, 0,
             [Ann.BIT_DAY, ['Weekday: %s' % ws,
                            'WD: %d' % w, 'WD', 'W']])
     else:
         da = bcd2int(b & 0x3f)
         self.putd(
             5, 0,
             [Ann.BIT_DATE, ['Date / Date: %d' % da,
                             'D: %d' % da, 'D']])
     #block
     if self.inblock == 0x0c and self.blockmode == rw:
         if (self.a2m2, self.a2m3, a2m4) == (1, 1, 1):
             d = 'every minute'
         elif (self.a2m2, self.a2m3, a2m4) == (0, 1, 1):
             d = 'every hour, minute=%02d' % self.al2minutes
         elif (self.a2m2, self.a2m3, a2m4) == (0, 0, 1):
             d = 'every day, hh:mm=%02d:%02d%s' % (
                 self.al2hours, self.al2minutes, self.a2ampm)
         elif (self.a2m2, self.a2m3, a2m4) == (0, 0, 0):
             if a2dydt == 1:
                 daydate = ws
             else:
                 daydate = '%d. of month' % da
             d = 'every %s, hh:mm=%02d:%02d' % (daydate, self.al2hours,
                                                self.al2minutes)
         else:
             d = 'invalid setting'  #FIXME: print warning
         d = 'Alarm2: ' + d
         self.put(self.startreg, self.es, self.out_ann,
                  [Ann.BLOCK_ALARM2, ['%s %s' % (rw, d)]])
     self.inblock = -1
Exemple #26
0
 def handle_reg_0x04(self, b):
     self.putr(7)
     self.putr(6)
     self.time.date = bcd2int(b & 0x7f)
     self.putd(5, 0, [
         Ann.BIT_DATE,
         ['Date: %d' % self.time.date,
          'D: %d' % self.time.date, 'D']
     ])
     self.putd(7, 0, [Ann.REG_DATE, ['Date', 'D', 'D']])
Exemple #27
0
 def handle_reg_0x01(self, b, rw):  # Minutes (0-59)
     self.putd(7, 0, [Ann.REG_MINUTES, ['Minutes', 'Min', 'M']])
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [
         Ann.BIT_MINUTES,
         ['Minute: %d' % m,
          'Min: %d' % m, 'M: %d' % m, 'M']
     ])
     self.inblock = 1 if self.inblock == 0 and self.blockmode == rw else -1
Exemple #28
0
 def handle_reg_0x03(self, b, rw):  # Day / day of week (1-7)
     self.putd(7, 0, [Ann.REG_DAY, ['Day of week', 'Day', 'D']])
     for i in (7, 6, 5, 4, 3):
         self.putr(i)
     self.days = bcd2int(b & 0x07)
     ws = days_of_week[self.options['fdw']][self.days - 1]
     self.putd(
         2, 0,
         [Ann.BIT_DAY, ['Weekday: %s' % ws,
                        'WD: %s' % ws, 'WD', 'W']])
     self.inblock = 3 if self.inblock == 2 and self.blockmode == rw else -1
Exemple #29
0
 def put_field(self, numbits, line):
     param = self.ookstring[self.decode_pos:self.decode_pos + numbits]
     if 'rev' in self.displayas:
         param = param[::-1]  # Reversed from right.
     if not 'E' in param:  # Format if no errors.
         if 'Hex' in self.displayas:
             param = hex(int(param, 2))[2:]
         elif 'BCD' in self.displayas:
             param = bcd2int(int(param, 2))
     self.putx([line, [str(param)]])
     self.decode_pos += numbits
Exemple #30
0
 def handle_reg_0x00(self, b):  # Seconds
     self.putr(7)
     self.time.seconds = bcd2int(b & 0x7f)
     self.putd(6, 0, [
         Ann.BIT_SECONDS,
         [
             'Second: %d' % self.time.seconds,
             'Secs: %d' % self.time.seconds, 'S'
         ]
     ])
     self.putd(7, 0, [Ann.REG_SECONDS, ['Seconds', 'Secs', 'S']])
Exemple #31
0
 def handle_reg_0x01(self, b):
     self.putr(7)
     self.time.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [
         Ann.BIT_MINUTES,
         [
             'Minute: %d' % self.time.minutes,
             'M: %d' % self.time.minutes, 'M'
         ]
     ])
     self.putd(7, 0, [Ann.REG_MINUTES, ['Minutes', 'Mins', 'M']])
Exemple #32
0
 def handle_reg_0x00(self, b, rw):  # Seconds (0-59)
     self.putd(7, 0, [Ann.REG_SECONDS, ['Seconds', 'Sec', 'S']])
     s = self.seconds = bcd2int(b & 0x7f)
     self.putr(7)
     self.putd(6, 0, [
         Ann.BIT_SECONDS,
         ['Second: %d' % s,
          'Sec: %d' % s, 'S: %d' % s, 'S']
     ])
     #block
     self.startreg = self.ss
     self.inblock = 0
     self.blockmode = rw
Exemple #33
0
 def handle_reg_0x08(self, b, rw):  # Alarm1 Minutes (0-59)
     self.putd(
         7, 0,
         [Ann.REG_ALARM1_MINUTES, ['Alarm1 Minutes', 'Al1 Min', 'A1M']])
     self.a1m2 = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [Ann.BIT_A1M2, ['A1M2: %d' % self.a1m2, 'A1M2']])
     m = self.al1minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [
         Ann.BIT_MINUTES,
         ['Minute: %d' % m,
          'Min: %d' % m, 'M: %d' % m, 'M']
     ])
     self.inblock = 8 if self.inblock == 7 and self.blockmode == rw else -1
Exemple #34
0
 def handle_reg_0x01(self, b): # Minutes (0-59)
     self.putd(7, 0, [1, ['Minutes', 'Min', 'M']])
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [12, ['Minute: %d' % m, 'Min: %d' % m, 'M: %d' % m, 'M']])
Exemple #35
0
 def handle_reg_0x04(self, b): # Date (1-31)
     self.putd(7, 0, [4, ['Date', 'D']])
     for i in (7, 6):
         self.putr(i)
     d = self.date = bcd2int(b & 0x3f)
     self.putd(5, 0, [17, ['Date: %d' % d, 'D: %d' % d, 'D']])
Exemple #36
0
 def handle_reg_0x05(self, b): # Month (1-12)
     self.putd(7, 0, [5, ['Month', 'Mon', 'M']])
     for i in (7, 6, 5):
         self.putr(i)
     m = self.months = bcd2int(b & 0x1f)
     self.putd(4, 0, [18, ['Month: %d' % m, 'Mon: %d' % m, 'M: %d' % m, 'M']])
Exemple #37
0
 def handle_reg_0x06(self, b): # Year (0-99)
     self.putd(7, 0, [6, ['Year', 'Y']])
     y = self.years = bcd2int(b & 0xff)
     self.years += 2000
     self.putd(7, 0, [19, ['Year: %d' % y, 'Y: %d' % y, 'Y']])
Exemple #38
0
 def handle_reg_0x02(self, b): # Seconds / Voltage-low bit
     vl = 1 if (b & (1 << 7)) else 0
     self.putd(7, 7, [12, ['Voltage low: %d' % vl, 'Volt. low: %d' % vl,
                     'VL: %d' % vl, 'VL']])
     s = self.seconds = bcd2int(b & 0x7f)
     self.putd(6, 0, [2, ['Second: %d' % s, 'Sec: %d' % s, 'S: %d' % s, 'S']])
Exemple #39
0
 def handle_reg_0x03(self, b): # Minutes
     self.putr(7)
     m = self.minutes = bcd2int(b & 0x7f)
     self.putd(6, 0, [3, ['Minute: %d' % m, 'Min: %d' % m, 'M: %d' % m, 'M']])
Exemple #40
0
    def handle_dcf77_bit(self, bit):
        c = self.bitcount

        # Create one annotation for each DCF77 bit (containing the 0/1 value).
        # Use 'Unknown DCF77 bit x: val' if we're not sure yet which of the
        # 0..58 bits it is (because we haven't seen a 'new minute' marker yet).
        # Otherwise, use 'DCF77 bit x: val'.
        s = 'B' if self.dcf77_bitnumber_is_known else 'Unknown b'
        ann = 17 if self.dcf77_bitnumber_is_known else 18
        self.putx([ann, ['%sit %d: %d' % (s, c, bit), '%d' % bit]])

        # If we're not sure yet which of the 0..58 DCF77 bits we have, return.
        # We don't want to decode bogus data.
        if not self.dcf77_bitnumber_is_known:
            return

        # Collect bits 36-58, we'll need them for a parity check later.
        if c in range(36, 58 + 1):
            self.datebits.append(bit)

        # Output specific "decoded" annotations for the respective DCF77 bits.
        if c == 0:
            # Start of minute: DCF bit 0.
            if bit == 0:
                self.putx([0, ['Start of minute (always 0)',
                               'Start of minute', 'SoM']])
            else:
                self.putx([19, ['Start of minute != 0', 'SoM != 0']])
        elif c in range(1, 14 + 1):
            # Special bits (civil warnings, weather forecast): DCF77 bits 1-14.
            if c == 1:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 1))
            if c == 14:
                s = bin(self.tmp)[2:].zfill(14)
                self.putb([1, ['Special bits: %s' % s, 'SB: %s' % s]])
        elif c == 15:
            s = '' if (bit == 1) else 'not '
            self.putx([2, ['Call bit: %sset' % s, 'CB: %sset' % s]])
            # TODO: Previously this bit indicated use of the backup antenna.
        elif c == 16:
            s = '' if (bit == 1) else 'not '
            x = 'yes' if (bit == 1) else 'no'
            self.putx([3, ['Summer time announcement: %sactive' % s,
                           'Summer time: %sactive' % s,
                           'Summer time: %s' % x, 'ST: %s' % x]])
        elif c == 17:
            s = '' if (bit == 1) else 'not '
            x = 'yes' if (bit == 1) else 'no'
            self.putx([4, ['CEST: %sin effect' % s, 'CEST: %s' % x]])
        elif c == 18:
            s = '' if (bit == 1) else 'not '
            x = 'yes' if (bit == 1) else 'no'
            self.putx([5, ['CET: %sin effect' % s, 'CET: %s' % x]])
        elif c == 19:
            s = '' if (bit == 1) else 'not '
            x = 'yes' if (bit == 1) else 'no'
            self.putx([6, ['Leap second announcement: %sactive' % s,
                           'Leap second: %sactive' % s,
                           'Leap second: %s' % x, 'LS: %s' % x]])
        elif c == 20:
            # Start of encoded time: DCF bit 20.
            if bit == 1:
                self.putx([7, ['Start of encoded time (always 1)',
                               'Start of encoded time', 'SoeT']])
            else:
                self.putx([19, ['Start of encoded time != 1', 'SoeT != 1']])
        elif c in range(21, 27 + 1):
            # Minutes (0-59): DCF77 bits 21-27 (BCD format).
            if c == 21:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 21))
            if c == 27:
                m = bcd2int(self.tmp)
                self.putb([8, ['Minutes: %d' % m, 'Min: %d' % m]])
        elif c == 28:
            # Even parity over minute bits (21-28): DCF77 bit 28.
            self.tmp |= (bit << (c - 21))
            parity = bin(self.tmp).count('1')
            s = 'OK' if ((parity % 2) == 0) else 'INVALID!'
            self.putx([9, ['Minute parity: %s' % s, 'Min parity: %s' % s]])
        elif c in range(29, 34 + 1):
            # Hours (0-23): DCF77 bits 29-34 (BCD format).
            if c == 29:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 29))
            if c == 34:
                self.putb([10, ['Hours: %d' % bcd2int(self.tmp)]])
        elif c == 35:
            # Even parity over hour bits (29-35): DCF77 bit 35.
            self.tmp |= (bit << (c - 29))
            parity = bin(self.tmp).count('1')
            s = 'OK' if ((parity % 2) == 0) else 'INVALID!'
            self.putx([11, ['Hour parity: %s' % s]])
        elif c in range(36, 41 + 1):
            # Day of month (1-31): DCF77 bits 36-41 (BCD format).
            if c == 36:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 36))
            if c == 41:
                self.putb([12, ['Day: %d' % bcd2int(self.tmp)]])
        elif c in range(42, 44 + 1):
            # Day of week (1-7): DCF77 bits 42-44 (BCD format).
            # A value of 1 means Monday, 7 means Sunday.
            if c == 42:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 42))
            if c == 44:
                d = bcd2int(self.tmp)
                dn = calendar.day_name[d - 1] # day_name[0] == Monday
                self.putb([13, ['Day of week: %d (%s)' % (d, dn),
                                'DoW: %d (%s)' % (d, dn)]])
        elif c in range(45, 49 + 1):
            # Month (1-12): DCF77 bits 45-49 (BCD format).
            if c == 45:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 45))
            if c == 49:
                m = bcd2int(self.tmp)
                mn = calendar.month_name[m] # month_name[1] == January
                self.putb([14, ['Month: %d (%s)' % (m, mn),
                                'Mon: %d (%s)' % (m, mn)]])
        elif c in range(50, 57 + 1):
            # Year (0-99): DCF77 bits 50-57 (BCD format).
            if c == 50:
                self.tmp = bit
                self.ss_block = self.ss_bit
            else:
                self.tmp |= (bit << (c - 50))
            if c == 57:
                self.putb([15, ['Year: %d' % bcd2int(self.tmp)]])
        elif c == 58:
            # Even parity over date bits (36-58): DCF77 bit 58.
            parity = self.datebits.count(1)
            s = 'OK' if ((parity % 2) == 0) else 'INVALID!'
            self.putx([16, ['Date parity: %s' % s, 'DP: %s' % s]])
            self.datebits = []
        else:
            raise Exception('Invalid DCF77 bit: %d' % c)
Exemple #41
0
 def handle_reg_0x04(self, b): # Hours
     self.putr(7)
     self.putr(6)
     h = self.hours = bcd2int(b & 0x3f)
     self.putd(5, 0, [4, ['Hour: %d' % h, 'H: %d' % h, 'H']])
Exemple #42
0
 def handle_reg_0x05(self, b): # Days
     self.putr(7)
     self.putr(6)
     d = self.days = bcd2int(b & 0x3f)
     self.putd(5, 0, [5, ['Day: %d' % d, 'D: %d' % d, 'D']])
Exemple #43
0
 def handle_reg_0x06(self, b): # Weekdays
     for i in (7, 6, 5, 4, 3):
         self.putr(i)
     w = self.weekdays = bcd2int(b & 0x07)
     self.putd(2, 0, [6, ['Weekday: %d' % w, 'WD: %d' % w, 'WD', 'W']])
Exemple #44
0
 def handle_reg_0x08(self, b): # Years
     y = self.years = bcd2int(b & 0xff)
     self.putx([8, ['Year: %d' % y, 'Y: %d' % y, 'Y']])