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
}