diff --git a/src/librf625.cpp b/src/librf625.cpp index e7780a30c3cd4628a6c63b5910d4facd49cd85ff..37398474ab7c97cdb0d53dcddeffb5e883fbb599 100644 --- a/src/librf625.cpp +++ b/src/librf625.cpp @@ -102,7 +102,7 @@ void rf625::cleanup() #endif } -rf625_info_list rf625::search(int ntime) +rf625_list rf625::search(int time_ms) { const size_t buf_size = 268; const int recv_timeo = 250; @@ -112,14 +112,14 @@ rf625_info_list rf625::search(int ntime) struct sockaddr_in recv_addr; struct sockaddr_in from_addr; socklen_t from_len; - rf625_info_list res; + rf625_list result; struct timeb start_t, now_t; int nret; register size_t i; char* buf = nullptr; s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == SOCKET_ERROR) { - return res; + return result; } set_sock_recvtimeo(s, recv_timeo); recv_addr.sin_family = AF_INET; @@ -138,7 +138,7 @@ rf625_info_list rf625::search(int ntime) #endif nret = bind(s, reinterpret_cast(&recv_addr), sizeof(recv_addr)); if (nret == SOCKET_ERROR) { - return res; + return result; } } buf = new char[buf_size]; @@ -152,11 +152,11 @@ rf625_info_list rf625::search(int ntime) rf625_info info; memset(&info, 0, sizeof(info)); memcpy(&info.serial_number, &buf[12+1], 3); - for (i=0; i<=res.size(); i++) { - if (iget_info().serial_number == info.serial_number) break; } - if (i<=res.size()) + if (i<=result.size()) continue; memcpy(&info.hardware_address, &buf[6], 6); memcpy(&info.ip_address, &buf[2], 4); @@ -186,11 +186,11 @@ rf625_info_list rf625::search(int ntime) memcpy(&info.fpga_version, &buf[12+29], 4); memcpy(&info.uptime, &buf[12+228], 4); info.tcp_connection_active = (buf[12+202] != 0); - res.push_back(info); + result.push_back(std::shared_ptr(new rf625(info))); } } ftime(&now_t); - } while ((now_t.time - start_t.time) * 1000 + (int(now_t.millitm) - int(start_t.millitm)) < ntime); + } while ((now_t.time - start_t.time) * 1000 + (int(now_t.millitm) - int(start_t.millitm)) < time_ms); #ifdef _WIN32 shutdown(s, 0x02); /* SD_BOTH */ closesocket(s); @@ -198,7 +198,7 @@ rf625_info_list rf625::search(int ntime) close(s); #endif delete[] buf; - return res; + return result; } rf625::rf625(const rf625_info &info) @@ -255,7 +255,12 @@ rf625::~rf625() #endif } delete[] m_user_cfg_area; - delete[] m_buf; + delete[] m_buf; +} + +const rf625_info &rf625::get_info() const +{ + return m_info; } bool rf625::connect() @@ -947,7 +952,11 @@ static bool send_broadcast_command( { ssnd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (ssnd == INVALID_SOCKET) +#ifdef _WIN32 continue; +#else + return false; +#endif nret = 1; setsockopt(ssnd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast(&nret), sizeof(nret)); sin.sin_family = AF_INET; @@ -965,7 +974,7 @@ static bool send_broadcast_command( if (nret == 16) { if (params_length > 1) { nret = sendto(ssnd, reinterpret_cast(pparams), params_length, 0, reinterpret_cast(&send_addr), sizeof(send_addr)); - if (nret == params_length) + if (nret == int(params_length)) ret = true; } else { @@ -991,7 +1000,7 @@ static bool send_broadcast_command( #else close(srcv); #endif - return (nret == answ_length); + return (nret == int(answ_length)); } else { return ret; @@ -1090,7 +1099,7 @@ void udpproc(rf625_profile profile) std::cout << "proc" << std::endl; std::cout << "mc " << profile.measure_cnt << " pc " << profile.packet_cnt << " "; std::cout << profile.points.size() << " points: ["; - for (register int j=0; j(profile.points.size()-3)) std::cout << "(" << profile.points.at(j).x << "," << profile.points.at(j).z << ")"; else if (j==2) @@ -1106,7 +1115,7 @@ void udpproc2(rf625_profile profile) std::cout << "sn " << profile.serial_number << " from " << inet_ntoa(in) << std::endl; } -int main(int argc, const char* argv[]) +int main() { t_assert(rf625::init(), "init"); std::cout << "Testing data on port 6003" << std::endl; @@ -1119,7 +1128,7 @@ int main(int argc, const char* argv[]) if (t_assert(test_dev.udp_get_result(profile), "udp_get_result")) { std::cout << "sn " << profile.serial_number << " mc " << profile.measure_cnt << " pc " << profile.packet_cnt << " "; std::cout << profile.points.size() << " points: ["; - for (register int j=0; j(profile.points.size()-3)) std::cout << "(" << profile.points.at(j).x << "," << profile.points.at(j).z << ")"; else if (j==2) @@ -1129,14 +1138,14 @@ int main(int argc, const char* argv[]) } } std::cout << "Searching" << std::endl; - rf625_info_list lst = rf625::search(3000); + auto lst = rf625::search(3000); rf625_parameters params; if (t_assert(lst.size() > 0, "search")) { std::cout << "Found " << lst.size() << std::endl; - rf625 dev(lst.at(0)); + auto dev = lst.at(0); std::cout << "TCP test" << std::endl; - if (t_assert(dev.connect(), "connect")) { - if (t_assert(dev.read_params(params), "read_params")) { + if (t_assert(dev->connect(), "connect")) { + if (t_assert(dev->read_params(params), "read_params")) { std::cout << "Current trigger " << (int)params.trigger << std::endl; // params.trigger = (params.trigger == max_frequency) ? external_input : max_frequency; // if (t_assert(dev.write_params(params), "write_params")) { @@ -1148,10 +1157,10 @@ int main(int argc, const char* argv[]) for (register int i=0; i<110; i++) { if (i<100) { - if (t_assert(dev.get_result(profile), "get_result")) { + if (t_assert(dev->get_result(profile), "get_result")) { std::cout << "mc " << profile.measure_cnt << " pc " << profile.packet_cnt << " "; std::cout << profile.points.size() << " points: ["; - for (register int j=0; j(profile.points.size()-3)) std::cout << "(" << profile.points.at(j).x << "," << profile.points.at(j).z << ")"; else if (j==2) @@ -1162,7 +1171,7 @@ int main(int argc, const char* argv[]) } else { - if (t_assert(dev.get_image(ppixmap), "get_image")) { + if (t_assert(dev->get_image(ppixmap), "get_image")) { //std::string file_name = "image_" + std::to_string(i) + ".bmp"; } } @@ -1170,15 +1179,15 @@ int main(int argc, const char* argv[]) delete[] ppixmap; } } - t_assert(dev.disconnect(), "disconnect"); + t_assert(dev->disconnect(), "disconnect"); } std::cout << "UDP test" << std::endl; rf625_profile profile; for (register int i=0; i<110; i++) { - if (t_assert(dev.udp_get_result(profile), "udp_get_result")) { + if (t_assert(dev->udp_get_result(profile), "udp_get_result")) { std::cout << "mc " << profile.measure_cnt << " pc " << profile.packet_cnt << " "; std::cout << profile.points.size() << " points: ["; - for (register int j=0; j(profile.points.size()-3)) std::cout << "(" << profile.points.at(j).x << "," << profile.points.at(j).z << ")"; else if (j==2) @@ -1190,16 +1199,16 @@ int main(int argc, const char* argv[]) std::cout << "Testing thread" << std::endl; params.laser_enable = false; params.laser_level = 10; - dev.uc_write_params(8014, params, Laser_Enable); - dev.udp_register_callback(udpproc); + dev->uc_write_params(8014, params, Laser_Enable); + dev->udp_register_callback(udpproc); std::this_thread::sleep_for(std::chrono::milliseconds(500)); params.laser_enable = true; params.laser_level = 255; - dev.uc_write_params(8014, params, Laser_Enable|Laser_Level); + dev->uc_write_params(8014, params, Laser_Enable|Laser_Level); std::this_thread::sleep_for(std::chrono::milliseconds(1500)); - dev.udp_register_callback(udpproc2); + dev->udp_register_callback(udpproc2); std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - dev.udp_unregister_callback(); + dev->udp_unregister_callback(); } rf625::cleanup(); std::cout << std::endl << "Finished, rc=" << t_rc << std::endl; diff --git a/src/librf625.h b/src/librf625.h index 974975a8e52aa4f8d965159e025840740ea78a51..680a7a689aad46ce8056125be1a76265538b18e3 100644 --- a/src/librf625.h +++ b/src/librf625.h @@ -181,8 +181,12 @@ struct rf625_profile uint16_t x_emr; //!< Range of X (EMR), mm uint16_t z_range; //!< Range of Z, mm }; -typedef std::vector rf625_info_list; + +class rf625; +typedef std::vector> rf625_list; + typedef void (*rf625_udp_proc)(rf625_profile profile); + class RF625_API rf625 { public: @@ -199,12 +203,15 @@ public: * \param ntime : search time in milliseconds * \return list of s_rf625_info structures for each of instances found */ - static rf625_info_list search(int ntime); + static rf625_list search(int time_ms); /*! rf625 constructor * \param info : rf625_info structure */ explicit rf625(const rf625_info& info); ~rf625(); + + const rf625_info& get_info() const; + /*! Start TCP connection to scanner * \return true on success */