Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/infuse_iot/generated/rpc_definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,25 @@ class response(VLACompatLittleEndianStruct):
_pack_ = 1


class data_logger_erase:
"""Erase all data from a data logger"""

HELP = "Erase all data from a data logger"
DESCRIPTION = "Erase all data from a data logger"
COMMAND_ID = 18

class request(VLACompatLittleEndianStruct):
_fields_ = [
("logger", ctypes.c_uint8),
("erase_empty", ctypes.c_uint8),
]
_pack_ = 1

class response(VLACompatLittleEndianStruct):
_fields_ = []
_pack_ = 1


class lte_at_cmd:
"""Run AT command against LTE modem"""

Expand Down
41 changes: 41 additions & 0 deletions src/infuse_iot/rpc_wrappers/data_logger_erase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env python3

import infuse_iot.generated.rpc_definitions as defs
from infuse_iot.commands import InfuseRpcCommand
from infuse_iot.zephyr.errno import errno


class data_logger_erase(InfuseRpcCommand, defs.data_logger_erase):
@classmethod
def add_parser(cls, parser):
logger = parser.add_mutually_exclusive_group(required=True)
logger.add_argument("--onboard", action="store_true", help="Onboard flash logger")
logger.add_argument("--removable", action="store_true", help="Removable flash logger (SD)")
parser.add_argument(
"--erase-all",
action="store_true",
help="Erase entire address space, not just written blocks",
)

def __init__(self, args):
self.infuse_id = args.id
if args.onboard:
self.logger = defs.rpc_enum_data_logger.FLASH_ONBOARD
elif args.removable:
self.logger = defs.rpc_enum_data_logger.FLASH_REMOVABLE
else:
raise NotImplementedError
self.erase_all = 1 if args.erase_all else 0

def request_struct(self):
return self.request(self.logger, self.erase_all)

def request_json(self):
return {"logger": self.logger.name, "erase_empty": self.erase_all}

def handle_response(self, return_code, _response):
if return_code != 0:
print(f"Failed to erase data logger ({errno.strerror(-return_code)})")
return

print("Data logger erased")
11 changes: 7 additions & 4 deletions src/infuse_iot/serial_comms.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,14 @@ def close(self):
class SerialPort(SerialLike):
"""Serial Port handling"""

def __init__(self, serial_port):
def __init__(self, serial_port, baudrate=115200):
self._ser = serial.Serial()
self._ser.port = str(serial_port)
self._ser.baudrate = 115200
self._ser.baudrate = baudrate
self._ser.timeout = 0.05
# Prepend leading 0's for high baudrates to give sleepy
# receivers (STM32) time to wake up on RX before real data arrives.
self._prefix = b"\x00\x00" if baudrate > 115200 else b""

def open(self):
self._ser.open()
Expand All @@ -79,12 +82,12 @@ def read_bytes(self, num):
return self._ser.read(num)

def ping(self):
self._ser.write(SerialFrame.SYNC + b"\x01\x00" + b"\x4d")
self._ser.write(self._prefix + SerialFrame.SYNC + b"\x01\x00" + b"\x4d")
self._ser.flush()

def write(self, packet: bytes):
# Add header
pkt = SerialFrame.SYNC + len(packet).to_bytes(2, "little") + packet
pkt = self._prefix + SerialFrame.SYNC + len(packet).to_bytes(2, "little") + packet
# Write packet to serial port
self._ser.write(pkt)
self._ser.flush()
Expand Down
11 changes: 9 additions & 2 deletions src/infuse_iot/tools/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io
import queue
import random
import sys
import threading
import time
from collections.abc import Callable
Expand Down Expand Up @@ -48,6 +49,7 @@
)
from infuse_iot.util.argparse import ValidFile
from infuse_iot.util.console import Console
from infuse_iot.util.os import is_wsl
from infuse_iot.util.threading import SignaledThread


Expand Down Expand Up @@ -375,8 +377,10 @@ class SubCommand(InfuseCommand):

@classmethod
def add_parser(cls, parser):
# COM ports are not valid files
serial_type = str if sys.platform == "win32" else ValidFile
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--serial", type=ValidFile, help="Gateway serial port")
group.add_argument("--serial", type=serial_type, help="Gateway serial port")
group.add_argument("--rtt", type=str, help="RTT serial port")
group.add_argument("--pyocd", type=str, help="RTT via PyOCD")
parser.add_argument(
Expand All @@ -394,11 +398,14 @@ def add_parser(cls, parser):
type=argparse.FileType("w"),
help="Save serial output to file",
)
parser.add_argument("--baud", type=int, default=115200, help="Baudrate for serial port")

def __init__(self, args: argparse.Namespace):
self.port: SerialLike
if args.serial is not None:
self.port = SerialPort(args.serial)
if is_wsl() and args.baud > 115200:
Console.log_info("High baudrates can result in dropped data on WSL (from USB passthrough)")
self.port = SerialPort(args.serial, args.baud)
elif args.rtt is not None:
self.port = RttPort(args.rtt)
elif args.pyocd is not None:
Expand Down
5 changes: 5 additions & 0 deletions src/infuse_iot/util/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ def log_info(message):
"""Log info message to terminal"""
Console.log(datetime.datetime.now(), colorama.Fore.MAGENTA, message)

@staticmethod
def log_text(message):
"""Log text to terminal"""
Console.log(datetime.datetime.now(), colorama.Fore.RESET, message)

@staticmethod
def log_tx(data_type, length, prefix=""):
"""Log transmitted packet to terminal"""
Expand Down
12 changes: 12 additions & 0 deletions src/infuse_iot/util/os.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env python3

import functools
import platform


@functools.cache
def is_wsl(v: str = platform.uname().release) -> bool:
"""
Are we running under WSL?
"""
return v.endswith("-Microsoft") or v.endswith("microsoft-standard-WSL2")