Skip to content
Snippets Groups Projects
Commit 6f154c0c authored by Clément's avatar Clément
Browse files

refacto crc

parent f3710c8e
No related merge requests found
Pipeline #107659 failed with stages
in 1 second
[
{
"directory": "/Users/Clement/Documents/projet-rio/build",
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -pedantic -Werror -o CMakeFiles/projet-rio.dir/src/main.c.o -c /Users/Clement/Documents/projet-rio/src/main.c",
"file": "/Users/Clement/Documents/projet-rio/src/main.c",
"output": "CMakeFiles/projet-rio.dir/src/main.c.o"
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -Werror -o CMakeFiles/proxy.dir/src/server/server.c.o -c /Users/Clement/Documents/projet-rio/src/server/server.c",
"file": "/Users/Clement/Documents/projet-rio/src/server/server.c",
"output": "CMakeFiles/proxy.dir/src/server/server.c.o"
},
{
"directory": "/Users/Clement/Documents/projet-rio/build",
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -Werror -o CMakeFiles/proxy.dir/src/proxy.c.o -c /Users/Clement/Documents/projet-rio/src/proxy.c",
"file": "/Users/Clement/Documents/projet-rio/src/proxy.c",
"output": "CMakeFiles/proxy.dir/src/proxy.c.o"
},
{
"directory": "/Users/Clement/Documents/projet-rio/build",
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -Werror -o CMakeFiles/endpoint.dir/src/server/server.c.o -c /Users/Clement/Documents/projet-rio/src/server/server.c",
"file": "/Users/Clement/Documents/projet-rio/src/server/server.c",
"output": "CMakeFiles/endpoint.dir/src/server/server.c.o"
},
{
"directory": "/Users/Clement/Documents/projet-rio/build",
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -Werror -o CMakeFiles/endpoint.dir/src/endpoint.c.o -c /Users/Clement/Documents/projet-rio/src/endpoint.c",
"file": "/Users/Clement/Documents/projet-rio/src/endpoint.c",
"output": "CMakeFiles/endpoint.dir/src/endpoint.c.o"
},
{
"directory": "/Users/Clement/Documents/projet-rio/build",
"command": "/Library/Developer/CommandLineTools/usr/bin/cc -I/Users/Clement/Documents/projet-rio/include -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wall -Wextra -Werror -o CMakeFiles/client.dir/src/client.c.o -c /Users/Clement/Documents/projet-rio/src/client.c",
"file": "/Users/Clement/Documents/projet-rio/src/client.c",
"output": "CMakeFiles/client.dir/src/client.c.o"
}
]
\ No newline at end of file
#pragma once
#include <stdint.h>
uint16_t *create_correction_table(uint32_t polynom);
#pragma once
#include <stdint.h>
int Hamming_distance(uint32_t polynom);
#pragma once
#include <stdint.h>
uint16_t residue_polynomial_div(uint32_t in, uint32_t polynom);
#pragma once
#include <stdint.h>
#define XMODEM_INIT_CRC 0x0000
#define CRC_POLYNOM 0x11021
uint16_t residue_polynomial_div(uint32_t in, uint32_t polynom, uint32_t init);
uint16_t *create_correction_table(uint32_t polynom,uint32_t init);
uint16_t residue_polynomial_div(uint32_t in, uint32_t polynom,uint32_t init);
int Hamming_distance(uint32_t polynom, uint32_t init);
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "crc/polynomial_div.h"
#include "crc/correction_table.h"
uint16_t *create_correction_table(uint32_t polynom)
{
uint16_t *correctionTable = malloc(32 * sizeof(uint16_t));
for (int i = 0; i < 32; i++) {
correctionTable[i] = residue_polynomial_div(0x1 << i, polynom);
}
return correctionTable;
}
/*
int main(void)
{
uint32_t *correctionTable = createCorrectionTable(0x11021);
for (int i = 0; i < 32; i++) {
printf("correctionTable[%d] (%x) = %x\n", i, 0x1 << i,
correctionTable[i]);
}
return 0;
}
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "utils/polynomial_div.h"
int count_ones(uint32_t data)
{
int count = 0;
for (int i = 0; i < 32; i++) {
if (data & (0x1 << i)) {
count++;
}
}
return count;
}
int Hamming_distance(uint32_t polynom)
{
int distance = 65536;
for (int i = 1; i < 65536; i++) {
uint32_t data =
(i << 16) + residue_polynomial_div(i << 16, polynom);
int count = count_ones(data);
if (count < distance) {
distance = count;
}
}
return distance;
}
/*
int main(void)
{
int distance = Hamming_distance(0x11021);
printf("distance = %d\n", distance);
return 0;
}
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "crc/polynomial_div.h"
// polynome toujours de taille de degre 16 donc 17 coefficients (bits)
uint16_t residue_polynomial_div(uint32_t in, uint32_t polynom)
{
uint32_t residue = in;
for (int i = 0; i < 16; i++) {
if (residue & (0x1 << (31 - i))) {
residue ^= polynom << (15 - i);
}
}
return residue;
}
/* int main(void)
{
uint16_t in = 0x0003;
uint32_t polynom = 0x11021;
uint16_t res = residuePolynomialDiv(in<<16, polynom);
printf("res = %x\n", res);
return 0;
}
*/
......@@ -6,10 +6,8 @@
#include "server/server.h"
#include <sys/poll.h>
#include <unistd.h>
#include "crc/correction_table.h"
#include "crc/polynomial_div.h"
#include "utils/crc.h"
#define POLYNOM 0x11021
typedef struct {
uint32_t data;
......@@ -26,7 +24,7 @@ int process_data(uint32_t *correction_table, uint32_t data)
uint16_t residue;
int correct = 0;
(void)correct;
if ((residue = residue_polynomial_div(data, POLYNOM)) != 0) {
if ((residue = residue_polynomial_div(data, CRC_POLYNOM,XMODEM_INIT_CRC)) != 0) {
for (int i = 0; i < 32; i++) {
if (residue == correction_table[i]) {
data ^= 0x1 << i;
......@@ -40,9 +38,8 @@ int process_data(uint32_t *correction_table, uint32_t data)
return correct;
}
void receive_data(int fd, void *arg)
void server_thread(int fd, void *arg)
{
(void)fd;
uint32_t *correction_table = arg;
uint16_t num_frame = 0;
(void)num_frame;
......@@ -64,7 +61,6 @@ void receive_data(int fd, void *arg)
}
}
int main(int argc, char *argv[])
{
Server *server;
......@@ -74,7 +70,7 @@ int main(int argc, char *argv[])
return 1;
}
uint16_t *correction_table = create_correction_table(POLYNOM);
uint16_t *correction_table = create_correction_table(CRC_POLYNOM, XMODEM_INIT_CRC);
free(correction_table);
addr.sin_family = AF_INET;
......@@ -84,7 +80,7 @@ int main(int argc, char *argv[])
CHKN(server = server_new(atoi(argv[1])));
CHK(server_start(server, receive_data, &addr));
CHK(server_start(server, server_thread, &addr));
CHK(server_join(server));
server_free(server);
......
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "utils/crc.h"
#include <limits.h>
#define XMODEM_INIT_CRC 0x0000
#define CRC_POLYNOM 0x11021
// polynome toujours de taille de degre 16 donc 17 coefficients (bits)
uint16_t residue_polynomial_div(uint32_t in, uint32_t polynom, uint32_t init)
{
uint32_t residue = in ^ init;
for (int i = 0; i < 16; i++) {
if (residue & (0x1 << (31 - i))) {
residue ^= polynom << (15 - i);
}
}
return residue;
}
int pop_count(uint32_t data)
{
int count = 0;
for (int i = 0; i < 32; i++) {
if (data & (0x1 << i)) {
count++;
}
}
return count;
}
int Hamming_distance(uint32_t polynom, uint32_t init)
{
uint16_t distance = UINT16_MAX;
for (int i = 1; i < UINT16_MAX; i++) {
uint32_t data = (i << 16) +
residue_polynomial_div(i << 16, polynom, init);
int count = pop_count(data);
if (count < distance) {
distance = count;
}
}
return distance;
}
uint16_t *create_correction_table(uint32_t polynom, uint32_t init)
{
uint16_t *correctionTable = malloc(32 * sizeof(uint16_t));
for (int i = 0; i < 32; i++) {
correctionTable[i] =
residue_polynomial_div(0x1 << i, polynom, init);
}
return correctionTable;
}
/* int main(void)
{
uint16_t in = 0x0003;
uint32_t polynom = 0x11021;
uint16_t res = residue_polynomial_div(in<<16, polynom);
printf("res = %x\n", res);
return 0;
} */
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment