diff --git a/CMakeLists.txt b/CMakeLists.txt index ed47e05..6e58ca0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,8 @@ SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_BUILD_TYPE RELEASE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPATH=\"\\\"${PROJECT_SOURCE_DIR}\\\"\"") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${CMAKE_SYSTEM_NAME}") +MESSAGE("${CMAKE_CXX_FLAGS}") # Todo ## 使用编译期固定选项,以略微提升性能。 #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFIX_OPTIONS") @@ -20,17 +22,28 @@ IF(CCACHE_FOUND) MESSAGE("< Use ccache for compiler >") ENDIF() +FILE(GLOB_RECURSE sourcefiles "others/src/*.cpp" "energy/src/*cpp" "armor/src/*.cpp") +ADD_EXECUTABLE(${BIN_NAME} main.cpp ${sourcefiles} ) + +IF (CMAKE_SYSTEM_NAME MATCHES "Linux") + MESSAGE(STATUS "current platform: Linux ") + FIND_PACKAGE(Eigen3 REQUIRED) + INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR}) + TARGET_LINK_LIBRARIES(${BIN_NAME} "${PROJECT_SOURCE_DIR}/others/libMVSDK.so") +ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows") + MESSAGE(STATUS "current platform: Windows") + INCLUDE_DIRECTORIES("C:/Applications/eigen3") + TARGET_LINK_LIBRARIES(${BIN_NAME} "${PROJECT_SOURCE_DIR}/others/MVCAMSDK_X64.lib") +ELSE () + MESSAGE(STATUS "Unsupport platform: ${CMAKE_SYSTEM_NAME}") +ENDIF() FIND_PACKAGE(OpenCV 3 REQUIRED) FIND_PACKAGE(Threads) -INCLUDE_DIRECTORIES("C:\\Applications\\eigen3") INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/energy/include) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/armor/include) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/others/include) -FILE(GLOB_RECURSE sourcefiles "others/src/*.cpp" "energy/src/*cpp" "armor/src/*.cpp") -ADD_EXECUTABLE(${BIN_NAME} main.cpp ${sourcefiles} ) TARGET_LINK_LIBRARIES(${BIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) TARGET_LINK_LIBRARIES(${BIN_NAME} ${OpenCV_LIBS}) -TARGET_LINK_LIBRARIES(${BIN_NAME} "C:/Program\ Files\ (x86)/MindVision/SDK/X64/MVCAMSDK_X64.lib") diff --git a/armor/src/armor_finder/armor_finder.cpp b/armor/src/armor_finder/armor_finder.cpp index 7c558c3..7f88257 100644 --- a/armor/src/armor_finder/armor_finder.cpp +++ b/armor/src/armor_finder/armor_finder.cpp @@ -68,11 +68,6 @@ bool sendTarget(Serial& serial, double x, double y, double z) { static int fps; uint8_t buff[8]; - static SYSTEMTIME ts, te; - GetLocalTime(&te); - printf("Interval: %d\n", (te.wSecond - ts.wSecond) * 1000 + (te.wMilliseconds - ts.wMilliseconds)); - ts = te; - time_t t = time(nullptr); if (last_time != t) { last_time = t; diff --git a/main.cpp b/main.cpp index dbb148a..d851c79 100644 --- a/main.cpp +++ b/main.cpp @@ -37,7 +37,7 @@ void uartReceive(Serial *uart); int main(int argc, char *argv[]) { process_options(argc, argv); - Serial uart(3, 115200); + Serial uart(115200); thread receive(uartReceive, &uart); bool flag = true; @@ -118,12 +118,11 @@ int main(int argc, char *argv[]) { return 0; } -#define RECEIVE_LOG_LEVEL LOG_MSG +#define RECEIVE_LOG_LEVEL LOG_NOTHING char uartReadByte(Serial &uart) { - while (uart.GetBytesInCOM() == 0); char byte; - if (uart.ReadData((uint8_t*)& byte, 1) == false) { + if (uart.ReadData((uint8_t*)&byte, 1) == false) { LOGE("serial error!"); } return byte; @@ -138,45 +137,45 @@ void uartReceive(Serial* uart) { while ((data = uartReadByte(*uart)) != '\n') { buffer[cnt++] = data; if (cnt >= 100) { - //LOG(RECEIVE_LOG_LEVEL, "data receive over flow!"); + LOG(RECEIVE_LOG_LEVEL, "data receive over flow!"); cnt = 0; } } - //LOGM("%d", cnt); + LOGM("%d", cnt); if (cnt == 12) { if (buffer[8] == 'e') { state = ENERGY_STATE; - //LOG(RECEIVE_LOG_LEVEL, "Energy state"); + LOG(RECEIVE_LOG_LEVEL, "Energy state"); } else if (buffer[8] == 'a') { state = ARMOR_STATE; - //LOG(RECEIVE_LOG_LEVEL, "Armor state"); + LOG(RECEIVE_LOG_LEVEL, "Armor state"); } if (buffer[10] == 0){ use_classifier = false; - //LOG(RECEIVE_LOG_LEVEL, "Classifier off!"); + LOG(RECEIVE_LOG_LEVEL, "Classifier off!"); } else if(buffer[10] == 1){ use_classifier = true; - //LOG(RECEIVE_LOG_LEVEL, "Classifier on!"); + LOG(RECEIVE_LOG_LEVEL, "Classifier on!"); } if (buffer[11] == ENEMY_BLUE) { - //LOG(RECEIVE_LOG_LEVEL, "ENEMY_BLUE!"); + LOG(RECEIVE_LOG_LEVEL, "ENEMY_BLUE!"); ally_color = ALLY_RED; enemy_color = ENEMY_BLUE; } else if (buffer[11] == ENEMY_RED) { - //LOG(RECEIVE_LOG_LEVEL, "ENEMY_RED!"); + LOG(RECEIVE_LOG_LEVEL, "ENEMY_RED!"); ally_color = ALLY_BLUE; enemy_color = ENEMY_RED; } memcpy(&curr_yaw, buffer, 4); memcpy(&curr_pitch, buffer + 4, 4); - //LOG(RECEIVE_LOG_LEVEL, "Get yaw:%f pitch:%f", curr_yaw, curr_pitch); + LOG(RECEIVE_LOG_LEVEL, "Get yaw:%f pitch:%f", curr_yaw, curr_pitch); if (buffer[9] == 1) { if (mark == 0) { mark = 1; mark_yaw = curr_yaw; mark_pitch = curr_pitch; } - //LOG(RECEIVE_LOG_LEVEL, "Marked"); + LOG(RECEIVE_LOG_LEVEL, "Marked"); } } cnt = 0; diff --git a/others/include/camera/camera_define.h b/others/include/camera/camera_define.h index eeedb6c..e06b8b3 100644 --- a/others/include/camera/camera_define.h +++ b/others/include/camera/camera_define.h @@ -31,6 +31,7 @@ typedef unsigned char UCHAR; #define HMODULE void* + #define TRUE 1 #define FALSE 0 //图像查表变换的方式 diff --git a/others/include/camera/camera_wrapper.h b/others/include/camera/camera_wrapper.h index 209465f..e6f9d75 100644 --- a/others/include/camera/camera_wrapper.h +++ b/others/include/camera/camera_wrapper.h @@ -14,7 +14,11 @@ #include #include "camera/wrapper_head.h" -#include "camera/CameraApi.h" +#ifdef Windows + #include "camera/CameraApi.h" +#elif defined(Linux) + #include "camera/camera_api.h" +#endif class CameraWrapper: public WrapperHead { private: diff --git a/others/include/log.h b/others/include/log.h index 2e9d6f1..469948c 100644 --- a/others/include/log.h +++ b/others/include/log.h @@ -124,8 +124,8 @@ __FILE__, __LINE__, ##__VA_ARGS__) /******************** the time counter API ************************/ -#ifndef DO_NOT_CNT_TIME && LOG_LEVEL > LOG_NONE - #ifdef WIN32 +#if !defined(DO_NOT_CNT_TIME) && LOG_LEVEL > LOG_NONE + #ifdef Windows #include #define CNT_TIME(tag, codes, ...) do{ \ static SYSTEMTIME ts, te; \ diff --git a/others/include/options/additions.h b/others/include/options/additions.h index 13c1550..5171790 100644 --- a/others/include/options/additions.h +++ b/others/include/options/additions.h @@ -5,7 +5,7 @@ #ifndef _ADDITIONS_H_ #define _ADDITIONS_H_ -#include +#include #include #include diff --git a/others/include/serial/serial.h b/others/include/serial/serial.h index 4a98040..e6a525b 100644 --- a/others/include/serial/serial.h +++ b/others/include/serial/serial.h @@ -1,12 +1,14 @@ #ifndef _SERIAL_H_ #define _SERIAL_H_ +#ifdef Windows + #include class Serial { public: - Serial(UINT portNo = 1, UINT baud = CBR_9600, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR); + Serial(UINT baud = CBR_115200, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR); ~Serial(); bool InitPort(UINT portNo = 1, UINT baud = CBR_9600, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR); @@ -27,4 +29,33 @@ private: DWORD dwCommEvents; }; +#elif defined(Linux) + +#include +#include +#include +#include + +class Serial { +private: + int fd; + int nSpeed; + char nEvent; + int nBits; + int nStop; + + int set_opt(int fd, int nSpeed, char nEvent, int nBits, int nStop); + +public: + Serial(int nSpeed = 115200, char nEvent = 'N', int nBits = 8, int nStop = 1); + ~Serial(); + + bool InitPort(int nSpeed = 115200, char nEvent = 'N', int nBits = 8, int nStop = 1); +// int GetBytesInCOM() const ; + bool WriteData(const unsigned char* pData, unsigned int length); + bool ReadData(unsigned char* buffer, unsigned int length); +}; + +#endif + #endif /* _SERIAL_H_ */ diff --git a/others/src/camera/camera_wrapper.cpp b/others/src/camera/camera_wrapper.cpp index 2cfefab..8fa3ac9 100644 --- a/others/src/camera/camera_wrapper.cpp +++ b/others/src/camera/camera_wrapper.cpp @@ -62,7 +62,7 @@ bool CameraWrapper::init() { rgb_buffer = (unsigned char *)malloc(tCapability.sResolutionRange.iHeightMax * tCapability.sResolutionRange.iWidthMax * 3); char filepath[200]; - sprintf_s(filepath, PROJECT_DIR"/others/%s.Config", name.data()); + sprintf(filepath, PROJECT_DIR"/others/%s.Config", name.data()); if (CameraReadParameterFromFile(h_camera, filepath) != CAMERA_STATUS_SUCCESS) { LOGE("Load parameter %s from file fail!", filepath); return false; @@ -75,28 +75,6 @@ bool CameraWrapper::init() { double t; CameraGetExposureTime(h_camera, &t); LOGM("Exposure time: %lfms", t / 1000.0); -/* if(mode == 0){ - // 不使用自动曝光 - CameraSetAeState(h_camera, false); - // 曝光时间10ms - CameraSetExposureTime(h_camera, 10000); - double t; - CameraGetExposureTime(h_camera, &t); - LOGM("Exposure time: %lfms", t/1000.0); - // 模拟增益4 - CameraSetAnalogGain(h_camera, 64); - // 使用预设LUT表 - CameraSetLutMode(h_camera, LUTMODE_PRESET); - // 抗频闪 -// CameraSetAntiFlick(h_camera, true); - } - else if(mode == 1){ - // 不使用自动曝光 - CameraSetAeState(h_camera, false); - // 抗频闪 -// CameraSetAntiFlick(h_camera, true); - } -*/ /*让SDK进入工作模式,开始接收来自相机发送的图像 数据。如果当前相机是触发模式,则需要接收到 触发帧以后才会更新图像。 */ diff --git a/others/src/serial/serial.cpp b/others/src/serial/serial.cpp index 99105ef..d714ea6 100644 --- a/others/src/serial/serial.cpp +++ b/others/src/serial/serial.cpp @@ -4,9 +4,11 @@ using namespace std; #include -Serial::Serial(UINT portNo, UINT baud, char parity, UINT databits, UINT stopsbits, DWORD dwCommEvents) : +#ifdef Windows + +Serial::Serial(UINT baud, char parity, UINT databits, UINT stopsbits, DWORD dwCommEvents) : hComm(INVALID_HANDLE_VALUE), -portNo(portNo), +portNo(3), parity(parity), databits(databits), stopsbits(stopsbits), @@ -40,12 +42,12 @@ bool Serial::openPort(UINT portNo) { char szPort[50]; sprintf_s(szPort, "COM%d", portNo); - /** ָĴ */ - hComm = CreateFileA(szPort, /** 豸,COM1,COM2 */ - GENERIC_READ | GENERIC_WRITE, /** ģʽ,ͬʱд */ - 0, /** ģʽ,0ʾ */ - NULL, /** ȫ,һʹNULL */ - OPEN_EXISTING, /** òʾ豸,򴴽ʧ */ + /** 打开指定的串口 */ + hComm = CreateFileA(szPort, /** 设备名,COM1,COM2等 */ + GENERIC_READ | GENERIC_WRITE, /** 访问模式,可同时读写 */ + 0, /** 共享模式,0表示不共享 */ + NULL, /** 安全性设置,一般使用NULL */ + OPEN_EXISTING, /** 该参数表示设备必须存在,否则创建失败 */ 0, 0); @@ -53,7 +55,7 @@ bool Serial::openPort(UINT portNo) { } void Serial::ClosePort() { - /** дڱ򿪣ر */ + /** 如果有串口被打开,关闭它 */ if (hComm != INVALID_HANDLE_VALUE) { CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; @@ -61,7 +63,7 @@ void Serial::ClosePort() { } bool Serial::InitPort(UINT portNo, UINT baud, char parity, UINT databits, UINT stopsbits, DWORD dwCommEvents) { - /** ʱ,ƶתΪַʽ,ԹDCBṹ */ + /** 临时变量,将制定参数转化为字符串形式,以构造DCB结构 */ char szDCBparam[50]; sprintf_s(szDCBparam, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, stopsbits); @@ -85,40 +87,40 @@ bool Serial::InitPort(UINT portNo, UINT baud, char parity, UINT databits, UINT DCB dcb; if (bIsSuccess) { - /** ȡǰò,ҹ촮DCB */ + /** 获取当前串口配置参数,并且构造串口DCB参数 */ bIsSuccess = GetCommState(hComm, &dcb); bIsSuccess = BuildCommDCB(szDCBparam, &dcb); if (!bIsSuccess) { cout << "Create dcb fail with "<< GetLastError() << endl; } - /** RTS flow */ + /** 开启RTS flow控制 */ dcb.fRtsControl = RTS_CONTROL_ENABLE; } if (bIsSuccess) { - /** ʹDCBô״̬ */ + /** 使用DCB参数配置串口状态 */ bIsSuccess = SetCommState(hComm, &dcb); if (!bIsSuccess) { cout << "SetCommState error!" << endl; } } - /** մڻ */ + /** 清空串口缓冲区 */ PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); return bIsSuccess; } UINT Serial::GetBytesInCOM() const { - DWORD dwError = 0; /** */ - COMSTAT comstat; /** COMSTATṹ,¼ͨ豸״̬Ϣ */ + DWORD dwError = 0; /** 错误码 */ + COMSTAT comstat; /** COMSTAT结构体,记录通信设备的状态信息 */ memset(&comstat, 0, sizeof(COMSTAT)); UINT BytesInQue = 0; - /** ڵReadFileWriteFile֮ǰ,ͨǰĴ־ */ + /** 在调用ReadFile和WriteFile之前,通过本函数清除以前遗留的错误标志 */ if (ClearCommError(hComm, &dwError, &comstat)) { - BytesInQue = comstat.cbInQue; /** ȡ뻺еֽ */ + BytesInQue = comstat.cbInQue; /** 获取在输入缓冲区中的字节数 */ } return BytesInQue; @@ -130,13 +132,13 @@ bool Serial::WriteData(const unsigned char* pData, unsigned int length) { return false; } - /** 򻺳дָ */ + /** 向缓冲区写入指定量的数据 */ BOOL bResult = TRUE; DWORD BytesToSend = 0; bResult = WriteFile(hComm, pData, length, &BytesToSend, NULL); if (!bResult) { DWORD dwError = GetLastError(); - /** մڻ */ + /** 清空串口缓冲区 */ PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT); ErrorHandler(); return false; @@ -150,17 +152,17 @@ bool Serial::ReadData(unsigned char *buffer, unsigned int length) { return false; } - /** ӻȡlengthֽڵ */ + /** 从缓冲区读取length字节的数据 */ BOOL bResult = TRUE; DWORD totalRead = 0, onceRead = 0; while (totalRead < length) { bResult = ReadFile(hComm, buffer, length-totalRead, &onceRead, NULL); totalRead += onceRead; if ((!bResult)) { - /** ȡ,Ըݸôԭ */ + /** 获取错误码,可以根据该错误码查出错误原因 */ DWORD dwError = GetLastError(); - /** մڻ */ + /** 清空串口缓冲区 */ PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT); ErrorHandler(); return false; @@ -168,3 +170,156 @@ bool Serial::ReadData(unsigned char *buffer, unsigned int length) { } return bResult; } + +#else defined(Linux) + +#include + +using namespace std; + +string get_uart_dev_name(){ + FILE* ls = popen("ls /dev/ttyUSB* --color=never", "r"); + char name[20] = {0}; + fscanf(ls, "%s", name); + return name; +} + +Serial::Serial(int nSpeed, char nEvent, int nBits, int nStop) : +nSpeed(nSpeed), nEvent(nEvent), nBits(nBits), nStop(nStop){ + if(wait_uart){ + LOGM("Wait for serial be ready!"); + while(InitPort(nSpeed, nEvent, nBits, nStop) == false); + LOGM("Port set successfully!"); + }else{ + if(InitPort(nSpeed, nEvent, nBits, nStop)){ + LOGM("Port set successfully!"); + }else{ + LOGE("Port set fail!"); + } + } +} + +Serial::~Serial() { + close(fd); + fd = -1; +} + +bool Serial::InitPort(int nSpeed, char nEvent, int nBits, int nStop){ + string name = get_uart_dev_name(); + if(name == ""){ + return false; + } + if((fd=open(name.data(), O_RDWR)) < 0){ + return false; + } + if(set_opt(fd, nSpeed, nEvent, nBits, nStop) < 0){ + return false; + } + return true; +} + +//int GetBytesInCOM() const { +// +//} + +bool Serial::WriteData(const unsigned char* pData, unsigned int length){ + int cnt=0, curr=0; + while((curr=write(fd, pData+cnt, length-cnt))>0 && (cnt+=curr)0 && (cnt+=curr)