#ifndef UDPHANDLER_H #define UDPHANDLER_H #include #include #include #include #include "../../app-prime-modbus/include/all_share.h" class UdpHandler : public QObject { Q_OBJECT oven_control_t control; oven_state_t state; static UdpHandler *instance; public: static UdpHandler *getInstance() { if (instance == 0) { UdpHandler *u = new UdpHandler; if (u->init()) instance = u; } return instance; } bool init(); const oven_control_t &getControl() { return control; } const oven_state_t &getData() { return state; } bool burner1() { return (state.onoff_state1 & 0x0001) != 0; } bool burner2() { return (state.onoff_state1 & 0x0002) != 0; } bool burner3() { return (state.onoff_state1 & 0x0004) != 0; } bool burnerFan1() { return (state.onoff_state1 & 0x0008) != 0; } bool burnerFan2() { return (state.onoff_state1 & 0x0010) != 0; } bool burnerFan3() { return (state.onoff_state1 & 0x0020) != 0; } bool convection1() { return (state.onoff_state1 & 0x0040) != 0; } bool convection2() { return (state.onoff_state1 & 0x0080) != 0; } bool dv() { return (state.onoff_state2 & 0x0001) != 0; } bool cfan() { return (state.onoff_state2 & 0x0002) != 0; } bool wsv() { return (state.onoff_state2 & 0x0004) != 0; } bool qnv() { return (state.onoff_state2 & 0x0008) != 0; } bool ssv() { return (state.onoff_state2 & 0x0010) != 0; } bool snv() { return (state.onoff_state2 & 0x0020) != 0; } bool hl() { return (state.onoff_state2 & 0x0040) != 0; } bool dp() { return (state.onoff_state2 & 0x0080) != 0; } bool ssp() { return (state.onoff_state2 & 0x0100) != 0; } bool unp() { return (state.onoff_state2 & 0x0200) != 0; } bool hdm() { return (state.onoff_state2 & 0x0400) != 0; } bool sgnv() { return (state.onoff_state2 & 0x0800) != 0; } bool inv() { return (state.onoff_state2 & 0x1000) !=0; } // 3: H, 2: Error, 1: C, 0: L int waterLevel() { return ((state.water_level & 0x08) >> 2) | ((state.water_level & 0x10) >> 4); } int heater() { return (state.onoff_relay_load2 & 0x0F); } bool burnerState(int num) { switch (num) { case 1: return (state.burner1_state & 0x08) != 0; case 2: return (state.burner2_state & 0x08) != 0; case 3: return (state.burner3_state & 0x08) != 0; default: return false; } } signals: void changed(); void timeout(); void recovered(); public slots: void turnOn(int target); void turnOff(int target); void set(int target, int value); void fillControl(oven_control_t &container); void fillData(oven_state_t &container); private: explicit UdpHandler(QObject *parent = 0); void processDatagram(QByteArray &datagram); void processControl(oven_control_t *control); void processState(oven_state_t *state); QUdpSocket *sock; QTimer emitTimeoutTimer; bool emitted; private slots: void readPendingDatagrams(); void sendCommand(int cmd, int target, int value); void emitTimeout(); }; #endif // UDPHANDLER_H