Source code for ents.proto.esp32
from google.protobuf import message
from google.protobuf.json_format import MessageToDict
from .soil_power_sensor_pb2 import Esp32Command, PageCommand, TestCommand, WiFiCommand
[docs]
def encode_esp32command(cmd_type: str, **kwargs) -> bytes:
"""Encodes a command for the esp32
Args:
cmd: Type of command to encode
**kwargs: See other encode functions
Returns:
Bytes of protobuf serialized message
"""
cmd = Esp32Command()
if cmd_type == "page":
page_cmd = encode_page_command(**kwargs)
cmd.page_command.CopyFrom(page_cmd)
elif cmd_type == "test":
test_cmd = encode_test_command(**kwargs)
cmd.test_command.CopyFrom(test_cmd)
elif cmd_type == "wifi":
wifi_cmd = encode_wifi_command(**kwargs)
cmd.wifi_command.CopyFrom(wifi_cmd)
else:
raise NotImplementedError(f"Command type {cmd_type} not implemented!")
return cmd.SerializeToString()
[docs]
def encode_page_command(req: str, fd: int, bs: int = 0, n: int = 0) -> message:
"""Encodes a command for memory paging
Args:
req: Page request type
fd: File descriptor
bs: Block size
n: Number of bytes
Return:
PageCommand message
Raises:
NotImplementedError: When page request type does not exist
"""
# look up table to request types
req_lut = {
"open": PageCommand.RequestType.OPEN,
"close": PageCommand.RequestType.CLOSE,
"read": PageCommand.RequestType.READ,
"write": PageCommand.RequestType.WRITE,
}
# ensure lower case
req = req.lower()
page_cmd = PageCommand()
try:
page_cmd.file_request = req_lut[req]
except KeyError as exc:
raise NotImplementedError(f"File request type {req} not implemented") from exc
page_cmd.file_descriptor = fd
page_cmd.block_size = bs
page_cmd.num_bytes = n
return page_cmd
[docs]
def encode_test_command(state: str, data: int) -> message:
"""Encodes a command for testing modules library
Valid strings for ``state``:
- ``receive``: Data is received by the module
- ``receive_request``: Data is received by the module, indicating data for
a subsequent request
- ``request``: Data is sent by the module
Args:
state (str): State command string
data (int): Integer to test passing of data
Return:
TestCommand message
Raises:
NotImplementedError: When the ChangeState type does not exist
"""
# look up table for state strings
cs_lut = {
"receive": TestCommand.ChangeState.RECEIVE,
"receive_request": TestCommand.ChangeState.RECEIVE_REQUEST,
"request": TestCommand.ChangeState.REQUEST,
}
# ensure all lower case
state = state.lower()
test_cmd = TestCommand()
try:
test_cmd.state = cs_lut[state]
except KeyError as exc:
raise NotImplementedError(f"State command {state} not implemented") from exc
test_cmd.data = data
return test_cmd
[docs]
def encode_wifi_command(
_type: str,
ssid: str = "",
passwd: str = "",
url: str = "",
port: int = 0,
rc: int = 0,
ts: int = 0,
resp: bytes = b"",
) -> message:
"""Encodes a WiFi command
Valid strings for _type are:
"connect": Connecting to a WiFi network and any other setup
"post": Posting data to the endpoint
Not all arguments are necessary for valid commands.
Args:
_type; Type of request
ssid: WiFi SSID
passwd: WiFi password
url: Endpoint URL
port: Port of webserver
rc: Return code
ts: Timestamp
resp: Binary data response from server
Returns:
WiFiCommand message
Raises:
NotImplementedError: When _type does not exist
"""
# look up table for _type strings
_type_lut = {"connect": WiFiCommand.Type.CONNECT, "post": WiFiCommand.Type.POST}
# ensure all lower case
_type = _type.lower()
wifi_cmd = WiFiCommand()
try:
wifi_cmd.type = _type_lut[_type]
except KeyError as exc:
raise NotImplementedError(f"Type {_type} is not implemented") from exc
wifi_cmd.ssid = ssid
wifi_cmd.passwd = passwd
wifi_cmd.url = url
wifi_cmd.port = port
wifi_cmd.rc = rc
wifi_cmd.ts = ts
wifi_cmd.resp = resp
return wifi_cmd
[docs]
def decode_esp32command(data: bytes) -> dict:
cmd = Esp32Command()
# parse serialized message
cmd.ParseFromString(data)
# return dict
return MessageToDict(cmd, always_print_fields_with_no_presence=True)