// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /*! * @file main.cxx * This file acts as a main entry point to the application. * * This file was generated by the tool fastddsgen. */ #include #include #include #include #include #include #include #include #include "Subscriber.hpp" #include "msg.hpp" #include "DEBUG.hpp" #include "YQNetCom.h" using eprosima::fastdds::dds::Log; std::function stop_handler; void signal_handler( int signum) { stop_handler(signum); } std::string parse_signal( const int& signum) { switch (signum) { case SIGINT: return "SIGINT"; case SIGTERM: return "SIGTERM"; #ifndef _WIN32 case SIGQUIT: return "SIGQUIT"; case SIGHUP: return "SIGHUP"; #endif // _WIN32 default: return "UNKNOWN SIGNAL"; } } static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); } std::string base64_encode(const std::string &input) { std::string ret; int i = 0; int j = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; size_t in_len = input.size(); const char *bytes_to_encode = input.c_str(); while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; i < 4; i++) { ret += base64_chars[char_array_4[i]]; } i = 0; } } if (i) { for (j = i; j < 3; j++) { char_array_3[j] = '\0'; } char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); for (j = 0; j < i + 1; j++) { ret += base64_chars[char_array_4[j]]; } while (i++ < 3) { ret += '='; } } return ret; } void send_text(std::string ip_addr, int port, std::string text) { char *user_name = "guest", *user_pwd = "guest"; int dynamic_type = 1; int display_effects = 0; int display_speed = 16; int stay_time = 10; int gif_flag = 0; char *bg_color = "0xff000000"; char *color = "0xffffffff"; char *font_attributes = "normal"; char *font = "SimSun"; char *align_h = "0"; char *align_v = "0"; char *ali = ""; int err; std::vector ip(ip_addr.begin(), ip_addr.end()); ip.push_back('\0'); std::string encoded_str = base64_encode(text); std::vector wcstring(encoded_str.begin(), encoded_str.end()); wcstring.push_back('\0'); int b = check_time(ip.data(), port, user_name, user_pwd); DEBUG("check_time==" << b); unsigned long play_list = create_playlist(128, 128, 8280); printf("create_playlist: %p\n", play_list); char *program_name = "program_0"; unsigned long program = create_program(program_name, bg_color); printf("create_program: %p\n", program); unsigned long dynamic_area = create_dynamic(); printf("create_dynamic: %p\n", dynamic_area); err = add_dynamic_unit(dynamic_area, dynamic_type, display_effects, display_speed, stay_time, wcstring.data(), gif_flag, bg_color, 14, font, color, font_attributes, align_h, align_v, 0, 0, 0, "", "", 0); DEBUG("add_dynamic_unit:" << err); err = add_dynamic(program, dynamic_area, 0, 0, 0, 128, 128, ali, 0, ali, 100); DEBUG("add_dynamic:" << err); delete_dynamic(dynamic_area); err = add_program_in_playlist(play_list, program, 0, 10, ali, ali, ali, ali, 127); DEBUG("add_program_in_playlist:" << err); err = update_dynamic_small(ip.data(), port, user_name, user_pwd, play_list, "", 1, 0); if (err != 0) { DEBUG(ip.data() << "update_dynamic_small:" << err); } delete_playlist(play_list); } void send_default(std::string ip_addr, int port) { char *user_name = "guest", *user_pwd = "guest"; int dynamic_type = 1; int display_effects = 0; int display_speed = 16; int stay_time = 10; int gif_flag = 0; char *bg_color = "0xff000000"; char *color = "0xffffffff"; char *font_attributes = "normal"; char *font = "SimSun"; char *align_h = "0"; char *align_v = "0"; char *ali = ""; int err; std::vector ip(ip_addr.begin(), ip_addr.end()); ip.push_back('\0'); std::string wcstring = "led.txt"; int b = check_time(ip.data(), port, user_name, user_pwd); DEBUG("check_time==" << b); unsigned long play_list = create_playlist(128, 128, 8280); printf("create_playlist: %p\n", play_list); char *program_name = "program_0"; unsigned long program = create_program(program_name, bg_color); printf("create_program: %p\n", program); unsigned long dynamic_area = create_dynamic(); printf("create_dynamic: %p\n", dynamic_area); err = add_dynamic_unit(dynamic_area, dynamic_type, display_effects, display_speed, stay_time, wcstring.data(), gif_flag, bg_color, 14, font, color, font_attributes, align_h, align_v, 0, 0, 0, "", "", 0); DEBUG("add_dynamic_unit:" << err); err = add_dynamic(program, dynamic_area, 0, 0, 0, 128, 128, ali, 0, ali, 100); DEBUG("add_dynamic:" << err); delete_dynamic(dynamic_area); err = add_program_in_playlist(play_list, program, 0, 10, ali, ali, ali, ali, 127); DEBUG("add_program_in_playlist:" << err); err = update_dynamic(ip.data(), port, user_name, user_pwd, play_list, "", 1, 0); if (err != 0) { DEBUG(ip.data() << "update_dynamic:" << err); } delete_playlist(play_list); } std::queue DdsMsgData::ScaleInfo_queue_; std::queue DdsMsgData::WeightInfoOk_queue_; std::queue DdsMsgData::WeightInfoError_queue_; std::mutex DdsMsgData::queue_cv_mtx_; std::atomic running(true); int main(int argc, char** argv) { auto ret = EXIT_SUCCESS; std::shared_ptr sub; int domain_id = 0; int port = 80; std::string addr = "192.168.1.100"; uint8_t clear_led = 1; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "--domain") == 0 && i + 1 < argc) { domain_id = atoi(argv[++i]); } else if (strcmp(argv[i], "--addr") == 0 && i + 1 < argc) { addr = argv[++i]; } else if (strcmp(argv[i], "--port") == 0 && i + 1 < argc) { port = atoi(argv[++i]); } else if (strcmp(argv[i], "--version") == 0) { std::cout << "Vesrion: " << PROGRAM_VERSION << "\n"; return EXIT_SUCCESS; } else if (strcmp(argv[i], "--help") == 0) { std::cout << "Usage: [options]\n" << "Options:\n" << " --domain Set domain ID\n" << " --addr Set led addr (e.g., 192.168.1.1)\n" << " --port Set port name (e.g., 80)\n" << " --version Show software Version\n" << " --help Show this help message\n"; return EXIT_SUCCESS; } else { std::cerr << "Unknown option: " << argv[i] << "\n"; std::cout << "Usage: [options]\n" << "Options:\n" << " --domain Set domain ID\n" << " --addr Set led addr (e.g., 192.168.1.1)\n" << " --port Set port name (e.g., 80)\n" << " --version Show software Version\n" << " --help Show this help message\n"; return EXIT_FAILURE; } } sub = std::make_shared(domain_id); DEBUG("Program is running. Please press Ctrl+C to stop at any time."); auto formatFloat = [](float value) -> std::string { std::ostringstream oss; oss << std::fixed << std::setprecision(2) << value; return oss.str(); }; send_default(addr, port); while(running.load()) { std::unique_lock lock(DdsMsgData::queue_cv_mtx_, std::try_to_lock); if (lock.owns_lock()) { if(!DdsMsgData::WeightInfoOk_queue_.empty()) { WeighingSystem::WeightInfoOk info = std::move(DdsMsgData::WeightInfoOk_queue_.front()); DdsMsgData::WeightInfoOk_queue_.pop(); lock.unlock(); send_text(addr, port, info.Warning()); clear_led = 0; } else if (!DdsMsgData::WeightInfoError_queue_.empty()) { WeighingSystem::WeightInfoError info = std::move(DdsMsgData::WeightInfoError_queue_.front()); DdsMsgData::WeightInfoError_queue_.pop(); lock.unlock(); send_text(addr, port, info.Warning()); clear_led = 0; } else if (!DdsMsgData::ScaleInfo_queue_.empty()) { WeighingSystem::ScaleInfo info = std::move(DdsMsgData::ScaleInfo_queue_.front()); DdsMsgData::ScaleInfo_queue_.pop(); lock.unlock(); if (info.HasVehicle() == false) { if (clear_led == 0) { send_default(addr, port); clear_led = 1; } } } else { lock.unlock(); } } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } stop_handler = [&](int signum) { std::cout << "\n" << parse_signal(signum) << " received, stopping " << argv[1] << " execution." << std::endl; running.store(false); }; signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #ifndef _WIN32 signal(SIGQUIT, signal_handler); signal(SIGHUP, signal_handler); #endif // _WIN32 Log::Reset(); return ret; }