/* CD Utils - Control-Debug utilites Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef CDUTILS_CORE_H #define CDUTILS_CORE_H #include "cdutils_types.h" #include "cdutils_protocol.h" #include "piconnection.h" #include "pidatatransfer.h" #include "cd_core_export.h" namespace CDUtils { class CDCore; typedef void (*Handler)(void*); class CD_CORE_EXPORT __Core_Initializer__ { public: __Core_Initializer__(); ~__Core_Initializer__(); static int count_; static CDCore * __instance__; }; class CD_CORE_EXPORT CDCore: public PIObject { PIOBJECT(CDUtils::CDCore); friend class __Core_Initializer__; friend class CDSection; friend class Interface; friend class XInterface; public: static CDCore * instance(); static bool destroy(); EVENT(K_Sended); EVENT(K_SendFail); EVENT(K_Received); EVENT(K_ReceiveFail); EVENT(K_ChangedGlobal); EVENT_HANDLER2(void, K_DirectChange, PIDeque, path, PIString, value); EVENT(X_Sended); EVENT(X_SendFail); EVENT(X_Received); EVENT(X_ReceiveFail); EVENT(X_ChangedGlobal); EVENT1(X_ReceivedX, PIVector >, pathes); EVENT(C_Sended); EVENT(C_SendFail); EVENT(C_Received); EVENT(C_ReceiveFail); EVENT(C_ChangedGlobal); EVENT(M_Sended); EVENT(M_SendFail); EVENT(M_Received); EVENT(M_ReceiveFail); EVENT(M_ChangedGlobal); EVENT3(M_Message, PIDeque, path, int, type, PIString, msg); void cd_write (CDSection * cd, PIIODevice * d); void cd_read (CDSection * cd, PIIODevice * d); void cd_parse (CDSection * cd, PIIODevice * d); void cd_update (CDSection * cd, PIIODevice * d, UpdateModeFlags mode); void cd_calculate(CDSection * cd); void cd_send (CDSection * cd, CDPacketType pt, bool direct = false); void send(CDType::cdT cdt); void request(CDType::cdT cdt); void initApp(); void initPult(); void init(const PIString & configuration, bool pult = false); void stop(); void release(); void startX(double freq = 20.); void stopX(); void sendCommand(const CDType & c); void registerCHandler(const CDType & c, PIObject * o, Handler h); bool inProgress() {return sendt.isRunning();} void sendMessage(const CDType & m, MessageType mt, const PIString & msg); CDSection * root(CDType::cdT cdt); PIString typeLetter(CDType::cdT cdt); static PIString pathToString(const PIDeque & p); static PIDeque stringToPath(const PIString & p); static PIString pultConfig() {return PIString(pult_config);} static PIString appConfig() {return PIString(app_config);} private: CDCore(); ~CDCore(); EVENT_HANDLER2(void, dataReceived, const PIString &, from, const PIByteArray &, data); EVENT_HANDLER1(void, dtSendRequest, PIByteArray &, data); EVENT_HANDLER1(void, dtReceiveFinished, bool, ok); EVENT_HANDLER(void, sendThread); EVENT_HANDLER(void, xTimerTick); EVENT_HANDLER2(void, piCoutFinished, int, id, PIString*, buffer); void initRoot(CDSection * r); PIByteArray makeHeader(CDPacketType type, int session_id = 0) const; void sendDirect(PIByteArray & ba); void sendThreaded(PIByteArray & ba); void procReceivedPacket(PIByteArray & ba); void raiseChangedGlobal(CDType::cdT cdt); typedef PIPair OHPair; static const char app_config[], pult_config[]; PIConnection connection; PIDataTransfer datatr; PIByteArray send_data; PIThread sendt; PITimer x_timer; CDSection k_, x_, c_, m_; PIMutex x_mutex; PIVector > x_selected; PIMap c_handlers; bool need_rebuild_x, x_pult_side; }; static __Core_Initializer__ __Core_initializer__; } #endif // CDUTILS_CORE_H