py9b/py9b/command/regio.py

37 lines
1.2 KiB
Python

from struct import pack, unpack, calcsize
from .base import BaseCommand, InvalidResponse
class ReadRegs(BaseCommand):
def __init__(self, dev, reg, format):
super(ReadRegs, self).__init__(dst=dev, cmd=0x01, arg=reg, data=pack("<B", calcsize(format)), has_response=True)
self.dev = dev
self.reg = reg
self.format = format
def handle_response(self, response):
if response.arg!=self.reg or len(response.data)!=calcsize(self.format):
raise InvalidResponse("ReadRegs {0:X}:{1:X}".format(self.dev, self.reg))
return unpack(self.format, response.data)
class WriteProtectError(Exception):
pass
class WriteRegs(BaseCommand):
def __init__(self, dev, reg, format, *args):
super(WriteRegs, self).__init__(dst=dev, cmd=0x02, arg=reg, data=pack(format, *args), has_response=True)
self.dev = dev
self.reg = reg
def handle_response(self, response):
if response.arg!=self.reg or len(response.data)!=1:
raise InvalidResponse("WriteRegs {0:X}:{1:X}".format(self.dev, self.reg))
if unpack("<B", response.data)[0]!=1:
raise WriteProtectError("WriteRegs {0:X}:{1:X}".format(self.dev, self.reg))
return True
__all__=["ReadRegs", "WriteRegs", "WriteProtectError"]