+ # State machine.
+ if (self.lnk_event == "RESET"):
+ self.net_state = "COMMAND"
+ self.net_search = "P"
+ self.net_cnt = 0
+ elif (self.net_state == "IDLE"):
+ pass
+ elif (self.net_state == "COMMAND"):
+ # Receiving and decoding a ROM command
+ if (self.onewire_collect(8)):
+ self.put(self.net_beg, self.net_len, self.out_ann, [ANN_NETWORK,
+ ['ROM COMMAND: 0x%02x \'%s\'' % (self.net_data, rom_command[self.net_data])]])
+ if (self.net_data == 0x33): # READ ROM
+ self.net_state = "GET ROM"
+ elif (self.net_data == 0x0f): # CONDITIONAL READ ROM
+ self.net_state = "GET ROM"
+ elif (self.net_data == 0xcc): # SKIP ROM
+ self.net_state = "TRANSPORT"
+ elif (self.net_data == 0x55): # MATCH ROM
+ self.net_state = "GET ROM"
+ elif (self.net_data == 0xf0): # SEARCH ROM
+ self.net_state = "SEARCH ROM"
+ elif (self.net_data == 0xec): # CONDITIONAL SEARCH ROM
+ self.net_state = "SEARCH ROM"
+ elif (self.net_data == 0x3c): # OVERDRIVE SKIP ROM
+ self.lnk_overdrive = 1
+ self.net_state = "TRANSPORT"
+ elif (self.net_data == 0x69): # OVERDRIVE MATCH ROM
+ self.lnk_overdrive = 1
+ self.net_state = "GET ROM"
+ elif (self.net_state == "GET ROM"):
+ # A 64 bit device address is selected
+ # family code (1B) + serial number (6B) + CRC (1B)
+ if (self.onewire_collect(64)):
+ self.net_rom = self.net_data & 0xffffffffffffffff
+ self.put(self.net_beg, self.net_len, self.out_ann, [ANN_NETWORK, ['ROM: 0x%016x' % self.net_rom]])
+ self.net_state = "TRANSPORT"
+ elif (self.net_state == "SEARCH ROM"):
+ # A 64 bit device address is searched for
+ # family code (1B) + serial number (6B) + CRC (1B)
+ if (self.onewire_search(64)):
+ self.net_rom = self.net_data & 0xffffffffffffffff
+ self.put(self.net_beg, self.net_len, self.out_ann, [ANN_NETWORK, ['ROM: 0x%016x' % self.net_rom]])
+ self.net_state = "TRANSPORT"
+ elif (self.net_state == "TRANSPORT"):
+ # The transport layer is handled in byte sized units
+ if (self.onewire_collect(8)):
+ self.put(self.net_beg, self.net_len, self.out_ann, [ANN_NETWORK , ['TRANSPORT: 0x%02x' % self.net_data]])
+ self.put(self.net_beg, self.net_len, self.out_ann, [ANN_TRANSPORT, ['TRANSPORT: 0x%02x' % self.net_data]])
+ self.put(self.net_beg, self.net_len, self.out_proto, ['transfer', self.net_data])
+ # TODO: Sending translort layer data to 1-Wire device models
+ else:
+ raise Exception('Invalid net_state: %s' % self.net_state)