LoRa_APRS_iGate/HIL/esp_dut.py

117 wiersze
3.9 KiB
Python
Czysty Zwykły widok Historia

2021-09-18 21:07:13 +00:00
import os
import pytest
import serial
2021-11-07 20:27:07 +00:00
import logging
import json
import tempfile
2022-11-10 22:00:57 +00:00
import pigpio
2022-11-10 22:11:00 +00:00
import time
from pathlib import Path
2021-09-25 19:24:33 +00:00
from HIL.common import runProcess
2021-09-18 21:07:13 +00:00
2021-11-07 20:27:07 +00:00
logger = logging.getLogger(__name__)
2021-09-18 21:07:13 +00:00
class EspFlash:
def __init__(self, port):
self._pio_package_path = Path('$HOME') / '.platformio' / 'packages'
self._port = port
logger.info(f"pio package path: {self._pio_package_path}")
logger.info(f"port: {self._port}")
2021-09-18 21:07:13 +00:00
def runESPTool(self, cmd):
esp_tool = self._pio_package_path / 'tool-esptoolpy' / 'esptool.py'
2021-09-18 21:07:13 +00:00
runProcess(
f"/usr/bin/python3 {esp_tool} --chip esp32 --port {self._port} {cmd}")
2021-09-18 21:07:13 +00:00
def erase(self):
2021-11-07 20:27:07 +00:00
logger.info("erase flash")
2021-09-18 21:07:13 +00:00
self.runESPTool("erase_flash")
def write(self, addr, bin_file):
2021-11-07 20:27:07 +00:00
logger.info(f"write flash on addr {addr} with file {bin_file}")
2021-09-18 21:07:13 +00:00
self.runESPTool(
f"--baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_size detect {addr} {bin_file}")
def verify(self, addr, bin_file):
2021-11-07 20:27:07 +00:00
logger.info(f"verify flash on addr {addr} with file {bin_file}")
2021-09-18 21:07:13 +00:00
self.runESPTool(
f"--baud 460800 --before default_reset --after hard_reset verify_flash --flash_mode dio --flash_size detect {addr} {bin_file}")
def make_spiffs(self, fs_path, fs_bin):
2021-11-07 20:27:07 +00:00
logger.info(f"make spiffs, fs_path: {fs_path}, fs_bin: {fs_bin}")
mkspiffs_espressif32_arduino = self._pio_package_path / \
'tool-mkspiffs' / 'mkspiffs_espressif32_arduino'
2021-09-22 18:08:53 +00:00
runProcess(
f"{mkspiffs_espressif32_arduino} -c {fs_path} -p 256 -b 4096 -s 1507328 {fs_bin}")
class EspConfig:
def __init__(self, path, filename):
self.filename = filename
logger.info(f"reading config from: {path}/{self.filename}")
with open(path / self.filename) as json_file:
self.data = json.load(json_file)
logger.info(f"was reading this data: {self.data}")
def writeFile(self):
tmpdirname = tempfile.TemporaryDirectory()
logger.info(f"writing this data: {self.data}")
with open(Path(tmpdirname.name) / self.filename, 'w') as outfile:
json.dump(self.data, outfile)
return tmpdirname
2021-09-18 21:07:13 +00:00
class EspDut:
2022-11-10 22:00:57 +00:00
def __init__(self, port, configPath, configFile, powerPin):
2021-09-18 21:07:13 +00:00
self.port = port
2021-11-07 20:27:07 +00:00
self.baudrate = 115200
2021-09-18 21:07:13 +00:00
self.serial = None
self.flash = EspFlash(self.port)
self.config = EspConfig(configPath, configFile)
2022-11-10 22:00:57 +00:00
self.pigpio = pigpio.pi()
self.powerPin = powerPin
self.pigpio.set_mode(self.powerPin, pigpio.OUTPUT)
2022-11-10 22:02:27 +00:00
def begin(self):
2022-11-10 22:03:38 +00:00
self.pigpio.write(self.powerPin, 1)
2022-11-10 22:11:00 +00:00
time.sleep(1)
2022-11-10 22:00:57 +00:00
2022-11-10 22:02:27 +00:00
def stop(self):
2022-11-10 22:03:38 +00:00
self.pigpio.write(self.powerPin, 0)
2022-11-10 22:11:00 +00:00
time.sleep(1)
2021-09-18 21:07:13 +00:00
2021-09-22 17:24:31 +00:00
def writeFlash(self, bin_dir):
2021-11-07 20:27:07 +00:00
logger.info("write flash")
2021-09-18 21:07:13 +00:00
self.flash.erase()
self.flash.write("0x1000", bin_dir / 'bootloader_dio_40m.bin')
self.flash.write("0x8000", bin_dir / 'partitions.bin')
self.flash.write("0xe000", bin_dir / 'boot_app0.bin')
self.flash.write("0x10000", bin_dir / 'firmware.bin')
2021-09-18 21:07:13 +00:00
def writeConfig(self):
2021-11-07 20:27:07 +00:00
logger.info("write config")
2021-09-22 17:24:31 +00:00
fs_bin = "spiffs.bin"
fs_path = self.config.writeFile()
self.flash.make_spiffs(fs_path.name, fs_bin)
2021-09-22 17:24:31 +00:00
self.flash.write("0x290000", fs_bin)
2021-09-18 21:07:13 +00:00
def openPort(self):
2021-11-07 20:27:07 +00:00
logger.info(f"open port: {self.port}, baudrate: {self.baudrate}")
self.serial = serial.Serial(
self.port, baudrate=self.baudrate, timeout=0)
2021-09-18 21:07:13 +00:00
def getLine(self):
return self.serial.readline()
def closePort(self):
if self.serial:
self.serial.close()
self.serial = None
@pytest.fixture
def ESP():
2022-11-10 22:00:57 +00:00
return EspDut(os.environ["ESP_PORT"], Path(os.environ["ESP_CONFIG_PATH"]), Path(os.environ["ESP_CONFIG_FILE"]), 13)