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
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