#include "stdafx.h"
|
#include "Servo.h"
|
#include "RemoteEquipment.h"
|
|
namespace BEQ {
|
CServo::CServo()
|
{
|
m_pClientListener = nullptr;
|
m_servoListener.onRemoteEqConnecting = nullptr;
|
m_servoListener.onRemoteEqConnected = nullptr;
|
m_servoListener.onRemoteEqConnectFailed = nullptr;
|
m_servoListener.onRemoteEqDisconnecting = nullptr;
|
m_servoListener.onRemoteEqDisconnected = nullptr;
|
m_servoListener.onRemoteEqReadRawdata = nullptr;
|
m_servoListener.onRemoteEqEventUpdate = nullptr;
|
}
|
|
CServo::CServo(const char* pszName)
|
{
|
m_strName = pszName;
|
m_pClientListener = nullptr;
|
}
|
|
CServo::~CServo()
|
{
|
for (auto iter = m_clients.begin(); iter != m_clients.end(); iter++) {
|
delete *iter;
|
}
|
m_clients.clear();
|
|
if (m_pClientListener != nullptr) {
|
delete m_pClientListener;
|
m_pClientListener = nullptr;
|
}
|
|
if (m_pServer != nullptr) {
|
m_pServer->Close();
|
delete m_pServer;
|
m_pServer = nullptr;
|
}
|
|
for (auto item : m_remoteEquipments) {
|
delete (CRemoteEquipment*)item;
|
}
|
m_remoteEquipments.clear();
|
}
|
|
void CServo::setListener(BEQ::ServoListener listener)
|
{
|
m_servoListener.onRemoteEqConnecting = listener.onRemoteEqConnecting;
|
m_servoListener.onRemoteEqConnected = listener.onRemoteEqConnected;
|
m_servoListener.onRemoteEqConnectFailed = listener.onRemoteEqConnectFailed;
|
m_servoListener.onRemoteEqDisconnecting = listener.onRemoteEqDisconnecting;
|
m_servoListener.onRemoteEqDisconnected = listener.onRemoteEqDisconnected;
|
m_servoListener.onRemoteEqReadRawdata = listener.onRemoteEqReadRawdata;
|
m_servoListener.onRemoteEqEventUpdate = listener.onRemoteEqEventUpdate;
|
}
|
|
int CServo::getName(char* pszBuffer, int nMaxCount)
|
{
|
return strcpy_s(pszBuffer, nMaxCount, m_strName.c_str());
|
}
|
|
int CServo::createRemoteEquipment(IRemoteEquipment*& pRemoteEquipment, const char* pszAddr, int port)
|
{
|
CRemoteEquipment* p = new CRemoteEquipment(pszAddr, port);
|
pRemoteEquipment = (IRemoteEquipment*)p;
|
m_remoteEquipments.push_back(pRemoteEquipment);
|
|
RemoteEquipmentListener listener;
|
listener.onConnecting = [&](void* pRemoteEiuipment) -> void {
|
if (m_servoListener.onRemoteEqConnecting != nullptr) {
|
m_servoListener.onRemoteEqConnecting(this, pRemoteEquipment);
|
}
|
};
|
listener.onConnected = [&](void* pRemoteEiuipment) -> void {
|
if (m_servoListener.onRemoteEqConnected != nullptr) {
|
m_servoListener.onRemoteEqConnected(this, pRemoteEquipment);
|
}
|
};
|
listener.onConnectFailed = [&](void* pRemoteEiuipment, int errorCode) -> void {
|
if (m_servoListener.onRemoteEqConnectFailed != nullptr) {
|
m_servoListener.onRemoteEqConnectFailed(this, pRemoteEquipment, errorCode);
|
}
|
};
|
listener.onDisconnecting = [&](void* pRemoteEiuipment) -> void {
|
if (m_servoListener.onRemoteEqDisconnecting != nullptr) {
|
m_servoListener.onRemoteEqDisconnecting(this, pRemoteEquipment);
|
}
|
};
|
listener.onDisconnected = [&](void* pRemoteEiuipment) -> void {
|
if (m_servoListener.onRemoteEqDisconnected != nullptr) {
|
m_servoListener.onRemoteEqDisconnected(this, pRemoteEquipment);
|
}
|
};
|
listener.onRead = [&](void* pRemoteEiuipment, const char* pszData, int len) -> void {
|
if (m_servoListener.onRemoteEqReadRawdata != nullptr) {
|
m_servoListener.onRemoteEqReadRawdata(this, pRemoteEquipment, pszData, len);
|
}
|
};
|
listener.onEventUpdate = [&](void* pRemoteEiuipment, void* pUnit, REMOTE_EQ_EVENT eventCode) -> void {
|
if (m_servoListener.onRemoteEqEventUpdate != nullptr) {
|
m_servoListener.onRemoteEqEventUpdate(this, pRemoteEquipment, pUnit, eventCode);
|
}
|
};
|
p->setRemoteEquipmentListener(listener);
|
|
return 0;
|
}
|
|
int CServo::connectRemoteEquipment(IRemoteEquipment* pRemoteEquipment)
|
{
|
if (!findRemoteEquipment(pRemoteEquipment)) return -1;
|
return pRemoteEquipment->connect();
|
}
|
|
bool CServo::findRemoteEquipment(IRemoteEquipment* pRemoteEquipment)
|
{
|
for (auto item : m_remoteEquipments) {
|
if (item == pRemoteEquipment) return true;
|
}
|
|
return false;
|
}
|
|
int CServo::runOnServerMode(int port)
|
{
|
return -1;
|
|
// ÔÝʱ²»Ö§³ÖServerģʽ
|
m_pClientListener = new AcceptClientListener;
|
m_pClientListener->onClose = [&](void* pClient) -> int {
|
removeClient((CAcceptClient*)pClient);
|
return 0;
|
};
|
m_pClientListener->onRead = [&](void* pClient, const char* pData, int len) -> int {
|
AfxMessageBox(CString(pData, len));
|
return 0;
|
};
|
|
ServerListener listener;
|
listener.onAccept = [&](void* pServer, CAcceptClient* pClient) -> int {
|
addClient(pClient);
|
return 0;
|
};
|
listener.onClose = [&](void* pServer) -> int {
|
AfxMessageBox("onClose");
|
return 0;
|
};
|
|
m_pServer = new CSocketServer(port, listener);
|
m_pServer->init();
|
return 0;
|
}
|
|
int CServo::close()
|
{
|
return 0;
|
}
|
|
void CServo::addClient(CAcceptClient* pClient)
|
{
|
m_clients.push_back(pClient);
|
pClient->setListener(*m_pClientListener);
|
}
|
|
void CServo::removeClient(CAcceptClient* pClient)
|
{
|
for (auto iter = m_clients.begin(); iter != m_clients.end(); iter++) {
|
if (*iter == pClient) {
|
delete *iter;
|
m_clients.erase(iter);
|
break;
|
}
|
}
|
}
|
}
|