Files
EF3-Interface/PcDmis/Base/Interfac/Msi/Hsi/KeyenceTM065/Keyence_Proto.cpp
T
TAO Cheng 5a8e27e70d Merge
2013-07-22 14:34:50 +08:00

286 lines
9.0 KiB
C++

#include "stdafx.h"
#include "Keyence_Proto.h"
#include "KeyenceStatus.h"
#define MY_CONFIG 1
#define MAX_DEVPATH_LENGTH 256
#define ENDPOINT_TIMEOUT 500
//******************************************************************************
// Look at the return data from EP_01
// The result determines how many EP_82 we need to send out based on _cmd0 and _cmd1.
//
void CKeyence_Proto::_process_rcv_transfer_data_ep01()
{
switch (ep_buff_ep01._cmd0)
{
case _CMD0_0800:
break;
case _CMD0_0C00:
switch (ep_buff_ep01._cmd1)
{
case _CMD1_0730:
break;
default:
break;
};
case _CMD0_100a:
break;
case _CMD0_1400:
break;
case _CMD0_3000:
break;
case _CMD0_4800:
break;
case _CMD0_4c00:
break;
default:
break;
};
};
//******************************************************************************
void CKeyence_Proto::_process_rcv_transfer_data_ep82()
{
_process_KEYENCE_CMD_GET_LASER_DATA();
};
//******************************************************************************
CKeyence_Proto::CKeyence_Proto()
{
ep_buff_ep82._buff = (char *)malloc(MAX_KEYENCE_EP_01_BUFF_SIZE);
ep_buff_ep01._buff = (char *)malloc(MAX_KEYENCE_EP_82_BUFF_SIZE);
ep_buff_ep01._size = 0;
ep_buff_ep82._size = 0;
ep_buff_ep01._async_context = NULL;
ep_buff_ep82._async_context = NULL;
ep_buff_ep01._cmd0 = 0;
ep_buff_ep82._cmd0 = 0;
ep_buff_ep01._cmd1 = 0;
ep_buff_ep82._cmd1 = 0;
};
//******************************************************************************
CKeyence_Proto::~CKeyence_Proto()
{
free(ep_buff_ep82._buff);
free(ep_buff_ep01._buff);
}
#pragma warning(disable:4996)
//******************************************************************************
//******************************************************************************
usb_dev_handle* CKeyence_Proto::_open_usb_dev(void)
{
struct usb_bus *bus = NULL;
struct usb_device *dev = NULL;
for (bus = usb_get_busses(); bus; bus = bus->next)
{
for (dev = bus->devices; dev; dev = dev->next)
{
if (dev->descriptor.idVendor == KEYENCE_VID && dev->descriptor.idProduct == KEYENCE_PID)
{
return usb_open(dev);
}
}
}
return NULL;
}
//******************************************************************************
int CKeyence_Proto::_usb_reset(void)
{
if (g_dev)
{
usb_reset(g_dev);
g_dev = NULL;
}
else
{
ASSERT(0);
return -1;
}
return -1;
}
//******************************************************************************
int CKeyence_Proto::Init_Keyence()
{
int usb_status = NULL;
usb_init(); // initialize the library
usb_status = usb_find_busses(); // find all busses
usb_status = usb_find_devices(); // find all connected devices
g_dev = _open_usb_dev();
if (!g_dev)
{
MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK);
return KEYENCE_STATUS_DATALINK_ERROR;
}
if (usb_set_configuration(g_dev, MY_CONFIG) < 0)
{
MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK);
return KEYENCE_STATUS_DATALINK_ERROR;
}
if (usb_claim_interface(g_dev, 0) < 0)
{
usb_close(g_dev);
MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK);
return KEYENCE_STATUS_DATALINK_ERROR;
}
return KEYENCE_STATUS_NORMAL;
}
//******************************************************************************
int CKeyence_Proto::Exit_Keyence()
{
if (g_dev)
{
usb_release_interface(g_dev,0);
usb_close(g_dev);
g_dev = NULL;
}
return KEYENCE_STATUS_NORMAL;
}
//******************************************************************************
// This startup just kicks off the EP_KEYENCE_81 worker thread.
//******************************************************************************
int CKeyence_Proto::_start_machine()
{
return KEYENCE_STATUS_NORMAL;
};
//===============================================================================
int CKeyence_Proto::_shutdown_machine()
{
return KEYENCE_STATUS_NORMAL;
};
//===============================================================================
// Keyence Protocol - This can be processed serially.
// Send data on EP_01 channel.
// Receive data on EP_01.
// Send data on EP_82 channel.
// Receive data on EP_82 channel.
// if more data needs to be received, send data to EP_82 channel.
// (Note, we do not receive Image Data, so we will not receive 0x40000 bytes.
// But we must make provision for receiving and sending 0x40000 bytes. (512x512).
//===============================================================================
int CKeyence_Proto::_send_usb_data()
{
int _ret;
_ret = usb_bulk_setup_async(g_dev, &ep_buff_ep01._async_context, EP_KEYENCE_01);
if (_ret < 0)
{
return KEYENCE_STATUS_DATALINK_ERROR;
}
_ret = usb_submit_async(ep_buff_ep01._async_context, ep_buff_ep01._buff, ep_buff_ep01._size);
if (_ret < 0)
{
usb_free_async(&ep_buff_ep01._async_context);
return KEYENCE_STATUS_DATALINK_ERROR;
}
_ret = usb_reap_async(ep_buff_ep01._async_context, 10000);
if (_ret > 0)
{
_process_rcv_transfer_data_ep01();
usb_free_async(&ep_buff_ep01._async_context);
}
return KEYENCE_STATUS_NORMAL;
}
//==============================================================
int CKeyence_Proto::_send_cmd_KEYENCE_CMD_GET_LASER_DATA()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_process_KEYENCE_CMD_GET_LASER_DATA()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_get_image()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_put_program()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_read_env()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_write_env()
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
int CKeyence_Proto::_set_config() // sets trigger etc.
{
return KEYENCE_STATUS_NORMAL;
};
//==============================================================
//
// The file must be in groups of 4s.
//
// > [82] Signal Receive Data
//
// > [endpoint 0x00000082] 0000000e
// < [endpoint 0x00000082] 00000009 0800000007050500ff
// > [endpoint 0x00000082] 00000005
// < [endpoint 0x00000082] 00000000
//
// > Signals Send Data
//
// > [endpoint 0x00000001] 00000004 0c000000
// < [endpoint 0x00000001] 00000004
// > [endpoint 0x00000001] 00000200 0c00000007040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099972afd90d52afd3ff72afd49062bfd63142bfd3cff2afd81e42afd3abc2afdab802afdee0c2afdf93e29fd946227fde8a827fd212263fd6b7562fd237461fd9d4462fd708962fda6b462fd57db62fd99ed62fd96f462fdb2e362fda4c662fd53a162fd6a6962fd740e62fd266c61fd3f0a60fdd41360fdb9839afd06319afd259e99fdfd299afdf7689afd71979afd6cb69afd66c99afd64d09afd04be9afd8ba19afdfc7a9afd8b469afdcdfb99fd1c7b99fd2c7698fd3e5498fd46ffd1fd5eebd1fdcaa6d1fd4506d2fdbc3fd2fdb568d2fda982d2fdad8bd2fd8790d2fddd81d2fdc66cd2fd4a4bd2fd5e1ad2fd37d9d1fd3872d1fdd8b2d0fdaa74d0fdce9009fe8ba509fe749509fe18d809fe01050afe852a0afe1a3f0afe1e490afe4c4f0afece470afe96340afe84150afe48e609fe7ea909fe095609fed3c908fe697708fe433141fe105e41fe8b6d41fe2a9d41fe20c641feb0e241fe3af541fe98fe41fe11fe41feadf741feffe541fe8fce41feeaa841fec46f41feb72a41fe77c340feee6740fe23e978fe741a79fe363d79fe9c5e79fec27a79fe449679fe92a979fe1aae79fea9aa79fe0ca179fe219379fe
// < [endpoint 0x00000001] 00000200
//
//
//==============================================================
int CKeyence_Proto::_replay_capture(CString s_replay_file)
{
char cSize[9];
int iSendSize;
int iRcvSize;
FILE* pInFile;
int iEP;
_wfopen_s(&pInFile, s_replay_file, _T("r"));
if (pInFile == NULL)
return KEYENCE_STATUS_REPLAY_FILE_ERROR;
fgets(ep_buff._buff, MAX_KEYENCE_EP_BUFF_SIZE, pInFile ); // pick up the first line
while (!feof(pInFile))
{
memset(cSize, 0 , 9);
memcpy(cSize, ep_buff._buff+24, 8);
sscanf_s(cSize, "%8x", &iSendSize); // get the length of the transmission
iEP = (*(ep_buff._buff+21) == '1') ? 0x01:0x82;
if (*ep_buff._buff == '>')
{
fgets((char *)ep_buff._buff, MAX_KEYENCE_EP_BUFF_SIZE, pInFile ); // skip the input line
usb_bulk_write(g_dev, iEP, (char *)(ep_buff._buff+33), iSendSize, 5000);
iRcvSize = usb_bulk_read(g_dev, iEP, (char *)ep_buff._buff, MAX_KEYENCE_EP_BUFF_SIZE, 5000);
}
fgets((char *)ep_buff._buff, MAX_KEYENCE_EP_BUFF_SIZE, pInFile ); // pick up the first line
};
fclose(pInFile);
return KEYENCE_STATUS_NORMAL;
}