diff --git a/rf60Xcore/src/rf60X.c b/rf60Xcore/src/rf60X.c index 8243eb814d4ef39d094a13296771683f3230e48c..09ef0fa302c90611f34dd349958047ceac9e29a5 100644 --- a/rf60Xcore/src/rf60X.c +++ b/rf60Xcore/src/rf60X.c @@ -6,6 +6,7 @@ #include "rf60X_devices.h" #include "rf60X_protocol.h" #include "WinSock2.h" +#include #define RF60X_API_VERSION 0x14010a00 // yy.mm.dd.build #define RF60X_RECV_TIMEOUT 100 @@ -16,7 +17,7 @@ #define RF60X_PROTOCOL_USER_PARAMS_PAYLOAD_SIZE (47) -#define INVALID_HANDLE_VALUE 0xffffffffffffffff +#define INVALID_HANDLE_VALUE ((size_t)(-1)) rfUint32 rf60X_api_version() { return RF60X_API_VERSION; } @@ -120,9 +121,8 @@ rfBool rf60x_open_port_uart(rf60x_t *scanner) { scanner->handlePort = (void *)uart_platform.uart_methods.create_file(scanner->portName); - if (INVALID_HANDLE_VALUE == scanner->handlePort) + if (INVALID_HANDLE_VALUE==scanner->handlePort) return FALSE; - else return TRUE; } @@ -147,12 +147,32 @@ rfUint8 *rf60x_get_measure_uart(rf60x_t *scanner, rfUint8 size) { } rfBool rf60x_send_command(rf60x_t *scanner, rf60x_command_t cmd) { - unsigned char ucBuffer[16]; + unsigned char ucBuffer[16]; memory_platform.rf_memset(ucBuffer, 0, 16); ucBuffer[0] = (unsigned char)(scanner->user_params.network_address_uart & 0x7F); - ucBuffer[1] = 0x80 | cmd; + ucBuffer[1] = 0x80 | (cmd & 0x0F); + switch(cmd){ + + case SAVETOFLASH: + ucBuffer[2] = 0x80 | 0x0A; + ucBuffer[3] = 0x80 | 0x0A; + if (uart_platform.uart_methods.send_data_uart(scanner->handlePort, + (void *)&ucBuffer, 4) != 4) + return -1; + + return 1; + break; + case RESTOREFORMFLASH: + ucBuffer[2] = 0x80 | 0x09; + ucBuffer[3] = 0x80 | 0x06; + if (uart_platform.uart_methods.send_data_uart(scanner->handlePort, + (void *)&ucBuffer, 4) != 4) + return -1; + return 1; + break; + } if (uart_platform.uart_methods.send_data_uart(scanner->handlePort, (void *)&ucBuffer, 2) != 2) @@ -180,9 +200,11 @@ rfBool rf60x_recevice_modbus_rtu(rf60x_t *scanner, rfUint8 count, return 1; } -void rf60x_close_port_uart(rf60x_t *scanner) { - uart_platform.uart_methods.close_file(scanner->handlePort); - memory_platform.rf_free(scanner->uart_info); +rfBool rf60x_close_port_uart(rf60x_t *scanner) { + rfBool result = uart_platform.uart_methods.close_file(scanner->handlePort); + //memory_platform.rf_free(scanner->uart_info); + + return result; } parameter_t *create_parameter_from_type(const rfChar *type) { @@ -545,8 +567,8 @@ rfBool rf60x_read_params_from_scanner_uart(rf60x_t *scanner) { scanner->user_params.CAN_interface_power_switch = ((ucResultBuffer[0] & 0x0F) | ((ucResultBuffer[1] & 0x0F) << 4)); ///////////////////////////////////////////////////////////////////////////////////////////// - ucBuffer[2] = 0x80 | 0x6C; - ucBuffer[3] = 0x80; + ucBuffer[2] = 0x80 | (0x6C & 0x0F); + ucBuffer[3] = 0x80 | ((0x6C >> 4) & 0x0F); if (uart_platform.uart_methods.send_data_uart(scanner->handlePort, (void *)&ucBuffer, 4) != 4) @@ -1711,8 +1733,8 @@ rfBool rf60x_write_params_to_scanner_uart(rf60x_t *scanner) { return -1; - scanner->user_params.network_address_uart = - ((ucResultBuffer[0] & 0x0F) | ((ucResultBuffer[1] & 0x0F) << 4)); + /* scanner->user_params.network_address_uart = + ((ucResultBuffer[0] & 0x0F) | ((ucResultBuffer[1] & 0x0F) << 4));*/ ///////////////////////////////////////////////////////////////////////////////////////////// ucBuffer[2] = 0x80 | 0x04; @@ -2383,7 +2405,12 @@ rf60x_uart_hello_t *rf60x_hello_msg_uart(rf60x_t *scanner) { rfByte RX[16]; - uart_platform.uart_methods.recv_data_uart(scanner->handlePort, RX, 16); + rfInt32 returnSize=uart_platform.uart_methods.recv_data_uart(scanner->handlePort, RX, 16); + + if( returnSize < 16) { + memory_platform.rf_free(uart_hello); + return NULL; + } uart_hello->deviceType = (RX[0] & 0x0F) | ((RX[1] & 0x0F) << 4); uart_hello->deviceModificaton = (RX[2] & 0x0F) | ((RX[3] & 0x0F) << 4); diff --git a/rf60Xcore/src/rf60X_devices.h b/rf60Xcore/src/rf60X_devices.h index 86c5965299c4386a4d62e5ad9372682b518a17b8..924be5f67dd544f2db5d28a9d94b2092cc972eaa 100644 --- a/rf60Xcore/src/rf60X_devices.h +++ b/rf60Xcore/src/rf60X_devices.h @@ -84,7 +84,7 @@ rfUint8 *rf60x_get_measure_uart(rf60x_t *scanner, rfUint8 size); * @brief rf60x_config_port_uart - Открывает COM- порт для связи с устройством * @param scanner - ptr to device */ -void rf60x_close_port_uart(rf60x_t *scanner); +rfBool rf60x_close_port_uart(rf60x_t *scanner); /** * @brief rf60x_uart_read_params_from_scanner - Read parameters from device to diff --git a/rf60Xcore/src/rf60X_sdk.c b/rf60Xcore/src/rf60X_sdk.c index f7ba6fb448f1f3150d4dc6bafeca0c6ca25eaed3..531425cf30dfb6653d5ed09029b9fa20e552ea4d 100644 --- a/rf60Xcore/src/rf60X_sdk.c +++ b/rf60Xcore/src/rf60X_sdk.c @@ -173,8 +173,8 @@ void config_port_uart(scanner_base_t *device) { rf60x_config_port_uart(device->rf60x); } -void close_port_uart(scanner_base_t *device) { - rf60x_close_port_uart(device->rf60x); +rfBool close_port_uart(scanner_base_t *device) { + return rf60x_close_port_uart(device->rf60x); } rfUint8 read_params_from_scanner_uart(scanner_base_t *device) { diff --git a/rf60Xcore/src/rf60X_sdk.h b/rf60Xcore/src/rf60X_sdk.h index e84a456a3029b7537785c7b9aee4daea97e9c30f..a6a6ac3b7d928048480b601e2b8b63906ece5645 100644 --- a/rf60Xcore/src/rf60X_sdk.h +++ b/rf60Xcore/src/rf60X_sdk.h @@ -111,7 +111,7 @@ dllexport rfUint8 recevice_modbus_rtu(scanner_base_t *device, rfUint8 count, * @brief close_port_uart - Close the COM port for communication with the device * @param scanner - ptr to device */ -dllexport void close_port_uart(scanner_base_t *device); +dllexport rfBool close_port_uart(scanner_base_t *device); /** * @brief read_params_from_scanner_uart - Read parameters from device to diff --git a/rf60Xcore/src/rf60X_types.h b/rf60Xcore/src/rf60X_types.h index 8c060d9ff4a7fb3afb368c1551ab458033d55d56..ff27434620aa01d5b306b8e8b26b8725a1550160 100644 --- a/rf60Xcore/src/rf60X_types.h +++ b/rf60Xcore/src/rf60X_types.h @@ -163,7 +163,7 @@ typedef enum { typedef enum { WRITEPARAM = 0x03, - SAVETOFLASH = 0x04, + SAVETOFLASH = 0xF4, //0x04 RESTOREFORMFLASH = 0x04, START_STREAM = 0x07, STOP_STREAM = 0x08 diff --git a/wrappers/Cpp/rf60Xsdk/CMakeLists.txt b/wrappers/Cpp/rf60Xsdk/CMakeLists.txt index df22e760063ed3ae65a5258bae712f428ac3dc8d..7c787fa78a4bb860071586abe776cf8cb9ba7f45 100644 --- a/wrappers/Cpp/rf60Xsdk/CMakeLists.txt +++ b/wrappers/Cpp/rf60Xsdk/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.5) + + ## ## PROJECT ## name and version @@ -19,8 +21,13 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # creating output directory architecture in accordance with GNU guidelines set(BINARY_DIR "${CMAKE_BINARY_DIR}") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BINARY_DIR}/bin") -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BINARY_DIR}/lib") +#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BINARY_DIR}/bin") +#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BINARY_DIR}/lib") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") + +option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) # set rf60Xcore path variable set(RF60XCORE_DIR "../../../rf60Xcore") @@ -34,12 +41,11 @@ file (GLOB CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) # concatenate the results (glob files) to variable set (SOURCES ${CPP_FILES} ${H_FILES}) - ## ## TARGET ## create target and add include path ## -add_library(${PROJECT_NAME} SHARED ${SOURCES}) +add_library(${PROJECT_NAME} ${SOURCES}) set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") target_include_directories(${PROJECT_NAME} PUBLIC @@ -52,6 +58,7 @@ if(MINGW) target_link_libraries(${PROJECT_NAME} iphlpapi) endif(MINGW) +get_filename_component(_vs_bin_path "${CMAKE_LINKER}" DIRECTORY) ## ## INSTALL @@ -66,3 +73,25 @@ install( ) install(FILES ${H_FILES} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/build/include) + +if (NOT BUILD_SHARED_LIBS) +if(MSVC) + # execute_process( + # COMMAND "${_vs_bin_path}/lib.exe" "/machine:x64" /out:${CMAKE_BINARY_DIR}/lib/rf60XMerge.lib ${CMAKE_BINARY_DIR}/lib/rf60Xsdk.lib ${CMAKE_BINARY_DIR}/lib/rf60Xcore.lib + # WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + # OUTPUT_VARIABLE OutVar + # ERROR_VARIABLE ErrVar + # RESULT_VARIABLE ExitCode) + + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND "${_vs_bin_path}/lib.exe" "/machine:x64" /out:${CMAKE_BINARY_DIR}/lib/rf60XMerge.lib ${CMAKE_BINARY_DIR}/lib/rf60Xsdk.lib ${CMAKE_BINARY_DIR}/lib/rf60Xcore.lib + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + VERBATIM + COMMENT "Running merge..." + ) + + +endif(MSVC) +endif(BUILD_SHARED_LIBS) + + diff --git a/wrappers/Cpp/rf60Xsdk/network.cpp b/wrappers/Cpp/rf60Xsdk/network.cpp index 84d1fe6fbc6b22f70ec8ef6088548f042306c165..171ec5bd8767875686b461886c56d872698bc6a1 100644 --- a/wrappers/Cpp/rf60Xsdk/network.cpp +++ b/wrappers/Cpp/rf60Xsdk/network.cpp @@ -6,9 +6,8 @@ #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "iphlpapi.lib") #endif -#include +#include #include -#include #include #else @@ -34,18 +33,18 @@ typedef struct sockaddr SOCKADDR; char* _ifs[64]; int _ifs_cnt; -int GetAdaptersCount() { return _ifs_cnt; } +auto GetAdaptersCount() -> int { return _ifs_cnt; } const char* GetAdapterAddress(int index) { if (index >= 0 && index < _ifs_cnt) { return _ifs[index]; } - return NULL; + return nullptr; } #if (defined _WIN32) BOOL WinSockInit() { - WORD wVersionRequested; + WORD wVersionRequested = 0; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData) != 0) { @@ -57,31 +56,35 @@ BOOL WinSockInit() { void WinSockDeinit() { WSACleanup(); } BOOL EnumAdapterAddresses() { - PIP_ADAPTER_ADDRESSES adapter_addresses, aa; - PIP_ADAPTER_UNICAST_ADDRESS ua; - DWORD rv, size; + PIP_ADAPTER_ADDRESSES adapter_addresses = nullptr; + PIP_ADAPTER_ADDRESSES aa = nullptr; + PIP_ADAPTER_UNICAST_ADDRESS ua = nullptr; + DWORD rv = 0; + DWORD size = 0; _ifs_cnt = 0; memset(_ifs, 0, sizeof(_ifs)); - rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, + rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &size); if (rv != ERROR_BUFFER_OVERFLOW) { return FALSE; } adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size); - rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, + rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, adapter_addresses, &size); if (rv != ERROR_SUCCESS) { free(adapter_addresses); return FALSE; } - for (aa = adapter_addresses; aa != NULL; aa = aa->Next) { - if (aa->OperStatus != IfOperStatusUp) continue; - for (ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next) { - if (ua->Address.lpSockaddr->sa_family != AF_INET) continue; + for (aa = adapter_addresses; aa != nullptr; aa = aa->Next) { + if (aa->OperStatus != IfOperStatusUp) { continue; +} + for (ua = aa->FirstUnicastAddress; ua != nullptr; ua = ua->Next) { + if (ua->Address.lpSockaddr->sa_family != AF_INET) { continue; +} _ifs[_ifs_cnt] = (char*)malloc(64); memset(_ifs[_ifs_cnt], 0, 64); sprintf(_ifs[_ifs_cnt++], "%u.%u.%u.%u", @@ -121,24 +124,27 @@ BOOL EnumAdapterAddresses() { void FreeAdapterAddresses() { for (int i = 0; i < _ifs_cnt; i++) { - if (_ifs[i]) { + if (_ifs[i] != nullptr) { free(_ifs[i]); - _ifs[i] = NULL; + _ifs[i] = nullptr; } } _ifs_cnt = 0; } BOOL MatchIP(const char* ip1, const char* ip2, const char* mask) { - unsigned long nip1, nip2, nmask; + unsigned long nip1 = 0; + unsigned long nip2 = 0; + unsigned long nmask = 0; nip1 = inet_addr(ip1); nip2 = inet_addr(ip2); nmask = mask ? inet_addr(mask) : inet_addr("255.255.255.0"); nip1 &= nmask; nip2 &= nmask; - if (nip1 == nip2) + if (nip1 == nip2) { return TRUE; - else +} + return FALSE; } @@ -154,7 +160,8 @@ BOOL MatchIP(const char* ip1, const char* ip2, const char* mask) { char* GetCompatibleInterface(const char* RemoteIP, const char* SubnetMask) { for (int i = 0; i < _ifs_cnt; i++) { - if (MatchIP(_ifs[i], RemoteIP, SubnetMask)) return _ifs[i]; + if (MatchIP(_ifs[i], RemoteIP, SubnetMask) != 0) { return _ifs[i]; + } } return NULL; } @@ -174,15 +181,16 @@ char* GetCompatibleInterface(const char* RemoteIP, const char* SubnetMask) { BOOL MatchUDP(u_long testIP, u_long hostIP) { u_long mul = testIP | hostIP; - if (mul == hostIP) + if (mul == hostIP) { return TRUE; - else + } return FALSE; } u_long GetUDPCompatibleInterface(u_long HostIP) { for (int i = 0; i < _ifs_cnt; i++) { - if (MatchUDP(inet_addr(_ifs[i]), HostIP)) return inet_addr(_ifs[i]); + if (MatchUDP(inet_addr(_ifs[i]), HostIP)) { return inet_addr(_ifs[i]); +} } return htonl(INADDR_ANY); } diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xcore.cpp b/wrappers/Cpp/rf60Xsdk/rf60Xcore.cpp index 972a9866d172255b7bd0ba51e1bca5e59ad85bbe..e79721e1efb4ae19bdea4dcd4e0cca4a3c44341a 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xcore.cpp +++ b/wrappers/Cpp/rf60Xsdk/rf60Xcore.cpp @@ -606,7 +606,8 @@ void* platform_create_file(char* COMPortName) { OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } -void platform_close_file(void* fileName) { CloseHandle((HANDLE)fileName); } + +uint8_t platform_close_file(void* fileName) { return CloseHandle((HANDLE)fileName); } rfInt32 platform_rec_data_uart(void* handleCOMPORT, void* buffer, rfUint8 numbeBytesToRead) { diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp index f82b12430254cd1053a9c6c68ce3d8d774e7d023..6b605838b2669a564be5c8aa4e6c53d7d6809b47 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp +++ b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp @@ -99,9 +99,9 @@ static unsigned char auchCRCHi[] = { uint16_t CRC16(unsigned char *puchMsg, uint16_t usDataLen) { unsigned char uchCRCHi = 0xFF; unsigned char uchCRCLo = 0xFF; - unsigned uIndex; + while (usDataLen--) { - uIndex = uchCRCHi ^ *puchMsg++; + unsigned uIndex = uchCRCHi ^ *puchMsg++; uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex]; uchCRCLo = auchCRCLo[uIndex]; } @@ -193,10 +193,14 @@ bool rf60x::open_port_uart() { } uart_hello_t rf60x::hello_msg_uart() { - uart_hello_t tempHello; + uart_hello_t tempHello{}; rf60x_uart_hello_t *tempReturnValue = ::hello_msg_uart((scanner_base_t *)scanner_base); + + if(tempReturnValue==NULL) + return tempHello; + memory_platform.rf_memcpy(&tempHello, tempReturnValue, sizeof(uart_hello_t)); memory_platform.rf_free(tempReturnValue); @@ -207,8 +211,8 @@ void rf60x::change_config_port_uart() { config_port_uart((scanner_base_t *)scanner_base); } -void rf60x::close_port_uart() { - ::close_port_uart((scanner_base_t *)scanner_base); +bool rf60x::close_port_uart() { + return ::close_port_uart((scanner_base_t *)scanner_base); } bool rf60x::get_measure_uart(void *measure,PROTOCOL_MEASURE_UART type) { @@ -476,7 +480,7 @@ bool rf60x::set_param(int param_id, ...) { } rf60x::rf60x(const config_base_information_rf60x_t &config) - : current_config(config) { + : current_config(config),m_count_modbus(0) { scanner_base_t *scanner_base_ti = (scanner_base_t *)memory_platform.rf_calloc(1, sizeof(scanner_base_t)); @@ -513,6 +517,7 @@ rf60x::~rf60x() { reinterpret_cast(scanner_base); memory_platform.rf_free(scanner_base_ti->rf60x); memory_platform.rf_free(scanner_base_ti); + _flushall(); } } // namespace RF60X diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.h b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.h index 8b7e5684c04154eddec480f8ad2da9e98ff9718c..14ccbc624bb611995e52919528089b7259671743 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.h +++ b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.h @@ -48,7 +48,7 @@ class API_EXPORT rf60x { void change_config_port_uart(); - void close_port_uart(); + bool close_port_uart(); bool get_measure_uart(void* measure, PROTOCOL_MEASURE_UART type); @@ -64,8 +64,6 @@ class API_EXPORT rf60x { bool send_command(COMMAND_UART CMD); - void flash_params_to_scanner_uart(); - param_t* get_param(std::string param_name); param_t* get_param(PARAM_NAME_KEY param_name); diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h b/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h index 1fd6693b60b71d1aaad88f55935298db4a79cb97..e251a827f8e06c0f31159f73aceb7a059363938f 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h +++ b/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h @@ -96,7 +96,7 @@ const static std::string param_value_types[] = { "int64_t", "float_t", "double_t", "u32_arr_t", "u64_arr_t", "i32_arr_t", "i64_arr_t", "flt_array_t", "dbl_array_t", "string_t"}; -typedef struct { +typedef struct ParamType{ std::string name; std::string type; std::string access; @@ -286,7 +286,7 @@ enum class BAUR_RATE_UART { enum class COMMAND_UART { WRITEPARAM = 0x03, - SAVETOFLASH = 0x04, + SAVETOFLASH = 0xF4, RESTOREFORMFLASH = 0x04, GETRESULT = 0x06, START_STREAM = 0x07, diff --git a/wrappers/DotNet/rf60Xsdk/rf60Xsdk/rf60XsdkNet.h b/wrappers/DotNet/rf60Xsdk/rf60Xsdk/rf60XsdkNet.h index fbc97fae081aeb9b489a826e18edd751787312cb..2feadaae5191491e6495df0584f5ee008cafd6d0 100644 --- a/wrappers/DotNet/rf60Xsdk/rf60Xsdk/rf60XsdkNet.h +++ b/wrappers/DotNet/rf60Xsdk/rf60Xsdk/rf60XsdkNet.h @@ -36,8 +36,8 @@ namespace rf60Xsdk { public enum class COMMAND_UART_NET { WRITEPARAM = 0x03, - SAVETOFLASH = 0x04AA, - RESTOREFORMFLASH = 0x0469, + SAVETOFLASH = 0xF4, + RESTOREFORMFLASH = 0x04, START_STREAM = 0x07, STOP_STREAM = 0x08 };