using proto enum for types

This commit is contained in:
2024-02-03 03:51:57 +01:00
parent ceba7e5a35
commit 5cc20a3cb4
5 changed files with 35 additions and 25 deletions

2
.gitignore vendored
View File

@@ -2,4 +2,4 @@ build/
venv/ venv/
tools/*_pb2.py tools/*_pb2.py
tools/__pycache__ tools/__pycache__
tools/*.bin tools/**/*.bin

View File

@@ -94,10 +94,10 @@ typedef struct {
message_handler_t message_handlers[] = { message_handler_t message_handlers[] = {
MESSAGE_HANDLER(0xF01, FirmwareStart), MESSAGE_HANDLER(UsbPackageType_FIRMWARESTART, FirmwareStart),
MESSAGE_HANDLER(0xF02, FirmwarePackage), MESSAGE_HANDLER(UsbPackageType_FIRMWAREPACKAGE, FirmwarePackage),
MESSAGE_HANDLER(0xF03, FirmwareDone), MESSAGE_HANDLER(UsbPackageType_FIRMWAREDONE, FirmwareDone),
MESSAGE_HANDLER(0xF04, FirmwarePackageAck), MESSAGE_HANDLER(UsbPackageType_FIRMWAREPACKAGEACK, FirmwarePackageAck),
}; };

View File

@@ -2,6 +2,14 @@ syntax = "proto2";
import "nanopb.proto"; import "nanopb.proto";
enum UsbPackageType {
FIRMWARESTART = 3841; // 0xF01
FIRMWAREPACKAGE = 3842; // 0xF02
FIRMWAREDONE = 3843; // 0xF03
FIRMWAREPACKAGEACK = 3844; // 0xF04
}
message FirmwareStart { message FirmwareStart {
required string name = 1 [(nanopb).max_size = 32]; required string name = 1 [(nanopb).max_size = 32];
required uint32 size = 2; required uint32 size = 2;

View File

@@ -61,7 +61,7 @@ void test_UsbDataHandler(void) {
.crc_fw=START_CRC, .crc_fw=START_CRC,
.device_id=START_DEVICE, .device_id=START_DEVICE,
}; };
transmit_package(0xf01, FirmwareStart_fields, &start); transmit_package(UsbPackageType_FIRMWARESTART, FirmwareStart_fields, &start);
// Call the runner with start message in the queue // Call the runner with start message in the queue
UsbDataHandler_Runner(); UsbDataHandler_Runner();
@@ -69,8 +69,8 @@ void test_UsbDataHandler(void) {
//Put 2 packages in the buffer an parse them //Put 2 packages in the buffer an parse them
transmit_package(0xf01, FirmwareStart_fields, &start); transmit_package(UsbPackageType_FIRMWARESTART, FirmwareStart_fields, &start);
transmit_package(0xf01, FirmwareStart_fields, &start); transmit_package(UsbPackageType_FIRMWARESTART, FirmwareStart_fields, &start);
UsbDataHandler_Runner(); UsbDataHandler_Runner();
UsbDataHandler_Runner(); UsbDataHandler_Runner();
TEST_ASSERT_EQUAL(StartCounter,3); TEST_ASSERT_EQUAL(StartCounter,3);
@@ -85,7 +85,7 @@ void test_UsbDataHandler(void) {
.bytes={0} .bytes={0}
}, },
}; };
transmit_package(0xf02, FirmwarePackage_fields, &pack); transmit_package(UsbPackageType_FIRMWAREPACKAGE, FirmwarePackage_fields, &pack);
UsbDataHandler_Runner(); UsbDataHandler_Runner();
TEST_ASSERT_EQUAL(PackageCounter,1); TEST_ASSERT_EQUAL(PackageCounter,1);
@@ -95,7 +95,7 @@ void test_UsbDataHandler(void) {
.crc_pac = ACK_CRC, .crc_pac = ACK_CRC,
.device_id = ACK_DEVICE, .device_id = ACK_DEVICE,
}; };
transmit_package(0xf04, FirmwarePackageAck_fields, &ack); transmit_package(UsbPackageType_FIRMWAREPACKAGEACK, FirmwarePackageAck_fields, &ack);
UsbDataHandler_Runner(); UsbDataHandler_Runner();
TEST_ASSERT_EQUAL(PackageCounter,1); TEST_ASSERT_EQUAL(PackageCounter,1);
@@ -106,7 +106,7 @@ void test_UsbDataHandler(void) {
.size = DONE_SIZE, .size = DONE_SIZE,
}; };
transmit_package(0xf03, FirmwareDone_fields, &done); transmit_package(UsbPackageType_FIRMWAREDONE, FirmwareDone_fields, &done);
UsbDataHandler_Runner(); UsbDataHandler_Runner();
TEST_ASSERT_EQUAL(DoneCounter,1); TEST_ASSERT_EQUAL(DoneCounter,1);

View File

@@ -1,15 +1,15 @@
import serial import serial
import struct import struct
import time import time
from google.protobuf.internal import encoder import sys
from google.protobuf.internal import decoder
from google.protobuf.message import DecodeError from google.protobuf.message import DecodeError
from serial.tools import list_ports from serial.tools import list_ports
from crccheck.crc import Crc32 from crccheck.crc import Crc
from firmware_pb2 import FirmwareStart, FirmwarePackage, FirmwarePackageAck, FirmwareDone from firmware_pb2 import FirmwareStart, FirmwarePackage, FirmwarePackageAck, FirmwareDone, UsbPackageType
Crc32 = Crc(32,0x04C11DB7,0xffffffff)
def load_firmware(filename): def load_firmware(filename):
# Open the file in binary mode # Open the file in binary mode
@@ -24,15 +24,16 @@ def load_firmware(filename):
return crc, size, packages return crc, size, packages
def make_header(typeid: int, length: int) -> bytearray: def make_header(typeid: UsbPackageType, length: int) -> bytearray:
struct_format = '<HHB' # '<' for little-endian, 'H' for uint16_t, 'B' for uint8_t struct_format = '<HHB' # '<' for little-endian, 'H' for uint16_t, 'B' for uint8_t
# Calculate the check byte as the sum of length and type # Calculate the check byte as the sum of length and type
check = (length & 0xFF) + ((length >> 8) & 0xFF) + (typeid & 0xFF) + ((typeid >> 8) & 0xFF) typeidint = int(typeid)
check = (length & 0xFF) + ((length >> 8) & 0xFF) + (typeidint & 0xFF) + ((typeidint >> 8) & 0xFF)
packed_data = struct.pack(struct_format, length, typeid, check) packed_data = struct.pack(struct_format, length, typeid, check)
return packed_data return packed_data
def send_package(typeid :int, data: bytearray, serial: serial.Serial): def send_package(typeid : UsbPackageType, data: bytearray, serial: serial.Serial):
head = make_header(typeid, len(data)) head = make_header(typeid, len(data))
package = head + data package = head + data
serial.write(package) serial.write(package)
@@ -55,7 +56,7 @@ def receive_ack(serial):
print('Incomplete message') print('Incomplete message')
return None return None
if typeid != 0xf04: if typeid != UsbPackageType.FIRMWAREPACKAGEACK:
return None return None
# Parse the message # Parse the message
@@ -69,6 +70,8 @@ def receive_ack(serial):
return ack return ack
FILENAME = 'firmware.bin' FILENAME = 'firmware.bin'
if len(sys.argv) > 1:
FILENAME = sys.argv[1]
if __name__ == "__main__": if __name__ == "__main__":
@@ -99,8 +102,8 @@ if __name__ == "__main__":
# Send the FirmwareStart message # Send the FirmwareStart message
print(start) print(start)
#send_package(0xf01, start.SerializeToString(), ser) send_package(UsbPackageType.FIRMWARESTART, start.SerializeToString(), ser)
time.sleep(1) # wait for the device to process the message #time.sleep(1) # wait for the device to process the message
# Send the firmware packages # Send the firmware packages
for (i,pack_data) in enumerate(packages): for (i,pack_data) in enumerate(packages):
@@ -113,8 +116,7 @@ if __name__ == "__main__":
# Send the FirmwarePackage message # Send the FirmwarePackage message
print(package) print(package)
print(hex(package.crc_pac)) print(hex(package.crc_pac))
exit(0) send_package(UsbPackageType.FIRMWAREPACKAGE, package.SerializeToString(), ser)
#send_package(0xf02, package.SerializeToString(), ser)
# Wait for the FirmwarePackageAck message # Wait for the FirmwarePackageAck message
@@ -122,7 +124,7 @@ if __name__ == "__main__":
print(ack) print(ack)
if not ack.ack: if not ack.ack:
print(f'Package {i} not acknowledged') print(f'Package {i} not acknowledged')
break exit(-1)
# Send the FirmwareDone message # Send the FirmwareDone message
@@ -131,4 +133,4 @@ if __name__ == "__main__":
done.crc_fw = start.crc_fw done.crc_fw = start.crc_fw
done.device_id = start.device_id done.device_id = start.device_id
print(done) print(done)
send_package(0xf03, done.SerializeToString(), ser) send_package(UsbPackageType.FIRMWAREDONE, done.SerializeToString(), ser)