/*
* Copyright (c) Huawei Technologies Co., Ltd. 2012-2020. All rights reserved.
* Description:
* Author: huawei
* Create: 2020-10-01
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include "ascend_hal.h"
/* **************************************** */
/* 取值范围 [1-96]: */
/* 一个 device 最多支持 96 个 session 通道,*/
/* 创建 client 时,建议传参小于等于 96 */
/* **************************************** */
#define MAX_SESSION_NUM 96
/* ************************************************************** */
/* 0:阻塞死等,如果收发通道阻塞则会等待通道空闲,死等。 */
/* 1:不阻塞,如果收发通道阻塞则不发送数据,立马返回。 */
/* 2:阻塞直到超时,如果收发通道阻塞则会等待通道空闲,直到超时。 */
/* 建议使用“2”,用户可根据实际数据发送情况选择重发或者丢弃。 */
/* ************************************************************** */
#define HDC_WAIT_TIMEOUT 2
/* ************************************************* */
/* 单位 ms;用户根据业务设置合适的收发通道超时时间值 */
/* ************************************************* */
#define HDC_SEND_RECV_WAIT_TIME 100
#define HDC_SEND_RECV_DATA_LEN 256
#define HDC_DST_PATH_LEN 256
#define HDC_CHANGE_FRAME_SIZE_TO_KB 1024
#define HDC_ERROR(fmt, ...) printf("Line: %04d. %s]" fmt "\n", __LINE__, __func__, ## __VA_ARGS__)
#define HDC_INFO(fmt, ...) printf("[Line: %04d. %s]" fmt "\n", __LINE__, __func__, ## __VA_ARGS__)
void usage()
{
printf("--------------------------------------------------------------------------------------\n");
printf( "normal channel, usage:\n"
"\t./hdc_demo 0 server/client(1/0) server_type(14) dev_id(0~64) size(KB) loop_times \n");
printf( "fast channel, usage:\n"
"\t./hdc_demo 1 server/client(1/0) server_type(14) dev_id(0~64) size(KB) loop_times \n");
printf( "send file channel, usage:\n"
"\t./hdc_demo 2 dev_id(0~64) file \n");
printf("--------------------------------------------------------------------------------------\n");
printf( "normal channel, examples:\n"
"\tserver:./hdc_demo 0 1 14 0 64 10\n"
"\tclient:./hdc_demo 0 0 14 0 64 10\n");
printf( "fast channel, examples:\n"
"\tserver:./hdc_demo 1 1 14 0 64 10\n"
"\tclient:./hdc_demo 1 0 14 0 64 10\n");
printf( "send file channel, examples:\n"
"\t./hdc_demo 2 0 /home/examples.txt \n");
printf("--------------------------------------------------------------------------------------\n");
}
int normal_channel_client(int devid, int type, int size, int count)
{
struct drvHdcMsg *pMsg = NULL;
HDC_SESSION Session = NULL;
HDC_CLIENT client = NULL;
char *buffer = NULL;
int recv_cnt;
int ret;
ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0);
if (ret) {
HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret);
return -1;
}
buffer = (char *)malloc(size);
if (!buffer) {
HDC_ERROR("malloc failed, ret = %d", ret);
goto OUT;
}
while (count--) {
ret = drvHdcSessionConnect(0, devid, client, &Session);
if (ret) {
HDC_ERROR("drvHdcSessionConnect failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcSetSessionReference(Session);
if (ret) {
HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcAllocMsg(Session, &pMsg, 1);
if (ret) {
HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count);
break;
}
ret = halHdcRecv(Session, pMsg, size, 0, &recv_cnt, 0);
if (ret) {
HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcReuseMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcAddMsgBuffer(pMsg, buffer, size);
if (ret) {
HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count);
break;
}
ret = halHdcSend(Session, pMsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcFreeMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count);
break;
}
pMsg = NULL;
ret = drvHdcSessionClose(Session);
if (ret) {
HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count);
break;
}
Session = NULL;
}
OUT:
if (pMsg != NULL) {
drvHdcFreeMsg(pMsg);
}
if (Session != NULL) {
drvHdcSessionClose(Session);
}
if (buffer != NULL) {
free(buffer);
}
if (client != NULL) {
drvHdcClientDestroy(client);
}
return ret;
}
int normal_channel_server(int devid, int type, int size, int count)
{
struct drvHdcMsg *pMsg = NULL;
HDC_SESSION Session = NULL;
HDC_SERVER server = NULL;
char *buffer = NULL;
int recv_len;
int ret;
ret = drvHdcServerCreate(devid, type, &server);
if (ret) {
HDC_ERROR("drvHdcServerCreate failed, ret = %d", ret);
return -1;
}
buffer = (char *)malloc(size);
if (!buffer) {
HDC_ERROR("malloc failed, ret = %d", ret);
goto OUT;
}
while (count--) {
ret = drvHdcSessionAccept(server, &Session);
if (ret) {
HDC_ERROR("drvHdcSessionAccept failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcSetSessionReference(Session);
if (ret) {
HDC_ERROR("drvHdcSetSessionReference failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcAllocMsg(Session, &pMsg, 1);
if (ret) {
HDC_ERROR("drvHdcAllocMsg failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcAddMsgBuffer(pMsg, buffer, size);
if (ret) {
HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d, count : %d", ret, count);
break;
}
ret = halHdcSend(Session, pMsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcSend failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcReuseMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcReuseMsg failed, ret : %d, count : %d", ret, count);
break;
}
ret = halHdcRecv(Session, pMsg, size, 0, &recv_len, 0);
if (ret) {
if (ret != DRV_ERROR_SOCKET_CLOSE)
HDC_ERROR("halHdcRecv failed, ret : %d, count : %d", ret, count);
break;
}
ret = drvHdcFreeMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcFreeMsg failed, ret : %d, count : %d", ret, count);
break;
}
pMsg = NULL;
ret = drvHdcSessionClose(Session);
if (ret) {
HDC_ERROR("drvHdcSessionClose failed, ret : %d, count : %d", ret, count);
break;
}
Session = NULL;
}
OUT:
if (pMsg != NULL) {
drvHdcFreeMsg(pMsg);
}
if (Session != NULL) {
drvHdcSessionClose(Session);
}
if (buffer != NULL) {
free(buffer);
}
if (server != NULL) {
drvHdcServerDestroy(server);
}
return ret;
}
int normal_channel_test(int argc, char *argv[], void (*usage)(void))
{
int server_type;
int frame_size;
int device_id;
int loop_cnt;
int mode;
if (argc < 7) {
usage();
return -1;
}
mode = atoi(argv[2]); /* server or client */
device_id = atoi(argv[3]);
server_type = atoi(argv[4]);
frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */
loop_cnt = atoi(argv[6]);
if (mode) {
return normal_channel_server(device_id, server_type, frame_size, loop_cnt);
} else {
return normal_channel_client(device_id, server_type, frame_size, loop_cnt);
}
}
int fast_channel_client(int devid, int type, int size, int count)
{
unsigned long hostsendDataBuf;
unsigned long hostrecvDataBuf;
unsigned long hostsendCtrlBuf;
unsigned long hostrecvCtrlBuf;
struct drvHdcFastSendMsg smsg;
struct drvHdcFastRecvMsg rmsg;
struct drvHdcMsg *pMsg = NULL;
HDC_SESSION session = NULL;
HDC_CLIENT client = NULL;
void *sendDataBuf = NULL;
void *recvDataBuf = NULL;
void *sendCtrlBuf = NULL;
void *recvCtrlBuf = NULL;
char *sendbuffer = NULL;
char *pBuf = NULL;
int recvBufCount;
int datalen;
int ctrllen;
int bufLen;
int ret;
ret = drvHdcClientCreate(&client, MAX_SESSION_NUM, type, 0);
if (ret) {
HDC_ERROR("drvHdcClientCreate failed, ret = %d", ret);
goto _uninit;
}
ret = drvHdcSessionConnect(0, devid, client, &session);
if (ret) {
HDC_ERROR("drvHdcSessionConnect failed, ret : %d\n", ret);
goto _destroy;
}
ret = drvHdcSetSessionReference(session);
if (ret) {
HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret);
goto _close;
}
ret = drvHdcAllocMsg(session, &pMsg, 1);
if (ret) {
HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
goto _close;
}
sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN);
if (sendbuffer == NULL) {
HDC_ERROR("malloc fail.\n");
goto _free;
}
datalen = size;
ctrllen = HDC_CHANGE_FRAME_SIZE_TO_KB; /* */
/* 快速通道申请 buffer准备 */
sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0);
recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0);
sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0);
recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0);
if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) {
HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n",
sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
goto _free;
}
HDC_INFO("native fast channel info : datalen %d, ctrllen %d, %p,%p,%p,%p",
datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
*(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf;
*(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf;
*(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf;
*(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf;
*(((unsigned long *)sendbuffer) + 4) = datalen;
*(((unsigned long *)sendbuffer) + 5) = ctrllen;
ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN);
if (ret) {
HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret);
goto _free;
}
/* 发送本端 快速通道的 buffer信息给到对端 */
ret = halHdcSend(session, pMsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcSend failed, ret : %d\n", ret);
goto _free;
}
ret = drvHdcReuseMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret);
goto _free;
}
ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0);
if (ret) {
HDC_ERROR("halHdcRecv failed, ret : %d\n", ret);
goto _free;
}
ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen);
if (ret) {
HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret);
goto _free;
}
/* 获取对端快速通道信息 */
hostsendDataBuf = *(((unsigned long *)pBuf) + 0);
hostrecvDataBuf = *(((unsigned long *)pBuf) + 1);
hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2);
hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3);
datalen = (int)(*(((unsigned long *)pBuf) + 4));
ctrllen = (int)(*(((unsigned long *)pBuf) + 5));
HDC_INFO("remote fast channel info : datalen %d, ctrllen %d, %lx,%lx,%lx,%lx",
datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf);
drvHdcFreeMsg(pMsg);
pMsg = NULL;
free(sendbuffer);
sendbuffer = NULL;
while (count--) {
smsg.srcDataAddr = (unsigned long long)sendDataBuf;
smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */
smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf;
smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */
smsg.dataLen = datalen;
smsg.ctrlLen = ctrllen;
/* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */
ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME);
if (ret) {
HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret);
break;
}
ret = halHdcFastRecv(session, &rmsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret);
break;
}
}
HDC_INFO("fast channel time delay client finish");
_free:
if (sendbuffer) {
free(sendbuffer);
}
if (sendDataBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf);
}
if (recvDataBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf);
}
if (sendCtrlBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf);
}
if (recvCtrlBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf);
}
if (pMsg) {
drvHdcFreeMsg(pMsg);
}
sendbuffer = NULL;
sendDataBuf = NULL;
recvDataBuf = NULL;
sendCtrlBuf = NULL;
recvCtrlBuf = NULL;
pMsg = NULL;
_close:
drvHdcSessionClose(session);
_destroy:
drvHdcClientDestroy(client);
_uninit:
return ret;
}
int fast_channel_server(int devid, int type, int size, int count)
{
unsigned long hostsendDataBuf;
unsigned long hostrecvDataBuf;
unsigned long hostsendCtrlBuf;
unsigned long hostrecvCtrlBuf;
struct drvHdcFastSendMsg smsg;
struct drvHdcFastRecvMsg rmsg;
struct drvHdcMsg *pMsg = NULL;
HDC_SESSION session = NULL;
HDC_SERVER server = NULL;
void *sendDataBuf = NULL;
void *recvDataBuf = NULL;
void *sendCtrlBuf = NULL;
void *recvCtrlBuf = NULL;
char *sendbuffer = NULL;
char *pBuf = NULL;
int recvBufCount;
int datalen;
int ctrllen;
int bufLen;
int ret;
ret = drvHdcServerCreate(devid, type, &server);
if (ret) {
HDC_ERROR("drvHdcServerCreate failed, ret = %d\n", ret);
goto _uninit;
}
ret = drvHdcSessionAccept(server, &session);
if (ret) {
HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
goto _destroy;
}
ret = drvHdcSetSessionReference(session);
if (ret) {
HDC_ERROR("drvHdcSetSessionReference failed, ret : %d\n", ret);
goto _close;
}
ret = drvHdcAllocMsg(session, &pMsg, 1);
if (ret) {
HDC_ERROR("drvHdcSessionAccept failed, ret : %d\n", ret);
goto _close;
}
ret = halHdcRecv(session, pMsg, HDC_SEND_RECV_DATA_LEN, 0, &recvBufCount, 0);
if (ret) {
HDC_ERROR("halHdcRecv failed, ret : %d\n", ret);
goto _free;
}
ret = drvHdcGetMsgBuffer(pMsg, 0, &pBuf, &bufLen);
if (ret) {
HDC_ERROR("drvHdcGetMsgBuffer failed, ret : %d\n", ret);
goto _free;
}
/* 获取对端快速通道信息 */
hostsendDataBuf = *(((unsigned long *)pBuf) + 0);
hostrecvDataBuf = *(((unsigned long *)pBuf) + 1);
hostsendCtrlBuf = *(((unsigned long *)pBuf) + 2);
hostrecvCtrlBuf = *(((unsigned long *)pBuf) + 3);
datalen = (int)(*(((unsigned long *)pBuf) + 4));
ctrllen = (int)(*(((unsigned long *)pBuf) + 5));
HDC_INFO("remote fast channel info : datalen %d, ctrllen %d, %lx,%lx,%lx,%lx",
datalen, ctrllen, hostsendDataBuf, hostrecvDataBuf, hostsendCtrlBuf, hostrecvCtrlBuf);
/* 快速通道申请 buffer准备 */
sendDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_DATA, NULL, 0, datalen, devid, 0);
recvDataBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_DATA, NULL, 0, datalen, devid, 0);
sendCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_TX_CTRL, NULL, 0, ctrllen, devid, 0);
recvCtrlBuf = drvHdcMallocEx(HDC_MEM_TYPE_RX_CTRL, NULL, 0, ctrllen, devid, 0);
if (!sendDataBuf || !recvDataBuf || !sendCtrlBuf || !recvCtrlBuf) {
HDC_ERROR("drvHdcMallocEx failed, %p,%p,%p,%p\n",
sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
goto _free;
}
sendbuffer = malloc(HDC_SEND_RECV_DATA_LEN);
if (!sendbuffer) {
HDC_ERROR("malloc fail.\n");
goto _free;
}
*(((unsigned long *)sendbuffer) + 0) = (unsigned long)sendDataBuf;
*(((unsigned long *)sendbuffer) + 1) = (unsigned long)recvDataBuf;
*(((unsigned long *)sendbuffer) + 2) = (unsigned long)sendCtrlBuf;
*(((unsigned long *)sendbuffer) + 3) = (unsigned long)recvCtrlBuf;
*(((unsigned long *)sendbuffer) + 4) = datalen;
*(((unsigned long *)sendbuffer) + 5) = ctrllen;
HDC_INFO("native fast channel info : datalen %d, ctrllen %d, %p,%p,%p,%p",
datalen, ctrllen, sendDataBuf, recvDataBuf, sendCtrlBuf, recvCtrlBuf);
ret = drvHdcReuseMsg(pMsg);
if (ret) {
HDC_ERROR("drvHdcReuseMsg failed, ret : %d\n", ret);
goto _free;
}
ret = drvHdcAddMsgBuffer(pMsg, sendbuffer, HDC_SEND_RECV_DATA_LEN);
if (ret) {
HDC_ERROR("drvHdcAddMsgBuffer failed, ret : %d\n", ret);
goto _free;
}
/* 发送本端的 快速通道的 buffer信息给到对端 */
ret = halHdcSend(session, pMsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcSend failed, ret : %d\n", ret);
goto _free;
}
drvHdcFreeMsg(pMsg);
pMsg = NULL;
free(sendbuffer);
sendbuffer = NULL;
while (count--) {
ret = halHdcFastRecv(session, &rmsg, 0, 0);
if (ret) {
HDC_ERROR("halHdcFastRecv failed, ret : %d\n", ret);
break;
}
smsg.srcDataAddr = (unsigned long long)sendDataBuf;
smsg.dstDataAddr = hostrecvDataBuf; /* 对端的接收buffer */
smsg.srcCtrlAddr = (unsigned long long)sendCtrlBuf;
smsg.dstCtrlAddr = hostrecvCtrlBuf; /* 对端的接收buffer */
smsg.dataLen = datalen;
smsg.ctrlLen = ctrllen;
/* 用户可根据实际数据发送情况选择重发或者丢弃;参数使用参考具体接口描述 */
ret = halHdcFastSend(session, smsg, HDC_WAIT_TIMEOUT, HDC_SEND_RECV_WAIT_TIME);
if (ret) {
HDC_ERROR("halHdcFastSend failed, ret : %d\n", ret);
break;
}
}
HDC_INFO("fast channel time delay server finish");
_free:
if (sendbuffer) {
free(sendbuffer);
}
if (sendDataBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_TX_DATA, sendDataBuf);
}
if (recvDataBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_RX_DATA, recvDataBuf);
}
if (sendCtrlBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_TX_CTRL, sendCtrlBuf);
}
if (recvCtrlBuf) {
drvHdcFreeEx(HDC_MEM_TYPE_RX_CTRL, recvCtrlBuf);
}
if (pMsg) {
drvHdcFreeMsg(pMsg);
}
sendbuffer = NULL;
sendDataBuf = NULL;
recvDataBuf = NULL;
sendCtrlBuf = NULL;
recvCtrlBuf = NULL;
pMsg = NULL;
_close:
drvHdcSessionClose(session);
_destroy:
drvHdcServerDestroy(server);
_uninit:
return ret;
}
int fast_channel_test(int argc, char *argv[], void (*usage)(void))
{
int server_type;
int frame_size;
int device_id;
int loop_cnt;
int mode;
if (argc < 7) {
usage();
return -1;
}
mode = atoi(argv[2]); /* server or client */
device_id = atoi(argv[3]);
server_type = atoi(argv[4]);
frame_size = atoi(argv[5]) * HDC_CHANGE_FRAME_SIZE_TO_KB; /* 将用户入参 frame 大小转化为 KB */
loop_cnt = atoi(argv[6]);
if (mode) {
return fast_channel_server(device_id, server_type, frame_size, loop_cnt);
} else {
return fast_channel_client(device_id, server_type, frame_size, loop_cnt);
}
}
int hdc_send_file_to_device(int argc, char *argv[], void (*usage)(void))
{
char dst_path[HDC_DST_PATH_LEN] = {0};
char *file = NULL;
int devid;
int ret;
if (argc < 4) {
usage();
return -1;
}
devid = atoi(argv[2]);
file = argv[3];
ret = drvHdcGetTrustedBasePath(0, devid, dst_path, HDC_DST_PATH_LEN);
if (ret) {
HDC_ERROR("drvHdcGetTrustedBasePath failed, ret : %d\n", ret);
return -1;
}
ret = drvHdcSendFile(0, devid, file, dst_path, NULL);
if (ret) {
HDC_ERROR("drvHdcSendFile failed, ret : %d\n", ret);
return -1;
}
HDC_INFO("send file success, dst path : %s", dst_path);
return 0;
}
int main(int argc, char *argv[])
{
int op_type;
int ret = -1;
if (argc < 2) {
usage();
return -1;
}
op_type = atoi(argv[1]);
switch (op_type) {
case 0:
ret = normal_channel_test(argc, argv, usage);
break;
case 1:
ret = fast_channel_test(argc, argv, usage);
break;
case 2:
ret = hdc_send_file_to_device(argc, argv, usage);
break;
default:
usage();
break;
}
HDC_INFO("Test finish. ret = %d", ret);
return ret;
}
参见
样例编译编译成可执行文件后(例如可执行文件的名字为hdc_demo),你可以通过./hdc_demo -h命令查看输入参数的详细含义,其中:
- “server/client(1/0)”:当前执行此程序的机器为服务端的话,则配置为“1”,客户端,则为“0”。
- “server_type”的详细含义请参见drvHdcServiceType。
- “size”:指传送的数据的大小,单位KB。
- “loop_times”:指收发超时次数。