2023-10-31 07:47:27 +01:00
|
|
|
#include "system/task_crc.h"
|
|
|
|
#include "system/data_channel.h"
|
|
|
|
#include "system/float_word.h"
|
2023-12-02 23:50:26 +01:00
|
|
|
//#include <zlib.h> /* c-library for crc32() */
|
|
|
|
#include <stddef.h> /* for "size_t" */
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t crc32(const char *s,size_t n) {
|
|
|
|
uint32_t crc=0xFFFFFFFF;
|
|
|
|
for(size_t i=0;i<n;i++)
|
|
|
|
{
|
|
|
|
char ch=s[i];
|
|
|
|
for(size_t j=0;j<8;j++) {
|
|
|
|
uint32_t b=(ch^crc)&1;
|
|
|
|
crc>>=1;
|
|
|
|
if(b) crc=crc^0xEDB88320;
|
|
|
|
ch>>=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ~crc;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-10-31 07:47:27 +01:00
|
|
|
|
|
|
|
int task_crc_run( void * task ) {
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
2023-11-28 11:12:37 +01:00
|
|
|
crc_config * crc = ( crc_config * ) task;
|
|
|
|
uint32_t data_channel_base = crc->base.sink;
|
|
|
|
data_channel_clear( data_channel_base);
|
|
|
|
|
|
|
|
float_word crc_res;
|
|
|
|
float_word crc_input;
|
|
|
|
|
|
|
|
for ( uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i )
|
|
|
|
{
|
2023-12-02 23:50:26 +01:00
|
|
|
data_channel_read(crc->base.sources[0], (uint32_t*)&crc_input.value);
|
2023-11-28 11:12:37 +01:00
|
|
|
|
2023-12-02 23:50:26 +01:00
|
|
|
crc_res.word = crc32((const void *)&crc_input, sizeof(crc_input));
|
2023-11-28 11:12:37 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
data_channel_write( data_channel_base, crc_res.word );
|
|
|
|
|
|
|
|
|
2023-10-31 07:47:27 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|