update
This commit is contained in:
Binary file not shown.
@@ -6,8 +6,8 @@
|
|||||||
|_| \_|_____| |_| \_/\_/ \___/|_| \_\_|\_\
|
|_| \_|_____| |_| \_/\_/ \___/|_| \_\_|\_\
|
||||||
|
|
||||||
|
|
||||||
Modern 4G Connection Status Display
|
Modern Network Status Display (4G + WiFi)
|
||||||
Get 4G status and signal quality from SQLite database config_table
|
Get 4G status, signal quality, and WiFi status from SQLite database config_table
|
||||||
|
|
||||||
Pour compiler:
|
Pour compiler:
|
||||||
g++ -I/var/www/moduleair_pro_4g/matrix/include -L/var/www/moduleair_pro_4g/matrix/lib /var/www/moduleair_pro_4g/matrix/screenNetwork/network_status.cc -o /var/www/moduleair_pro_4g/matrix/screenNetwork/network_status -lrgbmatrix -lsqlite3
|
g++ -I/var/www/moduleair_pro_4g/matrix/include -L/var/www/moduleair_pro_4g/matrix/lib /var/www/moduleair_pro_4g/matrix/screenNetwork/network_status.cc -o /var/www/moduleair_pro_4g/matrix/screenNetwork/network_status -lrgbmatrix -lsqlite3
|
||||||
@@ -70,6 +70,29 @@ void log(const std::string& type, const std::string& message) {
|
|||||||
std::cout << color << message << RESET << std::endl;
|
std::cout << color << message << RESET << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to get WiFi status from database
|
||||||
|
bool get_wifi_status(sqlite3* db, std::string& wifi_status) {
|
||||||
|
sqlite3_stmt* stmt;
|
||||||
|
bool status_found = false;
|
||||||
|
|
||||||
|
log("BLUE", "Querying WiFi status from database...");
|
||||||
|
|
||||||
|
const char* query = "SELECT value FROM config_table WHERE key='WIFI_status'";
|
||||||
|
if (sqlite3_prepare_v2(db, query, -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
|
wifi_status = (char*)sqlite3_column_text(stmt, 0);
|
||||||
|
status_found = true;
|
||||||
|
std::cout << " WiFi Status: " << wifi_status << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << " No WiFi status found in config_table" << std::endl;
|
||||||
|
wifi_status = "unknown";
|
||||||
|
}
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status_found;
|
||||||
|
}
|
||||||
|
|
||||||
// Function to get 4G status from database
|
// Function to get 4G status from database
|
||||||
bool get_4g_status(sqlite3* db, std::string& network_status, int& signal_quality) {
|
bool get_4g_status(sqlite3* db, std::string& network_status, int& signal_quality) {
|
||||||
sqlite3_stmt* stmt;
|
sqlite3_stmt* stmt;
|
||||||
@@ -238,8 +261,8 @@ void draw_connection_icon(Canvas* canvas, int x, int y, const std::string& statu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to draw the entire 4G status screen
|
// Function to draw the entire network status screen (4G + WiFi)
|
||||||
void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signal_quality) {
|
void draw_network_screen(Canvas* canvas, const std::string& network_status, int signal_quality, const std::string& wifi_status) {
|
||||||
rgb_matrix::Color white(255, 255, 255);
|
rgb_matrix::Color white(255, 255, 255);
|
||||||
rgb_matrix::Color cyan(0, 255, 255);
|
rgb_matrix::Color cyan(0, 255, 255);
|
||||||
rgb_matrix::Color bg_color(0, 0, 0);
|
rgb_matrix::Color bg_color(0, 0, 0);
|
||||||
@@ -279,16 +302,16 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
// Draw basic status without fonts
|
// Draw basic status without fonts
|
||||||
canvas->Clear();
|
canvas->Clear();
|
||||||
|
|
||||||
// Draw simple status indicators using pixels
|
// Draw simple 4G status indicators using pixels
|
||||||
if (network_status == "connected") {
|
if (network_status == "connected") {
|
||||||
// Draw green rectangle
|
// Draw green rectangle for 4G
|
||||||
for (int x = 10; x < 30; x++) {
|
for (int x = 10; x < 30; x++) {
|
||||||
for (int y = 10; y < 20; y++) {
|
for (int y = 10; y < 20; y++) {
|
||||||
canvas->SetPixel(x, y, 0, 255, 0);
|
canvas->SetPixel(x, y, 0, 255, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Draw red rectangle
|
// Draw red rectangle for 4G
|
||||||
for (int x = 10; x < 30; x++) {
|
for (int x = 10; x < 30; x++) {
|
||||||
for (int y = 10; y < 20; y++) {
|
for (int y = 10; y < 20; y++) {
|
||||||
canvas->SetPixel(x, y, 255, 0, 0);
|
canvas->SetPixel(x, y, 255, 0, 0);
|
||||||
@@ -296,9 +319,33 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only draw signal bars if connected
|
// Draw simple WiFi status indicators using pixels
|
||||||
|
if (wifi_status == "connected") {
|
||||||
|
// Draw green rectangle for WiFi
|
||||||
|
for (int x = 35; x < 55; x++) {
|
||||||
|
for (int y = 10; y < 20; y++) {
|
||||||
|
canvas->SetPixel(x, y, 0, 255, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (wifi_status == "hotspot") {
|
||||||
|
// Draw orange rectangle for WiFi hotspot
|
||||||
|
for (int x = 35; x < 55; x++) {
|
||||||
|
for (int y = 10; y < 20; y++) {
|
||||||
|
canvas->SetPixel(x, y, 255, 165, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Draw red rectangle for WiFi disconnected/unknown
|
||||||
|
for (int x = 35; x < 55; x++) {
|
||||||
|
for (int y = 10; y < 20; y++) {
|
||||||
|
canvas->SetPixel(x, y, 255, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only draw signal bars if 4G connected
|
||||||
if (network_status == "connected") {
|
if (network_status == "connected") {
|
||||||
draw_signal_bars(canvas, 55, 30, signal_quality);
|
draw_signal_bars(canvas, 70, 30, signal_quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Using fallback display (no fonts)" << std::endl;
|
std::cout << "Using fallback display (no fonts)" << std::endl;
|
||||||
@@ -309,15 +356,36 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
canvas->Clear();
|
canvas->Clear();
|
||||||
|
|
||||||
// Draw title
|
// Draw title
|
||||||
rgb_matrix::DrawText(canvas, title_font, 2, title_font.baseline() + 2, cyan, &bg_color, "4G CONNECTION", 0);
|
rgb_matrix::DrawText(canvas, title_font, 2, title_font.baseline() + 2, cyan, &bg_color, "NETWORK STATUS", 0);
|
||||||
|
|
||||||
// Draw connection status section
|
// Draw WiFi connection status section (moved to first)
|
||||||
int status_y = 25;
|
int wifi_y = 20;
|
||||||
rgb_matrix::DrawText(canvas, value_font, 2, status_y, white, &bg_color, "Status:", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, wifi_y, white, &bg_color, "WiFi:", 0);
|
||||||
|
|
||||||
// Don't draw connection icon - removed for cleaner text-only display
|
// Draw WiFi status text
|
||||||
|
rgb_matrix::Color wifi_color;
|
||||||
|
std::string wifi_text = wifi_status;
|
||||||
|
std::transform(wifi_text.begin(), wifi_text.end(), wifi_text.begin(), ::toupper);
|
||||||
|
|
||||||
// Draw status text
|
if (wifi_status == "connected") {
|
||||||
|
wifi_color = rgb_matrix::Color(0, 255, 0); // Green
|
||||||
|
} else if (wifi_status == "hotspot") {
|
||||||
|
wifi_color = rgb_matrix::Color(255, 165, 0); // Orange
|
||||||
|
wifi_text = "HOTSPOT";
|
||||||
|
} else if (wifi_status == "disconnected") {
|
||||||
|
wifi_color = rgb_matrix::Color(255, 0, 0); // Red
|
||||||
|
} else {
|
||||||
|
wifi_color = rgb_matrix::Color(128, 128, 128); // Gray
|
||||||
|
wifi_text = "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
rgb_matrix::DrawText(canvas, value_font, 35, wifi_y, wifi_color, &bg_color, wifi_text.c_str(), 0);
|
||||||
|
|
||||||
|
// Draw 4G connection status section (moved to second)
|
||||||
|
int status_y = 30;
|
||||||
|
rgb_matrix::DrawText(canvas, value_font, 2, status_y, white, &bg_color, "4G:", 0);
|
||||||
|
|
||||||
|
// Draw 4G status text
|
||||||
rgb_matrix::Color status_color;
|
rgb_matrix::Color status_color;
|
||||||
std::string status_text = network_status;
|
std::string status_text = network_status;
|
||||||
std::transform(status_text.begin(), status_text.end(), status_text.begin(), ::toupper);
|
std::transform(status_text.begin(), status_text.end(), status_text.begin(), ::toupper);
|
||||||
@@ -327,7 +395,7 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
} else if (network_status == "connecting") {
|
} else if (network_status == "connecting") {
|
||||||
status_color = rgb_matrix::Color(255, 255, 0); // Yellow
|
status_color = rgb_matrix::Color(255, 255, 0); // Yellow
|
||||||
} else if (network_status == "booting") {
|
} else if (network_status == "booting") {
|
||||||
status_color = rgb_matrix::Color(255, 255, 0); // Changed from orange to yellow
|
status_color = rgb_matrix::Color(255, 255, 0); // Yellow
|
||||||
status_text = "BOOTING";
|
status_text = "BOOTING";
|
||||||
} else if (network_status == "disconnected" || network_status == "error") {
|
} else if (network_status == "disconnected" || network_status == "error") {
|
||||||
status_color = rgb_matrix::Color(255, 0, 0); // Red
|
status_color = rgb_matrix::Color(255, 0, 0); // Red
|
||||||
@@ -336,22 +404,22 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
status_text = "UNKNOWN";
|
status_text = "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
rgb_matrix::DrawText(canvas, value_font, 45, status_y, status_color, &bg_color, status_text.c_str(), 0);
|
rgb_matrix::DrawText(canvas, value_font, 25, status_y, status_color, &bg_color, status_text.c_str(), 0);
|
||||||
|
|
||||||
// Only show signal section if connected (NOT for booting, disconnected, or error)
|
// Only show 4G signal section if 4G connected (NOT for booting, disconnected, or error)
|
||||||
if (network_status == "connected") {
|
if (network_status == "connected") {
|
||||||
// Draw signal strength section
|
// Draw 4G signal strength section (moved higher to prevent truncation)
|
||||||
int signal_y = 45;
|
int signal_y = 42;
|
||||||
rgb_matrix::DrawText(canvas, value_font, 2, signal_y, white, &bg_color, "Signal:", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, signal_y, white, &bg_color, "4G Signal:", 0);
|
||||||
|
|
||||||
// Draw signal bars
|
// Draw signal bars
|
||||||
draw_signal_bars(canvas, 45, signal_y - 2, signal_quality);
|
draw_signal_bars(canvas, 65, signal_y - 2, signal_quality);
|
||||||
|
|
||||||
// Draw signal value
|
// Draw signal value with safe spacing from bottom edge
|
||||||
if (signal_quality != -999) {
|
if (signal_quality != -999) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "RSSI: " << signal_quality;
|
ss << "RSSI: " << signal_quality;
|
||||||
rgb_matrix::DrawText(canvas, small_font, 70, signal_y - 3, white, &bg_color, ss.str().c_str(), 0);
|
rgb_matrix::DrawText(canvas, small_font, 2, signal_y + 8, white, &bg_color, ss.str().c_str(), 0);
|
||||||
|
|
||||||
// Draw signal quality text based on RSSI
|
// Draw signal quality text based on RSSI
|
||||||
std::string quality_text;
|
std::string quality_text;
|
||||||
@@ -377,35 +445,35 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
quality_color = rgb_matrix::Color(255, 0, 0);
|
quality_color = rgb_matrix::Color(255, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position quality text higher to avoid clipping
|
// Position quality text on the right side with safe spacing
|
||||||
rgb_matrix::DrawText(canvas, small_font, 70, signal_y + 5, quality_color, &bg_color, quality_text.c_str(), 0);
|
rgb_matrix::DrawText(canvas, small_font, 70, signal_y + 8, quality_color, &bg_color, quality_text.c_str(), 0);
|
||||||
} else {
|
} else {
|
||||||
rgb_matrix::DrawText(canvas, small_font, 70, signal_y - 3, rgb_matrix::Color(128, 128, 128), &bg_color, "NO DATA", 0);
|
rgb_matrix::DrawText(canvas, small_font, 2, signal_y + 8, rgb_matrix::Color(128, 128, 128), &bg_color, "NO DATA", 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Clear the signal area completely for all non-connected states
|
// Clear the 4G signal area completely for all non-connected states
|
||||||
for (int clear_x = 0; clear_x < 128; clear_x++) {
|
for (int clear_x = 0; clear_x < 128; clear_x++) {
|
||||||
for (int clear_y = 35; clear_y < 55; clear_y++) {
|
for (int clear_y = 37; clear_y < 64; clear_y++) {
|
||||||
canvas->SetPixel(clear_x, clear_y, 0, 0, 0);
|
canvas->SetPixel(clear_x, clear_y, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show appropriate message based on status
|
// Show appropriate message based on 4G status (safe positioning)
|
||||||
int msg_y = 45;
|
int msg_y = 42;
|
||||||
int msg_y_second_line = 55;
|
int msg_y_second_line = 52;
|
||||||
|
|
||||||
if (network_status == "booting") {
|
if (network_status == "booting") {
|
||||||
rgb_matrix::DrawText(canvas, value_font, 2, msg_y, rgb_matrix::Color(255, 255, 0), &bg_color, "Initializing modem...", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y, rgb_matrix::Color(255, 255, 0), &bg_color, "4G: Initializing...", 0);
|
||||||
} else if (network_status == "disconnected") {
|
} else if (network_status == "disconnected") {
|
||||||
rgb_matrix::DrawText(canvas, value_font, 20, msg_y, rgb_matrix::Color(255, 0, 0), &bg_color, "Connection lost", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y, rgb_matrix::Color(255, 0, 0), &bg_color, "4G: Connection lost", 0);
|
||||||
rgb_matrix::DrawText(canvas, value_font, 20, msg_y_second_line, rgb_matrix::Color(255, 0, 0), &bg_color, " try reconnect", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y_second_line, rgb_matrix::Color(255, 0, 0), &bg_color, " Try reconnect", 0);
|
||||||
|
|
||||||
} else if (network_status == "error") {
|
} else if (network_status == "error") {
|
||||||
rgb_matrix::DrawText(canvas, value_font, 25, msg_y, rgb_matrix::Color(255, 0, 0), &bg_color, "Modem error", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y, rgb_matrix::Color(255, 0, 0), &bg_color, "4G: Modem error", 0);
|
||||||
rgb_matrix::DrawText(canvas, value_font, 20, msg_y_second_line, rgb_matrix::Color(255, 0, 0), &bg_color, " try reconnect", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y_second_line, rgb_matrix::Color(255, 0, 0), &bg_color, " Try reconnect", 0);
|
||||||
|
|
||||||
} else if (network_status == "connecting") {
|
} else if (network_status == "connecting") {
|
||||||
rgb_matrix::DrawText(canvas, value_font, 20, msg_y, rgb_matrix::Color(255, 255, 0), &bg_color, "Connecting...", 0);
|
rgb_matrix::DrawText(canvas, value_font, 2, msg_y, rgb_matrix::Color(255, 255, 0), &bg_color, "4G: Connecting...", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,7 +492,7 @@ void draw_4g_screen(Canvas* canvas, const std::string& network_status, int signa
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
log("BLUE", "4G Status Display started");
|
log("BLUE", "Network Status Display started");
|
||||||
|
|
||||||
// Handle signals for graceful exit
|
// Handle signals for graceful exit
|
||||||
signal(SIGINT, signal_handler);
|
signal(SIGINT, signal_handler);
|
||||||
@@ -469,10 +537,11 @@ int main(int argc, char *argv[]) {
|
|||||||
log("GREEN", "LED matrix initialized successfully");
|
log("GREEN", "LED matrix initialized successfully");
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
log("BLUE", "Starting 4G status display loop");
|
log("BLUE", "Starting network status display loop");
|
||||||
while (running) {
|
while (running) {
|
||||||
std::string network_status;
|
std::string network_status;
|
||||||
int signal_quality;
|
int signal_quality;
|
||||||
|
std::string wifi_status;
|
||||||
|
|
||||||
// Get 4G status from database
|
// Get 4G status from database
|
||||||
bool data_success = get_4g_status(db, network_status, signal_quality);
|
bool data_success = get_4g_status(db, network_status, signal_quality);
|
||||||
@@ -483,8 +552,16 @@ int main(int argc, char *argv[]) {
|
|||||||
signal_quality = -999;
|
signal_quality = -999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get WiFi status from database
|
||||||
|
bool wifi_success = get_wifi_status(db, wifi_status);
|
||||||
|
|
||||||
|
if (!wifi_success) {
|
||||||
|
std::cerr << "Error retrieving WiFi data from database" << std::endl;
|
||||||
|
wifi_status = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
// Draw the screen
|
// Draw the screen
|
||||||
draw_4g_screen(canvas, network_status, signal_quality);
|
draw_network_screen(canvas, network_status, signal_quality, wifi_status);
|
||||||
|
|
||||||
// Sleep before next update
|
// Sleep before next update
|
||||||
std::cout << "Update complete, sleeping for 5 seconds..." << std::endl;
|
std::cout << "Update complete, sleeping for 5 seconds..." << std::endl;
|
||||||
@@ -498,6 +575,6 @@ int main(int argc, char *argv[]) {
|
|||||||
canvas->Clear();
|
canvas->Clear();
|
||||||
delete canvas;
|
delete canvas;
|
||||||
sqlite3_close(db);
|
sqlite3_close(db);
|
||||||
std::cout << "4G Status Display terminated" << std::endl;
|
std::cout << "Network Status Display terminated" << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user