Текущий раздел:

Описания RDS

Руководство программиста

Глава 2. Создание моделей блоков

§2.9. Использование таймеров

§2.9.3. Однократно срабатывающий таймер

Полный исходный текст на языке C++ для библиотеки (DLL) с моделью блока с мигающим изображением, время «горения» у которого не совпадает с временем «паузы» (используется перезапускаемый однократно срабатывающий таймер). Изменения относительно модели из §2.9.2 выделены цветом.

      // Однократно срабатывающий таймер для мигания блока
      #include <windows.h>
      #include <RdsDef.h>
      // Подготовка описаний сервисных функций
      #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
      #include <RdsFunc.h>

      //========== Главная функция DLL ==========
      int WINAPI DllMain(HINSTANCE /*hinst*/,
                               unsigned long reason,
                               void* /*lpReserved*/)
      { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
          { // Получение доступа к функциям RDS
            if(!GetInterfaceFunctions())
              RDS_SERV_ERROR_MSGW // Сообщение: старая версия RDS
          }
        return 1;
      }
      //========= Конец главной функции =========

      //============= Модель блока ==============
      extern "C" __declspec(dllexport) int RDSCALL SimpleFlash1(
              int CallMode,
              RDS_PBLOCKDATA BlockData,
              LPVOID ExtParam)
      {
      // Макроопределения для статических переменных
      #define pStart ((char *)(BlockData->VarTreeData))
      #define Start (*((char *)(pStart)))
      #define Ready (*((char *)(pStart+RDS_VSZ_S)))
      #define Flash (*((char *)(pStart+2*RDS_VSZ_S)))
      #define State (*((char *)(pStart+2*RDS_VSZ_S+RDS_VSZ_L)))
        // Вспомогательная переменная – указатель на личную область
        // В личной области хранится только идентификатор таймера
        RDS_TIMERID *data=(RDS_TIMERID*)(BlockData->BlockData);
        // Структура описания таймера
        RDS_TIMERDESCRIPTION descr;

        switch(CallMode)
          { // Инициализация блока
            case RDS_BFM_INIT:
              // Отводим место для хранения идентификатора таймера
              BlockData->BlockData=data=new RDS_TIMERID;
              // Создаем таймер, интервал пока не устанавливаем
              *data=rdsSetBlockTimer(NULL,0,
                      RDS_TIMERM_STOP|RDS_TIMERS_TIMER,FALSE);
              break;

            // Очистка данных блока
            case RDS_BFM_CLEANUP:
              // Уничтожаем таймер
              rdsDeleteBlockTimer(*data);
              // Освобождаем память, где он хранился
              delete data;
              break;

            // Проверка типа статических переменных
            case RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSLL}"))
                return RDS_BFR_BADVARSMSG;
              return RDS_BFR_DONE;

            // Такт расчета
            case RDS_BFM_MODEL:
              // Запрашиваем параметры таймера
              descr.servSize=sizeof(descr);
              rdsGetBlockTimerDescr(*data,&descr);
              if(Flash) // Включаем мигание, если таймер остановлен
                { if(!descr.On) // Таймер остановлен
                    { rdsRestartBlockTimer(*data,500);
                      State=1;
                    }
                }
              else // Выключаем мигание, если таймер работает
                { if(descr.On) // Таймер работает
                    { rdsStopBlockTimer(*data);
                      State=0;
                    }
                }
              break;

            // Срабатывание таймера
            case RDS_BFM_TIMER:
              if(State) // Индикатор был "зажжен"
                { // Гасим и запускаем таймер на 1 сек
                  State=0;
                  rdsRestartBlockTimer(*data,1000);
                }
              else // Индикатор был "погашен"
                { // Зажигаем и запускаем таймер на 500 мс
                  State=1;
                  rdsRestartBlockTimer(*data,500);
                }
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений для переменных
      #undef State
      #undef Flash
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=================================================