From 34ebc83b3e874b259fb59e091d09b5fbfc3ef4ef Mon Sep 17 00:00:00 2001 From: Rens Pastoor <555408@student.fontys.nl> Date: Thu, 5 Jun 2025 15:19:10 +0200 Subject: [PATCH] finished adidas v1.0 --- .vscode/settings.json | 3 +- C/C5 and C6 Adidas/build/main_test | Bin 47296 -> 54688 bytes C/C5 and C6 Adidas/shared/channel.c | 12 +++-- C/C5 and C6 Adidas/shared/decode.c | 6 +-- C/C5 and C6 Adidas/test/channel_test.c | 30 +++++------ C/C5 and C6 Adidas/test/decode_test.c | 67 +++++++++++++++++++------ 6 files changed, 81 insertions(+), 37 deletions(-) mode change 100644 => 100755 C/C5 and C6 Adidas/build/main_test diff --git a/.vscode/settings.json b/.vscode/settings.json index 26366da..9f2aa53 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "files.associations": { - "decode.h": "c" + "decode.h": "c", + "unity_test_module.h": "c" }, "cmake.sourceDirectory": "/home/rens/files/T2/HC/holyc-lang/src" } \ No newline at end of file diff --git a/C/C5 and C6 Adidas/build/main_test b/C/C5 and C6 Adidas/build/main_test old mode 100644 new mode 100755 index 6dc41e036b3e0382788b493000d3af582146a142..6115af89748c2ef1f0ec55a08b71dfa99bc93c50 GIT binary patch literal 54688 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 tr?W8ScWV5j?m_tuqULqVp0GA delta 17927 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 -// add here your implementation -void channel_init(){ +#include +void channel_init(){ + srand((unsigned int)time(NULL)); } uint8_t channel_change_one_random_bit(uint8_t value){ - + // Generate random bit position (0-7) + uint8_t bit_position = rand() % 8; + uint8_t bit_mask = 1 << bit_position; + // XOR with the mask to flip the bit + // 01101010 with mask 00000100 becomes 01101110 + return value ^ bit_mask; } \ No newline at end of file diff --git a/C/C5 and C6 Adidas/shared/decode.c b/C/C5 and C6 Adidas/shared/decode.c index 725ab8b..dff285a 100644 --- a/C/C5 and C6 Adidas/shared/decode.c +++ b/C/C5 and C6 Adidas/shared/decode.c @@ -5,9 +5,9 @@ uint8_t decode_combine_nibbles(uint8_t high, uint8_t low){ uint8_t byte; uint8_t high_nibble; uint8_t low_nibble; - decode_byte(high,high_nibble); - decode_byte(low,low_nibble); - combine_nibles_to_byte(high_nibble, low_nibble, byte); + decode_byte(high,&high_nibble); + decode_byte(low,&low_nibble); + combine_nibles_to_byte(high_nibble, low_nibble, &byte); return byte; } diff --git a/C/C5 and C6 Adidas/test/channel_test.c b/C/C5 and C6 Adidas/test/channel_test.c index 86529e8..23b35a4 100644 --- a/C/C5 and C6 Adidas/test/channel_test.c +++ b/C/C5 and C6 Adidas/test/channel_test.c @@ -6,26 +6,28 @@ // I rather dislike keeping line numbers updated, so I made my own macro to ditch the line number #define MY_RUN_TEST(func) RUN_TEST(func, 0) -extern void channel_setUp(void) -{ - // This is run before EACH test +extern void channel_setUp(void){ + channel_init(); +} +extern void channel_tearDown(void) {} + +void test_channel_all_zero_test(){ + uint8_t value = 0x00; + uint8_t result = channel_change_one_random_bit(value); + TEST_ASSERT_NOT_EQUAL(value, result); } -extern void channel_tearDown(void) -{ - // This is run after EACH test +void test_channel_all_one_test(){ + uint8_t value = 0xFF; + uint8_t result = channel_change_one_random_bit(value); + TEST_ASSERT_NOT_EQUAL(value, result); } -static void test_channel(void) -{ - TEST_ASSERT_EQUAL(1, 0); -} - -void run_channel_tests() -{ +void run_channel_tests(){ UnityRegisterSetupTearDown( channel_setUp, channel_tearDown); - MY_RUN_TEST(test_channel); + MY_RUN_TEST(test_channel_all_zero_test); + MY_RUN_TEST(test_channel_all_one_test); UnityUnregisterSetupTearDown(); } diff --git a/C/C5 and C6 Adidas/test/decode_test.c b/C/C5 and C6 Adidas/test/decode_test.c index 0e08dc0..6e608a0 100644 --- a/C/C5 and C6 Adidas/test/decode_test.c +++ b/C/C5 and C6 Adidas/test/decode_test.c @@ -5,26 +5,61 @@ // I rather dislike keeping line numbers updated, so I made my own macro to ditch the line number #define MY_RUN_TEST(func) RUN_TEST(func, 0) -extern void decode_setUp(void) -{ - // This is run before EACH test +extern void decode_setUp(void) {} +extern void decode_tearDown(void) {} +// Format: [0][d3][d2][d1][d0][p2][p1][p0] (MSB first) + +//general decode combine nibbles test +void test_decode_get_nibbles_normal(void){ + uint8_t high = 0b01101100, low = 0b01001001; + // high data: 1101 or 0xD and low data: 1001 or 0x9 + TEST_ASSERT_EQUAL(0xD9, decode_combine_nibbles(high, low)); // so the result should be 0b11011001 or 0xD9 } - -extern void decode_tearDown(void) -{ - // This is run after EACH test +void test_decode_get_nibbles_zero(void){ + uint8_t high = 0b00000000, low = 0b00000000; + // high data: 0000 or 0x0 and low data: 0000 or 0x0 + TEST_ASSERT_EQUAL(0x00, decode_combine_nibbles(high, low)); // so the result should be 0b00000000 or 0x00 } - -void test_decode(void) -{ - TEST_ASSERT_EQUAL(1, 0); +void test_decode_get_nibbles_all_ones(void){ + uint8_t high = 0b11111111, low = 0b11111111; + // high data: 1111 or 0xF and low data: 1111 or 0xF + TEST_ASSERT_EQUAL(0xFF, decode_combine_nibbles(high, low)); // so the result should be 0b11111111 or 0xFF } +void test_decode_MSB_flip (void){ + uint8_t high = 0b11101100, low = 0b11001001; + // high data: 1101 or 0xD and low data: 1001 or 0x9 + // but the MSB is flipped + TEST_ASSERT_EQUAL(0xD9, decode_combine_nibbles(high, low)); // so the result should be 0b11011001 or 0xD9 +} +// +// parity bit testing +void test_decode_databit_flip (void){ + uint8_t wrong_data = 0b01001100; // this should be 0b01101100 or unparityd 0b1101, 0xD + uint8_t right_data; // this is the correct data + decode_byte(wrong_data, &right_data); + TEST_ASSERT_EQUAL(0xD, right_data); // so the result should be 0b01101100 or 0xD +} +void test_decode_common_databit_flip (void){ // the common databit is d0 + uint8_t wrong_data = 0b01100100; // this should be 0b01101100 or unparityd 0b1101, 0xD + uint8_t right_data; // this is the correct data + decode_byte(wrong_data, &right_data); + TEST_ASSERT_EQUAL(0xD, right_data); // so the result should be 0b01101100 or 0xD +} +void test_decode_parity_flip(void){ + uint8_t wrong_data = 0b01101101; // this should be 0b01101100 or unparityd 0b1101, 0xD + uint8_t right_data; // this is the correct data + decode_byte(wrong_data, &right_data); + TEST_ASSERT_EQUAL(0xD, right_data); // so the result should be 0b01101100 or 0xD +} +// +void run_decode_tests(){ + UnityRegisterSetupTearDown(decode_setUp, decode_tearDown); -void run_decode_tests() -{ - UnityRegisterSetupTearDown( decode_setUp, decode_tearDown); - - MY_RUN_TEST(test_decode); + MY_RUN_TEST(test_decode_get_nibbles_normal); + MY_RUN_TEST(test_decode_get_nibbles_zero); + MY_RUN_TEST(test_decode_get_nibbles_all_ones); + MY_RUN_TEST(test_decode_MSB_flip); + MY_RUN_TEST(test_decode_databit_flip); UnityUnregisterSetupTearDown(); }