// OMRON600.h: interface for the RfID_Omron600 class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_OMRON600_H__171653B4_2BE8_4C09_B705_E2DCC061ACE6__INCLUDED_)
#define AFX_OMRON600_H__171653B4_2BE8_4C09_B705_E2DCC061ACE6__INCLUDED_
#pragma once

#include "utility.h"
#include "RfId.h"
#include "RfIdFactory.h"

enum RFID_FORMAT
{
    RFID_ASCII,
    RFID_HEX,
};

#pragma warning(push)
#pragma warning(disable:4481) // nonstandard extension used: override specifier 'override'

class RfID_Omron600 : public RfIdBase
{
public:
    explicit RfID_Omron600(int id);
    virtual ~RfID_Omron600();
    bool    WriteID(const CString &strID) override;
    bool    ReadID(CString *pResult) override;
    bool    TestComm() override;
    void    OnReceiveComm(const char *cpcBuffer, int nSize);
    CString GetErrorMessage() const override;

private:
    bool Send(const CString &data);
    bool ReadID(int unit, int head, CString *pResult);
    bool WriteID(int unit, int head, const CString &strID);

private:
    CString          m_strMsg;           /**< String containing error message */
    CMutex           m_portMutex;        /**< Mutex to prevent multiple readers from accessing serialport at the same time */
    CEvent           m_responseReceived; /**< Set when a response is received */
    CString          m_strReceived;      /**< String containing the response received */
    DWORD            m_nTimeOut;         /**< Timeout for waiting for reply */
    int              m_head;             /**< Read head configuration [1..2] */
    int              m_unit;             /**< Unit number [0..31] */
    int              m_nDataLength;      /**< Data length of RFID, currently fixed at 16 [16 or 32] */
    enum RFID_FORMAT m_eDataFormat;      /**< Data Format, Hex or ASCII */

    CString RestrictStringLength(const CString& strData);
    CString CalculateFCSAndFinalizeCmd(const CString& strCmd);
    CString GetRFIDErrorCodeString(const CString &strErrorCode);
    bool    IsReplyError(const CString &strCmd, const CString &strReply);
};

#pragma warning (pop)

#endif // !defined(AFX_OMRON600_H__171653B4_2BE8_4C09_B705_E2DCC061ACE6__INCLUDED_)
