123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- #include "stdafx.h"
- #include "DIOSBoardCommunicateEntity.h"
- #include "DIOSBoardProtocolHelper.h"
- #include "IDIOSBoardController.h"
- #include "DIOSBoardFactory.h"
- #include "IDIOSBoardPacketRecevier.h"
- #include "IOInterfaceMapper.h"
- #include "NotifyPacket.h"
- using namespace DIOS::Dev::Communication::Detail;
- using namespace DIOS::Dev::Detail::MachineryECOM;
- DIOSBoardCommunicateEntity::DIOSBoardCommunicateEntity()
- :m_DiosBoard(nullptr),
- m_SendPacket(nullptr),
- m_ReceivePacket(nullptr)
- {
- }
- DIOSBoardCommunicateEntity::~DIOSBoardCommunicateEntity()
- {
- if (m_SendPacket)
- {
- ReleaseSCFPacket(m_SendPacket);
- }
- if (m_ReceivePacket)
- {
- ReleaseSCFPacket(m_ReceivePacket);
- }
- }
- bool DIOSBoardCommunicateEntity::Initialize(IDIOSBoardPacketRecevier *packetReceiver)
- {
- if (packetReceiver)
- {
- AddReceiver(packetReceiver);
- }
- m_SendPacket = (SCFPacket *)MallocSCFPacket();
- m_ReceivePacket = (SCFPacket *)MallocSCFPacket();
- return true;
- }
- bool DIOSBoardCommunicateEntity::Connect(SCF* pSCF, ResDataObject& Connection,HANDLE disconnectListenerhandle, const std::string &ioboardName)
- {
- bool connected = false;
- if (!m_DiosBoard)
- {
- auto boardname = ioboardName;
- if (boardname == "")
- {
- boardname = ECOM_DIOSBOARD;
- }
- //if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Create Diosboard controller %s]", boardname.c_str());
- { if (gcommLog) { gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Create Diosboard controller {$}]", boardname.c_str()); } }
- m_DiosBoard = DIOSBoardFactory::Instance()->CreateSingleton(boardname/*ECOM_DIOSBOARD*/);
- if (m_DiosBoard)
- {
- m_DiosBoard->Initialize(pSCF);
- m_DiosBoard->SetPassiveDisconnectEventHandle(disconnectListenerhandle);
- }
-
- }
- if (m_DiosBoard)
- {
- if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Start to connect diosboard]");
- connected = m_DiosBoard->Connect(Connection);
- if (connected)
- {
- connected = SendInitDiosBoardCommands();
- if(gcommLog) gcommLog->Info("[DIOSBoardCommunicateEntity][Connect]->[Connected]");
- }
- }
- return connected;
- }
- bool DIOSBoardCommunicateEntity::Disonnect()
- {
- if (m_DiosBoard)
- {
- return m_DiosBoard->Disonnect();
- }
- return m_DiosBoard != nullptr;
- }
- int DIOSBoardCommunicateEntity::GPIO_DO_Ctrl(DIOSBOARD_OP op, GPIO_DO_ID id, GPIO_DO_ATTRIBUTE attr, GPIO_DO_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeGpioDOSetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- else if (op == OP_WRITE)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeGpioDOWritePacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- m_DiosBoard->UnLock();
-
- return 0;
- }
- int DIOSBoardCommunicateEntity::GPIO_DI_Ctrl(DIOSBOARD_OP op, GPIO_DI_ID id, GPIO_DI_ATTRIBUTE attr, GPIO_DI_PARAM ¶ms)
- {
- if (op == OP_SET)
- {
- m_DiosBoard->Lock();
- if (DIOSBoardProtocolHelper::Instance()->MakeGpioDISetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- m_DiosBoard->UnLock();
- }
- else if (op == OP_READ)
- {
- FUNCTIONID functionid;
- functionid.CharPart = id;
- char context[4] = { 0 };
- int readLen = Read(functionid, context, 4);
- if (readLen > 0)
- {
- if (params.input_mode == GIM_DIGITAL)
- {
- params.active_level = context[0];
- }
- else if (params.input_mode == GIM_PULSE_COUNT && readLen >= 2)
- {
- params.pulse_count.pulse_count_byte.pulse_count_lowbyte = context[0];
- params.pulse_count.pulse_count_byte.pulse_count_highbyte = context[1];
- }
- }
- }
- return 0;
- }
- int DIOSBoardCommunicateEntity::AD_Ctrl(DIOSBOARD_OP op, AD_ID id, AD_ATTRIBUTE attr, AD_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeADSetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- else if (op == OP_READ)
- {
- FUNCTIONID functionid;
- functionid.CharPart = id;
- char context[4] = { 0 };
- int readLen = Read(functionid, context, 4);
- if (readLen > 0)
- {
- params.ad_value.ad_value_btye.ad_lowbyte = context[0];
- params.ad_value.ad_value_btye.ad_highbyte = context[1];
- }
- }
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::RS232_Ctrl(DIOSBOARD_OP op, RS232_ID id, RS232_ATTRIBUTE attr, RS232_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeRS232SetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- else if (op == OP_WRITE)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeData485WritePacket(
- (const char *)params.rs485.data(), (unsigned int)params.rs485.length(), m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
-
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::CAN_Ctrl(DIOSBOARD_OP op, CAN_ID id, CAN_ATTRIBUTE attr, CAN_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeCanSetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- else if (op == OP_READ)
- {
- ReadCanData(id, params.can_stdid, m_SendPacket, m_ReceivePacket, params);
- }
- else if (op == OP_WRITE)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeCanWritePacket(id,params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::SEC_Ctrl(DIOSBOARD_OP op, SEC_ID id, SEC_ATTRIBUTE attr, SEC_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeSECSetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- else if (op == OP_READ)
- {
- FUNCTIONID functionid;
- functionid.CharPart = id;
- char context[8] = { 0 };
- int readLen = Read(functionid, context, 8);
- if (readLen > 0)
- {
- params.encoder_value.encoder_value_byte.encoder_lowbyte_0 = context[0];
- params.encoder_value.encoder_value_byte.encoder_lowbyte_1 = context[1];
- params.encoder_value.encoder_value_byte.encoder_highbyte_0 = context[2];
- params.encoder_value.encoder_value_byte.encoder_highbyte_1 = context[3];
- }
- }
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::SCL_Ctrl(DIOSBOARD_OP op, SCL_ID id, SCL_ATTRIBUTE attr, SCL_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_SET)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeSCLSetPacket(id, attr, params, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::ExposureCtrl(DIOSBOARD_OP op, EXPOSURE_ID id, EXPOSURE_PARAM ¶ms)
- {
- m_DiosBoard->Lock();
- if (op == OP_WRITE)
- {
- if (DIOSBoardProtocolHelper::Instance()->MakeExposureWritePacket(id, params.active_level, m_SendPacket))
- {
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- }
- }
- m_DiosBoard->UnLock();
- return 0;
- }
- int DIOSBoardCommunicateEntity::MCU_Ctrl(DIOSBOARD_OP op, MCU_ID id, MCU_ATTRIBUTE attr, MCU_PARAM ¶ms)
- {
- if (op == OP_READ)
- {
- if (attr == MCU_ATTR_VERSION)
- {
- FUNCTIONID functionid;
- functionid.CharPart = (unsigned char)id;
- char context[1] = { (char)attr };
- char rescontext[20] = {0};
- if (ReadEx(functionid, context, 1, rescontext, 20) > 0)
- {
- params.mcu_version.version_byte.version_lowbyte = rescontext[0];
- params.mcu_version.version_byte.version_highbyte = rescontext[1];
- }
- }
- }
- return 0;
- }
- bool DIOSBoardCommunicateEntity::SendInitDiosBoardCommands()
- {
- bool bRes = true;
- if (!m_DiosBoard)
- {
- return false;
- }
- return bRes;
- }
- int DIOSBoardCommunicateEntity::Read(FUNCTIONID Id, char *pszContext, unsigned int PacketLen)
- {
- if (!m_DiosBoard)
- {
- return -1;
- }
- m_DiosBoard->Lock();
- DIOSBoardProtocolHelper::Instance()->MakeReadDataPacket(Id, m_SendPacket);
- m_DiosBoard->ReceiveACK(m_SendPacket, m_ReceivePacket, pszContext, PacketLen);
- m_DiosBoard->UnLock();
- return PacketLen;
- }
- int DIOSBoardCommunicateEntity::ReadEx(FUNCTIONID Id, char *pszRes, unsigned int ResLen, char *pszContext, unsigned int PacketLen)
- {
- if (!m_DiosBoard)
- {
- return -1;
- }
- m_DiosBoard->Lock();
- DIOSBoardProtocolHelper::Instance()->MakeReadDataExPacket(Id, pszRes, ResLen, m_SendPacket);
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- int retLen = -1;
- if (ReceiveACK(m_SendPacket, m_ReceivePacket, DIOSCTRLCPU_COM_TIMEOUT))
- {
- CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(*m_ReceivePacket));
- int dataLen = pReceiveHead->FrameSize - 5;
- dataLen = min((int)PacketLen, dataLen);
- if (dataLen > 0)
- {
- unsigned char *pData = &(pReceiveHead->Data1);
- memcpy(pszContext, pData, dataLen);
- }
- retLen = dataLen;
- }
- m_DiosBoard->UnLock();
- return retLen;
- }
- int DIOSBoardCommunicateEntity::ReadFrame(FUNCTIONID Id, char *pszContext, unsigned int PacketLen, unsigned char FrameCmd)
- {
- unsigned int readLen = 0;
- if (!m_DiosBoard)
- {
- return readLen;
- }
- m_DiosBoard->Lock();
- DIOSBoardProtocolHelper::Instance()->MakeReadDataPacket(Id, m_SendPacket);
- m_DiosBoard->ReceiveFrame(m_SendPacket, m_ReceivePacket, Id, FrameCmd, pszContext, PacketLen, readLen);
- m_DiosBoard->UnLock();
- return readLen;
- }
- int DIOSBoardCommunicateEntity::ReadCanData(CAN_ID Id, unsigned short stdid, SCFPacket *sendPacket, SCFPacket *RecvPacket, CAN_PARAM ¶ms)
- {
- if (!m_DiosBoard)
- {
- return -1;
- }
- if (!DIOSBoardProtocolHelper::Instance()->MakeCanWritePacket(Id, params, m_SendPacket))
- {
- return -1;
- }
- m_DiosBoard->Lock();
- m_DiosBoard->Send(m_SendPacket, m_ReceivePacket);
- auto ret = ReceiveCanFream(Id,stdid,params);
- m_DiosBoard->UnLock();
- return ret?0:-1;
- }
- void DIOSBoardCommunicateEntity::OnReceivedPacketNotMatched(SCFPacket *RecvPacket)
- {
- if (m_DiosBoard)
- {
- m_DiosBoard->QueNotifyPacket(RecvPacket);
- }
- }
- void DIOSBoardCommunicateEntity::OnReceiveFrameNotMatched(char *packet, int length)
- {
- m_ReceivePacket->SetPacket(packet, length);
- NotifyPacket notifyPacket(m_ReceivePacket);
- Notify(notifyPacket);
- }
- bool DIOSBoardCommunicateEntity::ReceiveACK(SCFPacket *sendPacket, SCFPacket *RecvPacket,DWORD timeout)
- {
- return false;
- }
- bool DIOSBoardCommunicateEntity::ReceiveFrame(FUNCTIONID Id, unsigned char FrameCmd, char *pszContext,unsigned int PacketLen, unsigned int& nDataLen, DWORD Timeout)
- {
- return false;
- }
- union _canStdid
- {
- unsigned short stdid_short;
- struct _ststdid
- {
- unsigned char low_byte;
- unsigned char high_byte;
- } stdid_byte;
- };
- bool DIOSBoardCommunicateEntity::ReceiveCanFream(CAN_ID Id, unsigned short stdid, CAN_PARAM ¶ms, DWORD Timeout)
- {
- //TPRINTA_DEBUG("Enter ReceiveCanFream");
- //DWORD StartTick = GetTickCount();
- //DWORD TimePeriod = Timeout;
- //int nPacketLen = 0;
- //char pPacket[MAX_PATH] = { 0 };
- //while ((GetTickCount() - StartTick) < Timeout)
- //{
- // memset(pPacket, 0, MAX_PATH);
- // if ((nPacketLen = m_DiosBoard->Receive(pPacket, MAX_PATH, 500)) > 0)
- // {
- // CTRLPACKETHEAD *pReceiveHead = (CTRLPACKETHEAD *)((char *)(pPacket));
- // if (pReceiveHead->FrameCmd == 0xFE
- // && pReceiveHead->FuncId == (unsigned char)Id
- // )
- // {
- // _canStdid canstdid;
- // canstdid.stdid_byte.low_byte = pReceiveHead->Data2;
- // canstdid.stdid_byte.high_byte = pReceiveHead->Data3;
- // if (canstdid.stdid_short == params.can_stdid)
- // {
- // int canDataLen = pReceiveHead->Data4;
- // if (canDataLen > 8 || canDataLen < 0)
- // {
- // canDataLen = 8;
- // }
- // params.candata.clear();
- // for (int i = 0; i < canDataLen;++i)
- // {
- // params.candata.push_back(((unsigned char*)&pReceiveHead->Data5)[i]);
- // }
- // }
- // TPRINTA_DEBUG("Leave ReceiveResult, WaitIO NOTIFY:SUCCEED");
- // return true;
- // }
- // else
- // {
- // TPRINTA_DEBUG("Got Other Packet");
- // OnReceiveFrameNotMatched(pPacket, nPacketLen);
- // }
- // }
- // else
- // {
- // TPRINTA_DEBUG("WaitIO NOTIFY:FAILED");
- // }
- //}
- //TPRINTA_DEBUG("Leave ReceiveResult, WaitIO NOTIFY:FAILED");
- //TPRINTA_ERROR("Leave ReceiveResult, WaitIO NOTIFY:FAILED");
- return false;
- }
|