SdFat (библиотека Arduino) Функция повторного чтения - PullRequest
0 голосов
/ 06 декабря 2018

Цель:

В настоящее время у меня есть проект, который использует библиотеку SdFat Греймана для чтения N-строки, 2-колоночного файла .csv по одной строке в память моего Arduino.

Я хотел бы расширить свою функцию, чтобы включить строки repeat и end repeat (здесь R,n и R,/, но любые другие символы, идеально представленные на клавиатуре США, будут приемлемы).пример: файл .csv, содержащий:

1,2
R,3
4,5
6,7
R,/
8,9

При повторных вызовах возвращается.

1,2
4,5
6,7
4,5
6,7
4,5
6,7
8,9

Ожидания

  • Для моего текущего приложения,Мне не нужна способность вкладывать петли, но если это можно сделать без особых дополнительных усилий, это будет оценено.

  • Если существует несоответствие между числом repeat и end repeat rows допустимы любые разумные действия, кроме бесконечного цикла.

  • Если часть кода skip Specified lines затрудняет решение, его можно опустить (у меня естьэто теперь, чтобы пропустить информацию заголовка в файле, но я моготдельно от другой функции)

Текущий код:

Для моей функции у меня есть следующие глобальные переменные:

bool SdDebug Пометить для печатиотладочная информация на экране

SdFile ActiveFile глобально для файла, который я открываю с помощью другой функции

В текущем состоянии моя текущая функция выглядит следующим образом:

bool SDClass::RunGet(int skip, double &ColA, unsigned long &ColB)
{ 
  //Setup Local vars  
  if(SdDebug){Serial.print("RunGet s=");Serial.println(skip);}
  bool goodread=false;
  char filechar;
  int16_t readbytes;
  char Linebuffer[50];

  //skip Specified lines
  for (int i=0; i < skip; i++)
  {
    ActiveFile.fgets(Linebuffer,sizeof(Linebuffer));
    if(SdDebug){Serial.print("skip line: ");Serial.println(Linebuffer);}
  }

  //Read Desired Line
  String data="";
  readbytes=ActiveFile.fgets(Linebuffer,sizeof(Linebuffer));
  data=Linebuffer;
  if(readbytes>0)
  {
    int commaIndex = data.indexOf(",");  
    String cola = data.substring(0,commaIndex);
    String colb = data.substring(commaIndex+1);
    ColA = cola.toDouble();
    ColB = 1000*atol(colb.c_str());
    goodread=true;            
  }
  return goodread;
  }

Ожидаемое решение:

Я думаю, вы можете использовать библиотеку available(), чтобы получить позицию из конца файла, и seekCur(int32_t offset), чтобы переместить позиции в файле.Таким образом, я бы ожидал, что решение будет выглядеть примерно так:

//Read Desired Line
uint32_t From_back = ActiveFile.available();
  String data="";
  readbytes=ActiveFile.fgets(Linebuffer,sizeof(Linebuffer));
  data=Linebuffer;
if(readbytes>0)
{
  int commaIndex = data.indexOf(",");  
  cola = data.substring(0,commaIndex);
  colb = data.substring(commaIndex+1);
  if (cola = 'R')
  {
    manage_ForLoop(From_back, colb);
    readbytes=ActiveFile.fgets(Linebuffer,sizeof(Linebuffer));
    commaIndex = data.
  }
  cola = data.substring(0,commaIndex);
  colb = data.substring(commaIndex+1);
  ColA = cola.toDouble();
  Colb = 1000*atol(colb.c_str());
  goodread =true;
}

Где

void manage_ForLoop(uint32_t Fb, String colb)
{
  static uint32_t FromPosition;
  static int Rptno;
  if (colb = `/`)
  {
    Rptno--;
    if(Rptno > 0)
    {
      ActiveFile.seekEnd(FromPosition);
    }
  }
  else
  {
    FromPosition = Fb;
    Rptno=colb.toInt();
  }
}

Однако я хотел бы знать, есть ли другой способ, которым я мог бы пойти по этому поводуэто позволило бы использовать вложенные циклы или быть более блестящим.

...