From 8e5cfa974bc6a7f700b4549421c8343b908d91c7 Mon Sep 17 00:00:00 2001 From: Rens Pastoor <555408@student.fontys.nl> Date: Tue, 3 Jun 2025 14:25:17 +0200 Subject: [PATCH] adidas improvements --- .vscode/settings.json | 6 ++++ C/C5 and C6 Adidas/shared/channel.c | 10 +++++-- C/C5 and C6 Adidas/shared/decode.c | 45 ++++++++++++++++++++++++++-- C/C5 and C6 Adidas/shared/parity.c | 8 ++--- HC/a.out | Bin 122008 -> 121472 bytes 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..26366da --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "decode.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/shared/channel.c b/C/C5 and C6 Adidas/shared/channel.c index 6dc2db5..bc14fb8 100644 --- a/C/C5 and C6 Adidas/shared/channel.c +++ b/C/C5 and C6 Adidas/shared/channel.c @@ -1,4 +1,10 @@ #include "channel.h" -// add here includes, if needed - +#include // add here your implementation +void channel_init(){ + +} + +uint8_t channel_change_one_random_bit(uint8_t value){ + +} \ 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 c315a13..725ab8b 100644 --- a/C/C5 and C6 Adidas/shared/decode.c +++ b/C/C5 and C6 Adidas/shared/decode.c @@ -1,4 +1,45 @@ #include "decode.h" -// add here includes, if needed +#include "bit_stuff.h" -// add here your implementation \ No newline at end of file +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); + return byte; +} + +void decode_byte(uint8_t in, uint8_t* nibble){ + uint8_t p0 = (in >> 0) & 0x01; + uint8_t p1 = (in >> 1) & 0x01; + uint8_t p2 = (in >> 2) & 0x01; + uint8_t d0 = (in >> 3) & 0x01; + uint8_t d1 = (in >> 4) & 0x01; + uint8_t d2 = (in >> 5) & 0x01; + uint8_t d3 = (in >> 6) & 0x01; + uint8_t MSB = (in >> 7) & 0x01; + + // Check parity bits + uint8_t error = 0; + if ((p0 ^ d0 ^ d1 ^ d2) != 0) error |= 0x01; // Error in p0 group + if ((p1 ^ d0 ^ d1 ^ d3) != 0) error |= 0x02; // Error in p1 group + if ((p2 ^ d0 ^ d2 ^ d3) != 0) error |= 0x04; // Error in p2 group + + if (MSB == 0 && error != 0) { + switch(error) { + case 0x07: d0 ^= 1; break; // Error in d0 0x7 = 0111 + case 0x03: d1 ^= 1; break; // Error in d1 0x3 = 0011 + case 0x05: d2 ^= 1; break; // Error in d2 0x5 = 0101 + case 0x06: d3 ^= 1; break; // Error in d3 0x6 = 0110 + + case 0x01: p0 ^= 1; break; // Error in p0 0x1 = 0001 + case 0x02: p1 ^= 1; break; // Error in p1 0x2 = 0010 + case 0x04: p2 ^= 1; break; // Error in p2 0x4 = 0100 + } + } else if (MSB == 1) MSB ^= 1; // If MSB is 1, flip it + + // create nibble from data bits + *nibble = (d3 << 3) | (d2 << 2) | (d1 << 1) | d0; +} \ No newline at end of file diff --git a/C/C5 and C6 Adidas/shared/parity.c b/C/C5 and C6 Adidas/shared/parity.c index a3c347d..aa1591d 100644 --- a/C/C5 and C6 Adidas/shared/parity.c +++ b/C/C5 and C6 Adidas/shared/parity.c @@ -6,9 +6,9 @@ void calculate_parity_bits(uint8_t nibble, uint8_t* p0, uint8_t* p1, uint8_t* p2 uint8_t d1 = (nibble >> 1) & 1; uint8_t d2 = (nibble >> 2) & 1; uint8_t d3 = (nibble >> 3) & 1; - + // Parity bits as per assignment examples - *p0 = d0 ^ d1 ^ d2; // Circle with d0,d1,d2 - *p1 = d0 ^ d1 ^ d3; // Circle with d0,d1,d3 - *p2 = d0 ^ d2 ^ d3; // Circle with d0,d2,d3 + *p0 = d0 ^ d1 ^ d2; + *p1 = d0 ^ d1 ^ d3; + *p2 = d0 ^ d2 ^ d3; } diff --git a/HC/a.out b/HC/a.out index 21204c2186456025c198dfac6e01f0712574b971..356f2300322716c3e2aaada65f3a0570a3212ae3 100755 GIT binary patch delta 18858 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