#ifndef _ZJD_PORT_PROCESS_H_ #define _ZJD_PORT_PROCESS_H_ #include "process.h" class CPortProcessItem : public CProcessItem { public: int m_physicsAddress; int m_commonAddress; int m_originatorAddress; public: CPortProcessItem(); virtual ~CPortProcessItem(); virtual void Attach(int uid, int physicsAddress = 0, int commonAddress = 0, int originatorAddress = 0); virtual void Release(void); }; class CPortProcess : public CProcess { private: int m_serialfd; struPortBuffer buffers; private: int m_nPortNo; public: CPortProcess(); virtual ~CPortProcess(); virtual BOOLEAN OnPreCreate(int id); virtual BOOLEAN OnCreated(int id); virtual void Destroy(void); virtual BOOLEAN Run(void); virtual BOOLEAN OnTimer(void); inline LONG getBaudRate(void) { if(m_nPortNo < 0 || m_nPortNo >= HARDWARE_PORTS_NUM) return -1; return config.hardware.ports[m_nPortNo].baud; } inline int GetDataCount(void) { int count; count = buffers.in_save + MAX_PORT_BUFFER_SIZE - buffers.in_load; count &= (MAX_PORT_BUFFER_SIZE - 1); return count; } BOOLEAN FindData(BYTE nChar); void DropData(int count); BOOLEAN GetData(BYTE* pBuf, int count); inline int GetSpace(void) { int len; len = buffers.out_save + MAX_PORT_BUFFER_SIZE - buffers.out_load; len &= (MAX_PORT_BUFFER_SIZE - 1); return (MAX_PORT_BUFFER_SIZE - len); } BOOLEAN WriteData(const BYTE* pData, int count); int GetTimeout(void) const; BOOLEAN SerialPortOpen(void); void SerialPortClose(void); void SerialPortRead(unsigned long timeout = 20000); void SerialPortWrite(void); virtual BOOLEAN SerialPortTimeout(void); inline void SerialPortDiscardInBuffer(void) { tcflush(m_serialfd, TCIOFLUSH); } public: virtual CPortProcessItem *CreateItem(int ord); virtual void DestroyItem(int ord, BOOLEAN bDeleted = FALSE); inline virtual CPortProcessItem *GetItem(int ord) const { if (ord < 0 || ord >= PROCESS_UNIT_NUM) return NULL; return (CPortProcessItem *)m_pItems[ord]; } inline virtual CPortProcessItem *GetCurItem(void) const { return (CPortProcessItem *)GetItem(GetCurOrder()); } inline virtual CPortProcessItem *GetNextItem(void) { GetNextUnit(); return (CPortProcessItem *)GetCurItem(); } }; #endif //_ZJD_PORT_PROCESS_H_