Exemple #1
0
    def connect(self):
        if self.connected:
            return

        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id, offset=Length(
                    0)),  # TODO offset size
                length=FirmwareVersionFile().length))))

        if self.skip_alp_parsing:
            self.log.info(
                "Running in skip_alp_parsing mode, not checking if we can receive the modem's UID"
            )
            self.connected = True
            self.execute_command_async(read_modem_info_action)
            return True

        resp_cmd = self.execute_command(read_modem_info_action,
                                        timeout_seconds=10)

        if len(resp_cmd) == 0:
            self.log.warning("Timed out reading node information")
            return False

        for action in resp_cmd[0].actions:
            if type(action) is RegularAction and type(
                    action.operation) is ReturnFileData:
                if action.operand.offset.id == SystemFileIds.UID.value:
                    self.uid = '{:x}'.format(
                        struct.unpack(">Q",
                                      str(bytearray(action.operand.data)))[0])
                if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                    self.firmware_version = FirmwareVersionFile.parse(
                        ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
            self.connected = True

        if self.connected:
            self.log.info(
                "connected to {}, node UID {} running D7AP v{}, application \"{}\" with git sha1 {}"
                .format(self.config["device"], self.uid,
                        self.firmware_version.d7ap_version,
                        self.firmware_version.application_name,
                        self.firmware_version.git_sha1))
            return True
        else:
            return False
    def test_byte_generation(self):
        expected = [
            1,
            1,  # D7AP v1.1
            0x74,
            0x68,
            0x72,
            0x6f,
            0x75,
            0x67,  # app name: throug(hput_test)
            0x39,
            0x61,
            0x61,
            0x62,
            0x66,
            0x61,
            0x61  # git sha1
        ]

        bytes = bytearray(
            FirmwareVersionFile(d7a_protocol_version_major=1,
                                d7a_protocol_version_minor=1,
                                application_name="throug",
                                git_sha1="9aabfaa"))
        self.assertEqual(len(bytes), 15)
        for i in xrange(len(bytes)):
            self.assertEqual(bytes[i], expected[i])
class SystemFiles:
    files = {
        SystemFileIds.UID: UidFile(),
        SystemFileIds.FIRMWARE_VERSION: FirmwareVersionFile(),
        SystemFileIds.DLL_CONFIG: DllConfigFile(),
        SystemFileIds.ACCESS_PROFILE_0: AccessProfileFile(access_specifier=0),
        SystemFileIds.ACCESS_PROFILE_1: AccessProfileFile(access_specifier=1),
        SystemFileIds.ACCESS_PROFILE_2: AccessProfileFile(access_specifier=2),
        SystemFileIds.ACCESS_PROFILE_3: AccessProfileFile(access_specifier=3),
        SystemFileIds.ACCESS_PROFILE_4: AccessProfileFile(access_specifier=4),
        SystemFileIds.ACCESS_PROFILE_5: AccessProfileFile(access_specifier=5),
        SystemFileIds.ACCESS_PROFILE_6: AccessProfileFile(access_specifier=6),
        SystemFileIds.ACCESS_PROFILE_7: AccessProfileFile(access_specifier=7),
        SystemFileIds.ACCESS_PROFILE_8: AccessProfileFile(access_specifier=8),
        SystemFileIds.ACCESS_PROFILE_9: AccessProfileFile(access_specifier=9),
        SystemFileIds.ACCESS_PROFILE_10:
        AccessProfileFile(access_specifier=10),
        SystemFileIds.ACCESS_PROFILE_11:
        AccessProfileFile(access_specifier=11),
        SystemFileIds.ACCESS_PROFILE_12:
        AccessProfileFile(access_specifier=12),
        SystemFileIds.ACCESS_PROFILE_13:
        AccessProfileFile(access_specifier=13),
        SystemFileIds.ACCESS_PROFILE_14:
        AccessProfileFile(access_specifier=14),
    }

    def get_all_system_files(self):
        return sorted(self.files, key=lambda t: t.value)
Exemple #4
0
    def _connect_serial_modem(self):
        self.dev = serial.Serial(
            port=self.config["device"],
            baudrate=self.config["baudrate"],
            timeout=None,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            bytesize=serial.EIGHTBITS,
            xonxoff=False,
            rtscts=False,
            dsrdtr=False,
            exclusive=True,
        )

        self.dev.flush()  # ignore possible buffered data
        self.start_reading()
        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id, offset=Length(
                    0)),  # TODO offset size
                length=FirmwareVersionFile().length))))

        resp_cmd = self.execute_command(read_modem_info_action,
                                        timeout_seconds=60)

        if len(resp_cmd) == 0:
            self.log.warning("Timed out reading node information")
            return False

        for action in resp_cmd[0].actions:
            if type(action) is RegularAction and type(
                    action.operation) is ReturnFileData:
                if action.operand.offset.id == SystemFileIds.UID.value:
                    self.uid = '{:x}'.format(
                        struct.unpack(">Q", bytearray(action.operand.data))[0])
                if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                    self.firmware_version = FirmwareVersionFile.parse(
                        ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
            return True

        return False
    def _connect_serial_modem(self):
        self.dev = serial.Serial(
            port=self.config["device"],
            baudrate=self.config["baudrate"],
            timeout=0.5,
        )

        read_modem_info_action = Command.create_with_read_file_action_system_file(
            UidFile())
        read_modem_info_action.add_action(
            RegularAction(operation=ReadFileData(operand=DataRequest(
                offset=Offset(id=FirmwareVersionFile().id,
                              offset=0),  # TODO offset size
                length=FirmwareVersionFile().length))))

        self.send_command(read_modem_info_action)

        # read thread not yet running here, read sync
        start_time = datetime.now()
        timeout = False
        while not timeout:
            commands, info = self.read()
            for command in commands:
                for action in command.actions:
                    if type(action) is RegularAction and type(
                            action.operation) is ReturnFileData:
                        if action.operand.offset.id == SystemFileIds.UID.value:
                            self.uid = '{:x}'.format(
                                struct.unpack(">Q",
                                              bytearray(
                                                  action.operand.data))[0])
                        if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                            self.firmware_version = FirmwareVersionFile.parse(
                                ConstBitStream(bytearray(action.operand.data)))

                if self.uid and self.firmware_version:
                    return True

            if (datetime.now() - start_time).total_seconds() > 2:
                timeout = True
                self.log("Timed out reading node information")

        return False
  def test_parsing(self):
    file_contents = [
      1, 1,                                         # D7AP v1.1
      0x74, 0x68, 0x72, 0x6f, 0x75, 0x67,           # app name: throug(hput_test)
      0x39, 0x61, 0x61, 0x62, 0x66, 0x61, 0x61      # git sha1
     ]

    f = FirmwareVersionFile.parse(ConstBitStream(bytes=file_contents))
    self.assertEqual(f.d7a_protocol_version_major, 1)
    self.assertEqual(f.d7a_protocol_version_minor, 1)
    self.assertEqual(f.application_name, "throug")
    self.assertEqual(f.git_sha1, "9aabfaa")
Exemple #7
0
  def _connect_serial_modem(self):
    self.dev = serial.Serial(
      port     = self.config["device"],
      baudrate = self.config["baudrate"],
      timeout  = 0.5,
    )

    read_modem_info_action = Command.create_with_read_file_action_system_file(UidFile())
    read_modem_info_action.add_action(
      RegularAction(
        operation=ReadFileData(
          operand=DataRequest(
            offset=Offset(id=FirmwareVersionFile().id, offset=0),  # TODO offset size
            length=FirmwareVersionFile().length
          )
        )
      )
    )

    self.send_command(read_modem_info_action)

    # read thread not yet running here, read sync
    start_time = datetime.now()
    timeout = False
    while not timeout:
      commands, info = self.read()
      for command in commands:
        for action in command.actions:
          if type(action) is RegularAction and type(action.operation) is ReturnFileData:
              if action.operand.offset.id == SystemFileIds.UID.value:
                self.uid = struct.unpack(">Q", bytearray(action.operand.data))[0]
              if action.operand.offset.id == SystemFileIds.FIRMWARE_VERSION.value:
                self.firmware_version = FirmwareVersionFile.parse(ConstBitStream(bytearray(action.operand.data)))

        if self.uid and self.firmware_version:
          return True

      if (datetime.now() - start_time).total_seconds() > 2:
        timeout = True
        self.log("Timed out reading node information")

    return False
    def test_parsing(self):
        file_contents = [
            1,
            1,  # D7AP v1.1
            0x74,
            0x68,
            0x72,
            0x6f,
            0x75,
            0x67,  # app name: throug(hput_test)
            0x39,
            0x61,
            0x61,
            0x62,
            0x66,
            0x61,
            0x61  # git sha1
        ]

        f = FirmwareVersionFile.parse(ConstBitStream(bytes=file_contents))
        self.assertEqual(f.d7a_protocol_version_major, 1)
        self.assertEqual(f.d7a_protocol_version_minor, 1)
        self.assertEqual(f.application_name, "throug")
        self.assertEqual(f.git_sha1, "9aabfaa")
 def test_default_constructor(self):
     f = FirmwareVersionFile()
     self.assertEqual(f.d7a_protocol_version_major, 0)
     self.assertEqual(f.d7a_protocol_version_minor, 0)
     self.assertEqual(f.application_name, "")
     self.assertEqual(f.git_sha1, "")
 def bad():
     FirmwareVersionFile(application_name="toolongname")  # can be max 6
Exemple #11
0
class SystemFiles:
    files = {
        SystemFileIds.UID:
        UidFile(),
        SystemFileIds.FACTORY_SETTINGS:
        FactorySettingsFile(),
        SystemFileIds.FIRMWARE_VERSION:
        FirmwareVersionFile(),
        SystemFileIds.DEVICE_CAPACITY:
        NotImplementedFile(SystemFileIds.DEVICE_CAPACITY.value, 19),
        SystemFileIds.DEVICE_STATUS:
        NotImplementedFile(SystemFileIds.DEVICE_STATUS, 9),
        SystemFileIds.ENGINEERING_MODE:
        EngineeringModeFile(),
        SystemFileIds.VID:
        VidFile(),
        SystemFileIds.RFU_07:
        NotImplementedFile(SystemFileIds.RFU_07, 0),
        SystemFileIds.PHY_CONFIG:
        NotImplementedFile(SystemFileIds.PHY_CONFIG, 9),
        SystemFileIds.PHY_STATUS:
        NotImplementedFile(SystemFileIds.PHY_STATUS,
                           24),  # TODO assuming 3 channels for now
        SystemFileIds.DLL_CONFIG:
        DllConfigFile(),
        SystemFileIds.DLL_STATUS:
        NotImplementedFile(SystemFileIds.DLL_STATUS, 12),
        SystemFileIds.NWL_ROUTING:
        NotImplementedFile(SystemFileIds.NWL_ROUTING,
                           1),  # TODO variable routing table
        SystemFileIds.NWL_SECURITY:
        NotImplementedFile(SystemFileIds.NWL_SECURITY, 5),
        SystemFileIds.NWL_SECURITY_KEY:
        SecurityKeyFile(),
        SystemFileIds.NWL_SSR:
        NotImplementedFile(SystemFileIds.NWL_SSR,
                           4),  # TODO 0 recorded devices
        SystemFileIds.NWL_STATUS:
        NotImplementedFile(SystemFileIds.NWL_STATUS, 20),
        SystemFileIds.TRL_STATUS:
        NotImplementedFile(SystemFileIds.TRL_STATUS, 1),  # TODO 0 TRL records
        SystemFileIds.SEL_CONFIG:
        NotImplementedFile(SystemFileIds.SEL_CONFIG, 6),
        SystemFileIds.FOF_STATUS:
        NotImplementedFile(SystemFileIds.FOF_STATUS, 10),
        SystemFileIds.RFU_14:
        NotImplementedFile(SystemFileIds.RFU_14, 0),
        SystemFileIds.RFU_15:
        NotImplementedFile(SystemFileIds.RFU_15, 0),
        SystemFileIds.RFU_16:
        NotImplementedFile(SystemFileIds.RFU_16, 0),
        SystemFileIds.LOCATION_DATA:
        NotImplementedFile(SystemFileIds.LOCATION_DATA,
                           1),  # TODO 0 recorded locations
        SystemFileIds.D7AALP_RFU_18:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_18, 0),
        SystemFileIds.D7AALP_RFU_19:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_19, 0),
        SystemFileIds.D7AALP_RFU_1A:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1A, 0),
        SystemFileIds.D7AALP_RFU_1B:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1B, 0),
        SystemFileIds.D7AALP_RFU_1C:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1C, 0),
        SystemFileIds.D7AALP_RFU_1D:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1D, 0),
        SystemFileIds.D7AALP_RFU_1E:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1E, 0),
        SystemFileIds.D7AALP_RFU_1F:
        NotImplementedFile(SystemFileIds.D7AALP_RFU_1F, 0),
        SystemFileIds.ACCESS_PROFILE_0:
        AccessProfileFile(access_specifier=0),
        SystemFileIds.ACCESS_PROFILE_1:
        AccessProfileFile(access_specifier=1),
        SystemFileIds.ACCESS_PROFILE_2:
        AccessProfileFile(access_specifier=2),
        SystemFileIds.ACCESS_PROFILE_3:
        AccessProfileFile(access_specifier=3),
        SystemFileIds.ACCESS_PROFILE_4:
        AccessProfileFile(access_specifier=4),
        SystemFileIds.ACCESS_PROFILE_5:
        AccessProfileFile(access_specifier=5),
        SystemFileIds.ACCESS_PROFILE_6:
        AccessProfileFile(access_specifier=6),
        SystemFileIds.ACCESS_PROFILE_7:
        AccessProfileFile(access_specifier=7),
        SystemFileIds.ACCESS_PROFILE_8:
        AccessProfileFile(access_specifier=8),
        SystemFileIds.ACCESS_PROFILE_9:
        AccessProfileFile(access_specifier=9),
        SystemFileIds.ACCESS_PROFILE_10:
        AccessProfileFile(access_specifier=10),
        SystemFileIds.ACCESS_PROFILE_11:
        AccessProfileFile(access_specifier=11),
        SystemFileIds.ACCESS_PROFILE_12:
        AccessProfileFile(access_specifier=12),
        SystemFileIds.ACCESS_PROFILE_13:
        AccessProfileFile(access_specifier=13),
        SystemFileIds.ACCESS_PROFILE_14:
        AccessProfileFile(access_specifier=14)
    }

    def get_all_system_files(self):
        return sorted(self.files, key=lambda t: t.value)