Пример #1
0
 def getMacroFromIndirect(offset):
   if offset > 0:
     indirect_ptr = recorded_indirects.get(offset)
     if indirect_ptr is None:
       indirect_ptr = utils.merge_bytes(memoryBuffer[offset+1:offset+3])
       recorded_indirects[offset] = indirect_ptr
     recorded_indirects[offset] = indirect_ptr
     return indirect_ptr
   return None
Пример #2
0
  def fromByteCode(cls, memoryBuffer):
    macro_initiator_table_offset = utils.merge_bytes(memoryBuffer[0:2])
    sunrise_sunset_table_offset = utils.merge_bytes(memoryBuffer[2:4])

    self = cls(dict())
    self.sunrise_sunset_resolution = memoryBuffer[4]
    self.dst_data = codec.DST_DAYS.decode(memoryBuffer, 5)
    tranceivedHousecodes = codec.HOUSECODE_MASK.decode(memoryBuffer, 9)
    self.tranceivedHousecodes = [k for k,v in tranceivedHousecodes.iteritems() if v != 0]
    self.timer_initiators = []

    ptr = 0x19
    first_indirect_ptr = 0xffff
    while (macro_initiator_table_offset - ptr) > codec.TIMER_INITIATOR.codelength:
      t = TimerInitiator.fromByteCode(memoryBuffer, ptr)
      self.timer_initiators.append(t)
      for p in t.start_macro_ptr, t.stop_macro_ptr:
        if p > 0:
          first_indirect_ptr = min(first_indirect_ptr, p)
      ptr += t.codelength
      ptr += 1
      if (first_indirect_ptr - ptr) < codec.TIMER_INITIATOR.codelength: 
        break

    ptr = macro_initiator_table_offset+1
    self.macro_initiators = []
    while memoryBuffer.peek(ptr+2) != 0xff:
      mi = MacroInitiator.fromByteCode(memoryBuffer, ptr)
      self.macro_initiators.append(mi)
      ptr += mi.codelength
      ptr += 1
      
    self.macro_chains = []
    for m in self.macro_initiators:
      self.macro_chains.append(MacroChain.fromByteCode(memoryBuffer, m.macro_ptr))

    recorded_indirects = {}
    recorded_macros = {}

    def getMacroFromIndirect(offset):
      if offset > 0:
        indirect_ptr = recorded_indirects.get(offset)
        if indirect_ptr is None:
          indirect_ptr = utils.merge_bytes(memoryBuffer[offset+1:offset+3])
          recorded_indirects[offset] = indirect_ptr
        recorded_indirects[offset] = indirect_ptr
        return indirect_ptr
      return None

    for i,t in enumerate(self.timer_initiators):
      for k in ["start_macro_ptr", "stop_macro_ptr"]:
        m_ptr = getMacroFromIndirect(vars(t)[k])
        if m_ptr is not None:
          vars(t)[k.replace("_ptr", "_id")] = m_ptr
          m = recorded_macros.get(m_ptr)
          if m is None:
            m = MacroChain.fromByteCode(memoryBuffer, m_ptr)
            recorded_macros[m_ptr] = m
            self.macro_chains.append(m)

    end_day = 0
    ptr = sunrise_sunset_table_offset
    self.sunrise_sunset_times = []
    while end_day < 366 :
      sunrise_sunset_time = codec.DAWN_DUSK_ENTRY.decode(memoryBuffer, ptr)
      self.sunrise_sunset_times.append(sunrise_sunset_time)
      ptr += codec.DAWN_DUSK_ENTRY.codelength
      end_day += self.sunrise_sunset_resolution

    return self