charptr32 filename
bool32.rising trigger
bool32.rising reset
bool32 save
bool32 load
int32 count
int32 output
int32 stage
bool32.pulse carry pulse
bool32 rst
frac32.u.map pattern
bool32.mom save
bool32.mom load
spinner maxstages
spinner patterns
static const uint32_t LENGTH = attr_maxstages;
static const int patt = attr_patterns;
uint8_t *array;
int ntrig;
int rtrig;
int count;
int cnt;
int length;
int rst;
int ltrig;
int strig;
static uint8_t _array[LENGTH * patt] __attribute__((section(".sdram")));
array = &_array[0];
count = 0;
ntrig = 0;
rtrig = 0;
cnt = 0;
int save = param_save + inlet_save;
int load = param_load + inlet_load;
if ((save > 0) && !strig) {
strig = 1;
FIL FileObject;
FRESULT err;
UINT bytes_written;
err = f_open(&FileObject, inlet_filename, FA_WRITE | FA_CREATE_ALWAYS);
if (err != FR_OK) {
report_fatfs_error(err, "inlet_filename");
return;
}
int rem_sz = sizeof(*array) * (LENGTH * patt);
int offset = 0;
while (rem_sz > 0) {
if (rem_sz > sizeof(fbuff)) {
memcpy((char *)fbuff, (char *)(&array[0]) + offset, sizeof(fbuff));
err = f_write(&FileObject, fbuff, sizeof(fbuff), &bytes_written);
rem_sz -= sizeof(fbuff);
offset += sizeof(fbuff);
} else {
memcpy((char *)fbuff, (char *)(&array[0]) + offset, rem_sz);
err = f_write(&FileObject, fbuff, rem_sz, &bytes_written);
rem_sz = 0;
}
}
if (err != FR_OK)
report_fatfs_error(err, "inlet_filename");
err = f_close(&FileObject);
if (err != FR_OK)
report_fatfs_error(err, "inlet_filename");
} else if (!(save > 0))
strig = 0;
if ((load > 0) && !ltrig) {
ltrig = 1;
FIL FileObject;
FRESULT err;
UINT bytes_read;
err = f_open(&FileObject, inlet_filename, FA_READ | FA_OPEN_EXISTING);
if (err != FR_OK) {
report_fatfs_error(err, inlet_filename);
return;
}
int rem_sz = sizeof(*array) * (LENGTH * patt);
int offset = 0;
while (rem_sz > 0) {
if (rem_sz > sizeof(fbuff)) {
err = f_read(&FileObject, fbuff, sizeof(fbuff), &bytes_read);
if (bytes_read == 0)
break;
memcpy((char *)(&array[0]) + offset, (char *)fbuff, bytes_read);
rem_sz -= bytes_read;
offset += bytes_read;
} else {
err = f_read(&FileObject, fbuff, rem_sz, &bytes_read);
memcpy((char *)(&array[0]) + offset, (char *)fbuff, bytes_read);
rem_sz = 0;
}
}
if (err != FR_OK) {
report_fatfs_error(err, inlet_filename);
return;
};
err = f_close(&FileObject);
if (err != FR_OK) {
report_fatfs_error(err, inlet_filename);
return;
};
} else if (!(load > 0))
ltrig = 0;
outlet_c = 0;
int32_t Patt = ___SMMUL(__USAT(param_pattern, 27) << 2, patt - 1 << 3);
Patt = Patt - Patt / patt * patt;
Patt = Patt * LENGTH;
rst = 0;
if ((inlet_r > 0) && !rtrig) {
count = -1;
cnt = -1;
rst = 1;
rtrig = 1;
} else if (!(inlet_r > 0))
rtrig = 0;
if ((inlet_trig > 0) && !ntrig) {
count += 1;
if (count >= array[(cnt >= 0 ? cnt : 0) + Patt]) {
cnt += 1;
cnt = cnt - cnt / length * length;
count = 0;
outlet_c = 1;
}
ntrig = 1;
} else if (!(inlet_trig > 0))
ntrig = 0;
outlet_rst = (cnt == 0 ? 1 : 0) || rst;
outlet_steps = array[(cnt >= 0 ? cnt : 0) + Patt];
outlet_count = count;
outlet_stage = cnt;