Цель:
В настоящее время у меня есть проект, который использует библиотеку 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();
}
}
Однако я хотел бы знать, есть ли другой способ, которым я мог бы пойти по этому поводуэто позволило бы использовать вложенные циклы или быть более блестящим.