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\$