-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import CRC function, calculate length
- Loading branch information
Showing
4 changed files
with
248 additions
and
198 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
_low_crc = [ | ||
0x00, 0x21, 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x08, 0x29, 0x4a, 0x6b, 0x8c, | ||
0xad, 0xce, 0xef, 0x31, 0x10, 0x73, 0x52, 0xb5, 0x94, 0xf7, 0xd6, 0x39, 0x18, | ||
0x7b, 0x5a, 0xbd, 0x9c, 0xff, 0xde, 0x62, 0x43, 0x20, 0x01, 0xe6, 0xc7, 0xa4, | ||
0x85, 0x6a, 0x4b, 0x28, 0x09, 0xee, 0xcf, 0xac, 0x8d, 0x53, 0x72, 0x11, 0x30, | ||
0xd7, 0xf6, 0x95, 0xb4, 0x5b, 0x7a, 0x19, 0x38, 0xdf, 0xfe, 0x9d, 0xbc, 0xc4, | ||
0xe5, 0x86, 0xa7, 0x40, 0x61, 0x02, 0x23, 0xcc, 0xed, 0x8e, 0xaf, 0x48, 0x69, | ||
0x0a, 0x2b, 0xf5, 0xd4, 0xb7, 0x96, 0x71, 0x50, 0x33, 0x12, 0xfd, 0xdc, 0xbf, | ||
0x9e, 0x79, 0x58, 0x3b, 0x1a, 0xa6, 0x87, 0xe4, 0xc5, 0x22, 0x03, 0x60, 0x41, | ||
0xae, 0x8f, 0xec, 0xcd, 0x2a, 0x0b, 0x68, 0x49, 0x97, 0xb6, 0xd5, 0xf4, 0x13, | ||
0x32, 0x51, 0x70, 0x9f, 0xbe, 0xdd, 0xfc, 0x1b, 0x3a, 0x59, 0x78, 0x88, 0xa9, | ||
0xca, 0xeb, 0x0c, 0x2d, 0x4e, 0x6f, 0x80, 0xa1, 0xc2, 0xe3, 0x04, 0x25, 0x46, | ||
0x67, 0xb9, 0x98, 0xfb, 0xda, 0x3d, 0x1c, 0x7f, 0x5e, 0xb1, 0x90, 0xf3, 0xd2, | ||
0x35, 0x14, 0x77, 0x56, 0xea, 0xcb, 0xa8, 0x89, 0x6e, 0x4f, 0x2c, 0x0d, 0xe2, | ||
0xc3, 0xa0, 0x81, 0x66, 0x47, 0x24, 0x05, 0xdb, 0xfa, 0x99, 0xb8, 0x5f, 0x7e, | ||
0x1d, 0x3c, 0xd3, 0xf2, 0x91, 0xb0, 0x57, 0x76, 0x15, 0x34, 0x4c, 0x6d, 0x0e, | ||
0x2f, 0xc8, 0xe9, 0x8a, 0xab, 0x44, 0x65, 0x06, 0x27, 0xc0, 0xe1, 0x82, 0xa3, | ||
0x7d, 0x5c, 0x3f, 0x1e, 0xf9, 0xd8, 0xbb, 0x9a, 0x75, 0x54, 0x37, 0x16, 0xf1, | ||
0xd0, 0xb3, 0x92, 0x2e, 0x0f, 0x6c, 0x4d, 0xaa, 0x8b, 0xe8, 0xc9, 0x26, 0x07, | ||
0x64, 0x45, 0xa2, 0x83, 0xe0, 0xc1, 0x1f, 0x3e, 0x5d, 0x7c, 0x9b, 0xba, 0xd9, | ||
0xf8, 0x17, 0x36, 0x55, 0x74, 0x93, 0xb2, 0xd1, 0xf0 | ||
] | ||
|
||
_high_crc = [ | ||
0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x81, 0x91, 0xa1, 0xb1, 0xc1, | ||
0xd1, 0xe1, 0xf1, 0x12, 0x02, 0x32, 0x22, 0x52, 0x42, 0x72, 0x62, 0x93, 0x83, | ||
0xb3, 0xa3, 0xd3, 0xc3, 0xf3, 0xe3, 0x24, 0x34, 0x04, 0x14, 0x64, 0x74, 0x44, | ||
0x54, 0xa5, 0xb5, 0x85, 0x95, 0xe5, 0xf5, 0xc5, 0xd5, 0x36, 0x26, 0x16, 0x06, | ||
0x76, 0x66, 0x56, 0x46, 0xb7, 0xa7, 0x97, 0x87, 0xf7, 0xe7, 0xd7, 0xc7, 0x48, | ||
0x58, 0x68, 0x78, 0x08, 0x18, 0x28, 0x38, 0xc9, 0xd9, 0xe9, 0xf9, 0x89, 0x99, | ||
0xa9, 0xb9, 0x5a, 0x4a, 0x7a, 0x6a, 0x1a, 0x0a, 0x3a, 0x2a, 0xdb, 0xcb, 0xfb, | ||
0xeb, 0x9b, 0x8b, 0xbb, 0xab, 0x6c, 0x7c, 0x4c, 0x5c, 0x2c, 0x3c, 0x0c, 0x1c, | ||
0xed, 0xfd, 0xcd, 0xdd, 0xad, 0xbd, 0x8d, 0x9d, 0x7e, 0x6e, 0x5e, 0x4e, 0x3e, | ||
0x2e, 0x1e, 0x0e, 0xff, 0xef, 0xdf, 0xcf, 0xbf, 0xaf, 0x9f, 0x8f, 0x91, 0x81, | ||
0xb1, 0xa1, 0xd1, 0xc1, 0xf1, 0xe1, 0x10, 0x00, 0x30, 0x20, 0x50, 0x40, 0x70, | ||
0x60, 0x83, 0x93, 0xa3, 0xb3, 0xc3, 0xd3, 0xe3, 0xf3, 0x02, 0x12, 0x22, 0x32, | ||
0x42, 0x52, 0x62, 0x72, 0xb5, 0xa5, 0x95, 0x85, 0xf5, 0xe5, 0xd5, 0xc5, 0x34, | ||
0x24, 0x14, 0x04, 0x74, 0x64, 0x54, 0x44, 0xa7, 0xb7, 0x87, 0x97, 0xe7, 0xf7, | ||
0xc7, 0xd7, 0x26, 0x36, 0x06, 0x16, 0x66, 0x76, 0x46, 0x56, 0xd9, 0xc9, 0xf9, | ||
0xe9, 0x99, 0x89, 0xb9, 0xa9, 0x58, 0x48, 0x78, 0x68, 0x18, 0x08, 0x38, 0x28, | ||
0xcb, 0xdb, 0xeb, 0xfb, 0x8b, 0x9b, 0xab, 0xbb, 0x4a, 0x5a, 0x6a, 0x7a, 0x0a, | ||
0x1a, 0x2a, 0x3a, 0xfd, 0xed, 0xdd, 0xcd, 0xbd, 0xad, 0x9d, 0x8d, 0x7c, 0x6c, | ||
0x5c, 0x4c, 0x3c, 0x2c, 0x1c, 0x0c, 0xef, 0xff, 0xcf, 0xdf, 0xaf, 0xbf, 0x8f, | ||
0x9f, 0x6e, 0x7e, 0x4e, 0x5e, 0x2e, 0x3e, 0x0e, 0x1e | ||
] | ||
|
||
|
||
def crc_16(byte_array, seed=[0xFF, 0xFF]): | ||
""" | ||
16-bit CRC: | ||
Uses CCITT CRC polynomial: X^16 + X^12 + X^5 + 1. | ||
The accepted start value is 0xffff. | ||
""" | ||
high_parity = seed[0] | ||
low_parity = seed[1] | ||
for byte in list(byte_array): | ||
k = byte ^ high_parity | ||
high_parity = low_parity ^ _high_crc[k] | ||
low_parity = _low_crc[k] | ||
return [high_parity, low_parity] | ||
|
||
|
||
def checksum_16(byte_array, seed=[0x00, 0x00]): | ||
"""Simple 16-bit checksum.""" | ||
assert ( | ||
len(byte_array) % 2 == 0 | ||
), "Checksum 16 only works on even numbered byte arrays" | ||
csum = seed[0] * 0x100 + seed[1] | ||
for i in range(0, len(byte_array), 2): | ||
csum += byte_array[i] * 0x100 + byte_array[i + 1] | ||
csum %= 0x10000 | ||
return [int(csum / 0x100), csum % 0x100] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
from openc3.script import * | ||
|
||
def test_setup(): | ||
# Clear counts and data products from prior tests: | ||
cmd("Linux_Example Fault_Correction_Instance-Reset_Data_Products") | ||
cmd("Linux_Example Ccsds_Command_Depacketizer_Instance-Reset_Counts") | ||
cmd("Linux_Example Command_Router_Instance-Reset_Data_Products") | ||
|
||
# Send Noop_Arg command expecting success: | ||
cmd("Linux_Example Command_Router_Instance-Noop_Arg with Value 1") | ||
# Check successful command count is 2 and that the last success was Noop_Arg with last Value 1: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Success_Count.Value == 2", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Successful_Command.Id == 3", 3) | ||
print("Noop_Arg success OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Noop_Arg_Last_Value.Value == 1", 3) | ||
print("Noop_Arg last Value OK") | ||
|
||
# Send Noop command expecting failure: | ||
cmd("Linux_Example Command_Router_Instance-Noop_Arg with Value 868") | ||
# Check last failed command count was 1 and that it was Noop_Arg with last Value 1: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 1", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 3", 3) | ||
print("Noop_Arg failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Noop_Arg_Last_Value.Value == 868", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Noop_Arg last Value failure OK") | ||
|
||
return True |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,92 +1,66 @@ | ||
######################################################################## | ||
# This script is designed to function with OpenC3 COSMOS's Script Runner | ||
######################################################################## | ||
from openc3.script import * | ||
import struct | ||
import struct, sys | ||
sys.path.append('/plugins/DEFAULT/targets_modified') | ||
import crc_16 | ||
import test_setup | ||
|
||
# Clear counts and data products from prior tests: | ||
cmd("Linux_Example Fault_Correction_Instance-Reset_Data_Products") | ||
cmd("Linux_Example Ccsds_Command_Depacketizer_Instance-Reset_Counts") | ||
cmd("Linux_Example Command_Router_Instance-Reset_Data_Products") | ||
if test_setup.test_setup(): | ||
|
||
# Send Noop_Arg command expecting success: | ||
cmd("Linux_Example Command_Router_Instance-Noop_Arg with Value 1") | ||
# Check successful command count is 2 and that the last success was Noop_Arg with last Value 1: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Success_Count.Value == 2", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Successful_Command.Id == 3", 3) | ||
print("Noop_Arg success OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Noop_Arg_Last_Value.Value == 1", 3) | ||
print("Noop_Arg last Value OK") | ||
######################################################################### | ||
# If this point was reached then begin testing parameter update functions | ||
######################################################################### | ||
|
||
# Send Noop command expecting failure: | ||
cmd("Linux_Example Command_Router_Instance-Noop_Arg with Value 868") | ||
# Check last failed command count was 1 and that it was Noop_Arg with last Value 1: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 1", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 3", 3) | ||
print("Noop_Arg failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Noop_Arg_Last_Value.Value == 868", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Noop_Arg last Value failure OK") | ||
# Build a parameter table using bytearrays: | ||
# Osc_A_Freq | ||
Test_Packed_Table = bytearray(struct.pack(">f", 0.30)) | ||
# Osc_A_Amp | ||
Test_Packed_Table += bytearray(struct.pack(">f", 5.00)) | ||
# Osc_A_Off | ||
Test_Packed_Table += bytearray(struct.pack(">f", 2.50)) | ||
# Osc_B_Freq | ||
Test_Packed_Table += bytearray(struct.pack(">f", 0.30)) | ||
# Osc_B_Amp | ||
Test_Packed_Table += bytearray(struct.pack(">f", -5.00)) | ||
# Osc_B_Off | ||
Test_Packed_Table += bytearray(struct.pack(">f", -2.50)) | ||
|
||
######################################################################### | ||
# If this point was reached then begin testing parameter update functions | ||
######################################################################### | ||
# Send nominal Update_Parameter_Table command expecting success: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": len(Test_Packed_Table), | ||
"Header.Crc_Table": 19692, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check successful command count is 3 and that it was Update_Parameter_Table: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Success_Count.Value == 3", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Successful_Command.Id == 5200", 3) | ||
print("Update_Parameter_Table success OK") | ||
|
||
# Build a parameter table using bytearrays: | ||
# Osc_A_Freq | ||
Test_Packed_Table = bytearray(struct.pack(">f", 0.30)) | ||
# Osc_A_Amp | ||
Test_Packed_Table += bytearray(struct.pack(">f", 5.00)) | ||
# Osc_A_Off | ||
Test_Packed_Table += bytearray(struct.pack(">f", 2.50)) | ||
# Osc_B_Freq | ||
Test_Packed_Table += bytearray(struct.pack(">f", 0.30)) | ||
# Osc_B_Amp | ||
Test_Packed_Table += bytearray(struct.pack(">f", -5.00)) | ||
# Osc_B_Off | ||
Test_Packed_Table += bytearray(struct.pack(">f", -2.50)) | ||
# Version | ||
Test_Packed_Table += bytearray(struct.pack(">f", 0.0)) | ||
# Crc_Table | ||
Test_Packed_Table += bytearray(struct.pack(">h", 0)) | ||
# Buffer_Length | ||
Test_Packed_Table += bytearray(struct.pack(">h", 55)) | ||
# Send test Update_Parameter_Table command with bad CRC expecting Memory_Region_Crc_Invalid, Parameter_Table_Copy_Failure, | ||
# Working_Table_Update_Failure, and Command_Execution_Failure: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": len(Test_Packed_Table), | ||
"Header.Crc_Table": 0, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check last failed command count was 2 and that it was Update_Parameter_Table with Status FAILURE: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 2", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 5200", 3) | ||
print("Update_Parameter_Table failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Update_Parameter_Table last Status FAILURE OK") | ||
|
||
# Send nominal Update_Parameter_Table command expecting success: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": 24, | ||
"Header.Crc_Table": 19692, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check successful command count is 3 and that it was Update_Parameter_Table: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Success_Count.Value == 3", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Successful_Command.Id == 5200", 3) | ||
print("Update_Parameter_Table success OK") | ||
|
||
# Send test Update_Parameter_Table command with bad CRC expecting Memory_Region_Crc_Invalid, Parameter_Table_Copy_Failure, | ||
# Working_Table_Update_Failure, and Command_Execution_Failure: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": 24, | ||
"Header.Crc_Table": 0, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check last failed command count was 2 and that it was Update_Parameter_Table with Status FAILURE: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 2", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 5200", 3) | ||
print("Update_Parameter_Table failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Update_Parameter_Table last Status FAILURE OK") | ||
|
||
# Send test Update_Parameter_Table command with bad length expecting Memory_Region_Length_Mismatch, Parameter_Table_Copy_Failure, | ||
# Working_Table_Update_Failure, and Command_Execution_Failure: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": 26, | ||
"Header.Crc_Table": 19692, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check last failed command count was 3 and that it was Update_Parameter_Table with Status FAILURE: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 3", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 5200", 3) | ||
print("Update_Parameter_Table failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Update_Parameter_Table last Status FAILURE OK") | ||
# Send test Update_Parameter_Table command with bad length expecting Memory_Region_Length_Mismatch, Parameter_Table_Copy_Failure, | ||
# Working_Table_Update_Failure, and Command_Execution_Failure: | ||
cmd("Linux_Example", "Parameter_Manager_Instance-Update_Parameter_Table", { | ||
"Header.Table_Buffer_Length": len(Test_Packed_Table) + 1, | ||
"Header.Crc_Table": 19692, | ||
"Table_Buffer": list(Test_Packed_Table) | ||
}) | ||
# Check last failed command count was 3 and that it was Update_Parameter_Table with Status FAILURE: | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Command_Failure_Count.Value == 3", 3) | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.ID == 5200", 3) | ||
print("Update_Parameter_Table failure OK") | ||
wait_check("Linux_Example Software_Status_Packet Command_Router_Instance.Last_Failed_Command.Status == 'FAILURE'", 3) | ||
print("Update_Parameter_Table last Status FAILURE OK") |
Oops, something went wrong.