tsaveload

save and load table to sdcard
Author: Johannes Taelman edit by Remco van der Most
License: BSD
Github: rbrt/testing/tsaveload.axo

Inlets

bool32.rising trigger

bool32.rising trigger

Outlets

bool32 done

int32 test

Attributes

spinner count

objref t1

objref t2

objref t3

objref t4

objref t5

objref t6

table fn1

table fn2

table fn3

table fn4

table fn5

table fn6

Declaration
char c[64];
int offset;
int pval;
uint8_t index;
bool save;
bool load;
bool busy;
bool trig;
int rem_sz;
char *t_adr;

char fn[32];
Init
strcpy(&c[0], "attr_prefix000attr_suffix");
offset = strlen("attr_prefix");
pval = 0;
Control Rate
outlet_done = 0;

switch (index ? index : 0) {
case 0: {
  rem_sz = sizeof(*attr_t1.array) * attr_t1.LENGTH;
  t_adr = (char *)(&attr_t1.array[0]);
  memcpy(&fn[0], "attr_fn1", strlen("attr_fn1"));
  break;
}
case 1: {
  rem_sz = sizeof(*attr_t2.array) * attr_t2.LENGTH;
  t_adr = (char *)(&attr_t2.array[0]);
  memcpy(&fn[0], "attr_fn2", strlen("attr_fn2"));
  break;
}
case 2: {
  rem_sz = sizeof(*attr_t3.array) * attr_t3.LENGTH;
  t_adr = (char *)(&attr_t3.array[0]);
  memcpy(&fn[0], "attr_fn3", strlen("attr_fn3"));
  break;
}
case 3: {
  rem_sz = sizeof(*attr_t4.array) * attr_t4.LENGTH;
  t_adr = (char *)(&attr_t4.array[0]);
  memcpy(&fn[0], "attr_fn4", strlen("attr_fn4"));
  break;
}
case 4: {
  rem_sz = sizeof(*attr_t5.array) * attr_t5.LENGTH;
  t_adr = (char *)(&attr_t5.array[0]);
  memcpy(&fn[0], "attr_fn5", strlen("attr_fn5"));
  break;
}
case 5: {
  rem_sz = sizeof(*attr_t6.array) * attr_t6.LENGTH;
  t_adr = (char *)(&attr_t6.array[0]);
  memcpy(&fn[0], "attr_fn6", strlen("attr_fn6"));
  break;
}
}

if (inlet_save && !trig) {
  save = 1;
  index = 0;
  busy = 1;
  trig = 1;
}
if (!inlet_save && !busy)
  trig = 0;

if (save && (index < attr_count)) {
  FIL FileObject;
  FRESULT err;
  UINT bytes_written;
  err = f_open(&FileObject, fn, FA_WRITE | FA_CREATE_ALWAYS);
  if (err != FR_OK) {
    report_fatfs_error(err, fn);
    return;
  }
  int offset = 0;
  while (rem_sz > 0) {
    if (rem_sz > sizeof(fbuff)) {
      memcpy((char *)fbuff, t_adr + offset, sizeof(fbuff));
      err = f_write(&FileObject, fbuff, sizeof(fbuff), &bytes_written);
      rem_sz -= sizeof(fbuff);
      offset += sizeof(fbuff);
    } else {
      memcpy((char *)fbuff, t_adr + offset, rem_sz);
      err = f_write(&FileObject, fbuff, rem_sz, &bytes_written);
      rem_sz = 0;
    }
  }
  if (err != FR_OK)
    report_fatfs_error(err, fn);
  err = f_close(&FileObject);
  if (err != FR_OK)
    report_fatfs_error(err, fn);
  index++;
  if (index == attr_count) {
    save = 0;
    busy = 0;
    outlet_done = 1;
  }
}

if (inlet_load && !trig) {
  load = 1;
  index = 0;
  busy = 1;
  trig = 1;
}
if (!inlet_load && !busy)
  trig = 0;

if (load && (index < attr_count)) {
  FIL FileObject;
  FRESULT err;
  UINT bytes_read;
  err = f_open(&FileObject, fn, FA_READ | FA_OPEN_EXISTING);
  if (err != FR_OK) {
    report_fatfs_error(err, fn);
    return;
  }
  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(t_adr + offset, (char *)fbuff, bytes_read);
      rem_sz -= bytes_read;
      offset += bytes_read;
    } else {
      err = f_read(&FileObject, fbuff, rem_sz, &bytes_read);
      memcpy(t_adr + offset, (char *)fbuff, bytes_read);
      rem_sz = 0;
    }
  }
  if (err != FR_OK) {
    report_fatfs_error(err, fn);
    return;
  };
  err = f_close(&FileObject);
  if (err != FR_OK) {
    report_fatfs_error(err, fn);
    return;
  };
  index++;
  if (index == attr_count) {
    load = 0;
    busy = 0;
    outlet_done = 1;
  }
}

outlet_test = index;

Privacy

© 2024 Zrna Research