bool CommandParser::ParseCommand(const String& command, Command& outCommand) { Clear(); // clear first if(command.length() < MIN_COMMAND_LENGTH) return false; const char* readPtr = command.c_str(); bool rightPrefix = !strncmp_P(readPtr,(const char*)CMD_PREFIX,CMD_PREFIX_LEN);// || !strncmp_P(readPtr,(const char*)CHILD_PREFIX,CMD_PREFIX_LEN); if(!rightPrefix) return false; // перемещаемся за префикс (CT или CD) readPtr += CMD_PREFIX_LEN; // проверяем, GET или SET должно быть передано bool isGet = !strncmp_P(readPtr,(const char*)CMD_GET,CMD_TYPE_LEN); bool rightType = isGet || !strncmp_P(readPtr,(const char*)CMD_SET,CMD_TYPE_LEN); if(!rightType) return false; uint8_t commandType = isGet ? ctGET : ctSET; // перемещаемся за тип команды и знак '=' readPtr += CMD_TYPE_LEN + 1; // ищем, есть ли разделитель в строке. Если он есть, значит, передали ещё и параметры помимо просто имени модуля const char* delimPtr = strchr(readPtr,'|'); if(!delimPtr) { // без параметров, тупо конструируем и выходим outCommand.Construct(readPtr,NULL,commandType); return true; } // есть параметры, надо выцепить имя модуля size_t len = (delimPtr - readPtr); char* moduleName = new char[len+1]; memset(moduleName,0,len+1); strncpy(moduleName,readPtr,len); delimPtr++; outCommand.Construct(moduleName,delimPtr,commandType); delete[] moduleName; return true; }
void LoopModule::Update(uint16_t dt) { size_t sz = vec.size(); for(size_t i=0;i<sz;i++) { LoopLink* lnk = vec[i]; if(!lnk->bActive || !lnk->interval || (lnk->countPasses > 0 && lnk->currPass >= lnk->countPasses)) // связанный модуль неактивен { continue; } lnk->lastTimerVal += dt; if(lnk->lastTimerVal >= lnk->interval) { // need to do the job lnk->lastTimerVal = lnk->lastTimerVal - lnk->interval; // конструируем команду Command com; com.Construct(lnk->linkedModule->GetID(),lnk->paramsToPass.c_str(),lnk->commandType); com.SetInternal(true); // говорим, что команда - от одного модуля к другому MainController->ProcessModuleCommand(com,lnk->linkedModule); if(lnk->countPasses > 0) { lnk->currPass++; if(lnk->currPass >= lnk->countPasses) // все проходы выполнены { lnk->currPass = 0; lnk->bActive = false; } // if } // if(lnk->countPasses > 0) } // if } // for }