py9b/command/regio: fix write command on ninebot > 0301

Somewhere between ESC 0301 and 0401 response format for write command
has changed and is much more similar to that of xiaomi - arg contains
register address and single response data byte is a write result. This
is behaviour that matches description in nbdocs.pdf on scooterhacking
wiki.
legit-fork
informatic 2019-10-22 14:48:01 +02:00
parent d81cec2ee7
commit f8ba5ef4ee
1 changed files with 19 additions and 8 deletions

View File

@ -50,14 +50,25 @@ class WriteRegs(BaseCommand):
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
elif response.cmd == 0x05: # ninebot style
if len(response.data) != 0:
raise InvalidResponse(
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
if response.arg != 0:
raise WriteProtectError(
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
if len(response.data) == 0:
# firmware < 0401
if response.arg != 0:
raise WriteProtectError(
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
elif len(response.data) == 1:
# firmware >= 0401
if response.arg != self.reg:
raise InvalidResponse(
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
if response.data[0] != 0:
raise WriteProtectError(
"WriteRegs {0:X}:{1:X}".format(self.dev, self.reg)
)
else:
raise InvalidResponse("WriteRegs {0:X}:{1:X}".format(self.dev, self.reg))
else:
raise InvalidResponse("WriteRegs {0:X}:{1:X}".format(self.dev, self.reg))
return True