76 lines
1.3 KiB
C
76 lines
1.3 KiB
C
#include "system/task_rand.h"
|
|
#include "system/hardware_task.h"
|
|
#include "system/data_channel.h"
|
|
#include "system/float_word.h"
|
|
|
|
#include "stdio.h"
|
|
|
|
#define POLYNOM ((1 << 31)|(1 << 21)|(1 << 1)|(1 << 0))
|
|
|
|
int32_t shift_lsfr(int32_t *lsfr) {
|
|
int feedback;
|
|
|
|
feedback = *lsfr & 1;
|
|
|
|
*lsfr >>= 1;
|
|
|
|
if(feedback == 1)
|
|
*lsfr ^= POLYNOM;
|
|
return *lsfr;
|
|
|
|
}
|
|
|
|
int32_t pot(int32_t base, int exp) {
|
|
int32_t res = 1;
|
|
while(exp-- >= 0)
|
|
res *= base;
|
|
|
|
return res;
|
|
}
|
|
|
|
uint8_t clamp_value(uint8_t value) {
|
|
|
|
if(value & 128) {
|
|
value &= 0b10000001;
|
|
//value &= ((1 << 7) | (1 << 0));
|
|
} else {
|
|
//value |= ~((1 << 1) | (1 << 0));
|
|
value |= 0b01111100;
|
|
}
|
|
return value;
|
|
|
|
}
|
|
|
|
int task_rand_run( void * task ) {
|
|
|
|
rand_config* config = ( rand_config* ) task;
|
|
float_word seed = { .value = config->seed };
|
|
|
|
uint32_t lfsr = seed.word;
|
|
|
|
uint32_t data_channel_base = config->base.sink;
|
|
data_channel_clear(data_channel_base);
|
|
|
|
for(uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
|
|
float_word res, value;
|
|
|
|
//res.value = lfsr;
|
|
//
|
|
|
|
|
|
uint32_t E = (value.word >> 23) & 0xff;
|
|
E = clamp_value(E);
|
|
|
|
res.word = value.word;
|
|
res.word &= ~(0xFF << 23);
|
|
res.word |= (E << 23);
|
|
|
|
value.word = shift_lsfr(&lfsr) ;
|
|
|
|
data_channel_write( data_channel_base, res.word);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|