@@ -24,7 +24,7 @@ def compute_crc16(data):
24
24
class FirmwareUpdateFactory :
25
25
def __init__ (self ):
26
26
self .buffer = bytearray (256 )
27
-
27
+
28
28
def create_fwug_start_msg (self ):
29
29
msg_len = 2 + 2 # Total length: 2 bytes header + 2 bytes footer
30
30
msg_header = struct .pack ('BB' , COM_PROTO_MSG_TYPE_FWUG_START , msg_len )
@@ -34,61 +34,61 @@ def create_fwug_start_msg(self):
34
34
message = msg_header + struct .pack ('>H' , crc16 )
35
35
self .buffer [:len (message )] = message
36
36
return self .buffer [:len (message )]
37
-
37
+
38
38
def create_fwug_data_msg (self , packet_number , payload ):
39
39
if len (payload ) != FIRMWARE_UPDATE_PACKET_SIZE :
40
40
raise ValueError (f"Payload must be { FIRMWARE_UPDATE_PACKET_SIZE } bytes" )
41
-
41
+
42
42
msg_len = 2 + 2 + FIRMWARE_UPDATE_PACKET_SIZE + 2 # Header + packet number + payload + footer
43
43
msg_header = struct .pack ('BB' , COM_PROTO_MSG_TYPE_FWUG_DATA , msg_len )
44
44
packet_num = struct .pack ('<H' , packet_number ) # Big-endian packet number
45
45
msg_footer = struct .pack ('H' , 0 ) # Placeholder for CRC16
46
-
46
+
47
47
message = msg_header + packet_num + payload + msg_footer
48
48
crc16 = compute_crc16 (message [:- 2 ])
49
49
message = msg_header + packet_num + payload + struct .pack ('>H' , crc16 )
50
-
50
+
51
51
self .buffer [:len (message )] = message
52
52
return self .buffer [:len (message )]
53
-
53
+
54
54
def create_fwug_cancel_msg (self ):
55
55
msg_len = 2 + 2 # 2 bytes header + 2 bytes footer
56
56
msg_header = struct .pack ('BB' , COM_PROTO_MSG_TYPE_FWUG_CANCEL , msg_len )
57
57
msg_footer = struct .pack ('H' , 0 )
58
58
message = msg_header + msg_footer
59
59
crc16 = compute_crc16 (message [:- 2 ])
60
60
message = msg_header + struct .pack ('>H' , crc16 )
61
-
61
+
62
62
self .buffer [:len (message )] = message
63
63
return self .buffer [:len (message )]
64
64
65
- def send_message_via_serial (message , port = 'COM9 ' , baudrate = 115200 ):
65
+ def send_message_via_serial (message , port = '/dev/ttyACM0 ' , baudrate = 115200 ):
66
66
# Open serial port
67
67
ser = serial .Serial (port , baudrate )
68
-
68
+
69
69
# Create the buffer of 256 bytes
70
70
buffer_size = 256
71
71
buffer = bytearray (buffer_size )
72
-
72
+
73
73
# Copy message into the buffer
74
74
buffer [:len (message )] = message
75
-
75
+
76
76
# Fill the rest of the buffer with 0xFF
77
77
for i in range (len (message ), buffer_size ):
78
78
buffer [i ] = 0xFF
79
-
79
+
80
80
# Convert buffer to hex string
81
81
hex_buffer = buffer .hex ()
82
-
82
+
83
83
# Print hex buffer for verification
84
84
#print("Hex Buffer:", hex_buffer)
85
85
ser .write (bytes .fromhex (hex_buffer ))
86
-
86
+
87
87
# Initialize variables for response handling
88
88
max_wait_time = 15 # Maximum wait time in seconds
89
- check_interval = 0.001 # Interval to check for response in seconds
89
+ check_interval = 0.01 # Interval to check for response in seconds
90
90
total_wait_time = 0
91
-
91
+
92
92
# Wait for the response
93
93
response = bytearray ()
94
94
while total_wait_time < max_wait_time :
@@ -97,15 +97,16 @@ def send_message_via_serial(message, port='COM9', baudrate=115200):
97
97
break
98
98
time .sleep (check_interval )
99
99
total_wait_time += check_interval
100
-
100
+
101
101
# Print the response in hex format for verification
102
102
# if response:
103
103
# print("Response (Hex):", response.hex())
104
104
# else:
105
105
# print("No response received within the maximum wait time")
106
-
106
+
107
107
# Close serial port
108
108
ser .close ()
109
+ return response
109
110
110
111
# Function to send firmware update data in chunks
111
112
def send_firmware_update (file_path , factory ):
@@ -116,12 +117,12 @@ def send_firmware_update(file_path, factory):
116
117
data_chunk = f .read (FIRMWARE_UPDATE_PACKET_SIZE )
117
118
if not data_chunk :
118
119
break # No more data to send
119
-
120
+
120
121
# Create FWUG_DATA message
121
122
data_msg = factory .create_fwug_data_msg (packet_number , data_chunk )
122
123
print (f"Sending FWUG_DATA Message { packet_number } :" )
123
- send_message_via_serial (data_msg )
124
-
124
+ response = send_message_via_serial (data_msg )
125
+ print ( "Response:" , response . hex ())
125
126
packet_number += 1
126
127
127
128
if __name__ == "__main__" :
0 commit comments