I wrote a cstring
parser. It has to work with a relatively wide amount of arguments (usually 3 or 4, but maybe in future with a different amount), which are separated by an ,
or ;
. My wish is to make at least Function 1 less static and save some code. However, I don't really want to use dynamic memory allocation (just if it not to avoid and would bring a benefit). The whole code should run on ATMega2560. This is why I cannot use higher library functions.
Function 1:
float *Receiver::parse_pid_substr(char* buffer) {
static float pids[8];
memset(pids, 0, 8*sizeof(float) );
char cI[32], cII[32], cIII[32], cIV[32], cV[32], cVI[32], cVII[32], cVIII[32];
size_t i = 0, c = 0, p = 0;
for(; i < strlen(buffer); i++) {
if(buffer[i] == '\0') {
break;
}
else if(buffer[i] != ',') {
switch(p) {
case 0:
cI[c] = buffer[i];
cI[c+1] = '\0';
break;
case 1:
cII[c] = buffer[i];
cII[c+1] = '\0';
break;
case 2:
cIII[c] = buffer[i];
cIII[c+1] = '\0';
break;
case 3:
cIV[c] = buffer[i];
cIV[c+1] = '\0';
break;
case 4:
cV[c] = buffer[i];
cV[c+1] = '\0';
break;
case 5:
cVI[c] = buffer[i];
cVI[c+1] = '\0';
break;
case 6:
cVII[c] = buffer[i];
cVII[c+1] = '\0';
break;
case 7:
cVIII[c] = buffer[i];
cVIII[c+1] = '\0';
break;
}
c++;
} else {
p++;
c = 0;
continue;
}
}
pids[0] = atof(cI);
pids[1] = atof(cII);
pids[2] = atof(cIII);
pids[3] = atof(cIV);
pids[4] = atof(cV);
pids[5] = atof(cVI);
pids[6] = atof(cVII);
pids[7] = atof(cVIII);
return pids;
}
Function 2:
bool Receiver::parse_pid_conf(char* buffer) {
if(m_pHalBoard == NULL) {
return false;
}
else if(m_rgChannelsRC[2] > RC_THR_MIN) { // If motors run: Do nothing!
return false;
}
// process cmd
bool bRet = false;
char *str = strtok(buffer, "*"); // str = roll, pit, thr, yaw
char *chk = strtok(NULL, "*"); // chk = chksum
if(verf_chksum(str, chk) ) { // if chksum OK
char *cstr;
for(uint_fast8_t i = 0; i < PID_ARGS; i++) {
if(i == 0)
cstr = strtok (buffer, ";");
else cstr = strtok (NULL, ";");
float *pids = parse_pid_substr(cstr);
switch(i) {
case 0:
m_pHalBoard->m_rgPIDS[PID_PIT_RATE].kP(pids[0]);
m_pHalBoard->m_rgPIDS[PID_PIT_RATE].kI(pids[1]);
m_pHalBoard->m_rgPIDS[PID_PIT_RATE].imax(pids[2]);
break;
case 1:
m_pHalBoard->m_rgPIDS[PID_ROL_RATE].kP(pids[0]);
m_pHalBoard->m_rgPIDS[PID_ROL_RATE].kI(pids[1]);
m_pHalBoard->m_rgPIDS[PID_ROL_RATE].imax(pids[2]);
break;
case 2:
m_pHalBoard->m_rgPIDS[PID_YAW_RATE].kP(pids[0]);
m_pHalBoard->m_rgPIDS[PID_YAW_RATE].kI(pids[1]);
m_pHalBoard->m_rgPIDS[PID_YAW_RATE].imax(pids[2]);
break;
case 3:
m_pHalBoard->m_rgPIDS[PID_THR_ACCL].kP(pids[0]);
m_pHalBoard->m_rgPIDS[PID_THR_ACCL].kI(pids[1]);
m_pHalBoard->m_rgPIDS[PID_THR_ACCL].imax(pids[2]);
break;
case 4:
m_pHalBoard->m_rgPIDS[PID_PIT_STAB].kP(pids[0]);
m_pHalBoard->m_rgPIDS[PID_ROL_STAB].kP(pids[1]);
m_pHalBoard->m_rgPIDS[PID_YAW_STAB].kP(pids[2]);
m_pHalBoard->m_rgPIDS[PID_THR_STAB].kP(pids[3]);
bRet = true;
break;
}
}
}
return bRet;
}
::
makes it fail to parse as C. \$\endgroup\$