1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-03-09 15:40:03 +00:00

Sync to latest oled --fix

This commit is contained in:
suyuan 2023-10-08 16:19:31 +08:00
parent b82119b759
commit 1a08b09d18
27 changed files with 3536 additions and 2942 deletions

879
luci-app-ouad/src/Example_Code/Main.c Executable file → Normal file
View file

@ -8,100 +8,833 @@
*/
/* Lib Includes */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include <libconfig.h>
#include <limits.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/* Header Files */
#include "I2C.h"
#include "SSD1306_OLED.h"
#include "example_app.h"
#define NETSPEED_INTERVAL 1000000
#define DISPLAY_INTERVAL 1000000
#define TIME_CHECK_INTERVAL 5000000
struct st_config {
unsigned int disp_date;
unsigned int disp_ip;
char *ip_if_name;
unsigned int disp_cpu_temp;
unsigned int disp_cpu_freq;
unsigned int disp_net_speed;
char *speed_if_name;
unsigned int interval;
unsigned int draw_line;
unsigned int draw_rect;
unsigned int fill_rect;
unsigned int draw_circle;
unsigned int draw_round_circle;
unsigned int fill_round_circle;
unsigned int draw_triangle;
unsigned int fill_triangle;
unsigned int disp_bitmap;
unsigned int disp_invert_normal;
unsigned int draw_bitmap_eg;
unsigned int scroll;
char *scroll_text;
char *i2c_dev_path;
unsigned int rotate;
unsigned int need_init;
int from;
int to;
};
static void printHelp() {
printf(
"\n\
Usage: oled [options] ...\n\
Options:\n\
--help or -h Display this information.\n\
--version or -v Display compiler version information.\n\
\n\
--config=file or -c file Specify configuration file.\n\
\n\
--i2cDevPath=path or -d path Specify the i2c device, default is /dev/i2c-0.\n\
--from=minutes or -f minites Specify the time(in minutes of day) to start displaying, default is 0.\n\
--to=minutes or -t minites Specify the time(in minutes of day) to stop displaying, default is 1440.\n\
--neetInit or -N Turn on init, default is on.\n\
--interval=n or -l n Specify the display interval, default is 60(s).\n\
--displayInvertNormal or -I Turn on the invert normal mode.\n\
--rotate or -H Turn on rotate.\n\
\n\
--displayDate or -D Turn on the date display.\n\
--displayIp or -A Turn on the IP address display.\n\
--ipIfName=ifname or -a ifname Specify the eth device to display the ip address, default is br-lan.\n\
--displayNetSpeed or -S Turn on the net speed display.\n\
--speedIfName=ifname or -s ifname Specify the eth device to display the net speed, default is eth0.\n\
--displayCpuTemp or -T Turn on the CPU temperature.\n\
--displayCpuFreq or -F Turn on the CPU frequency.\n\
\n\
--drawLine or -L Turn on draw line.\n\
--drawRect or -W Turn on draw rect.\n\
--fillRect or -w Turn on fill rect.\n\
--drawCircle or -C Turn on draw circle.\n\
--drawRoundCircle or -R Turn on draw round circle.\n\
--fillRoundCircle or -r Turn on fill round circle.\n\
--drawTriangle or -G Turn on draw triangle.\n\
--fillTriangle or -g Turn on fill triangle.\n\
--displayBitmap or -B Turn on display bitmap.\n\
--drawBitmapEg or -E Turn on draw bitmap eg.\n\
--scroll or -O Turn on scroll text.\n\
--scrollText=text or -o text Specify the scroll text, default is 'Hello world'.\n\
\n");
}
static void printVersion() {
// Code to print version information
printf("Version: 1.0\n");
}
static void read_conf_file(const char *filename, struct st_config *stcfg) {
config_t cfg;
config_init(&cfg);
char *buff;
if (!config_read_file(&cfg, filename)) {
fprintf(stderr, "Error reading configuration file: %s\n",
config_error_text(&cfg));
config_destroy(&cfg);
exit(EXIT_FAILURE);
}
config_lookup_int(&cfg, "displayDate", &stcfg->disp_date);
config_lookup_int(&cfg, "displayIp", &stcfg->disp_ip);
if (config_lookup_string(&cfg, "ipIfName", (const char **)&buff)) {
sprintf(stcfg->ip_if_name, "%s", buff);
}
config_lookup_int(&cfg, "displayCpuTemp", &stcfg->disp_cpu_temp);
config_lookup_int(&cfg, "displayCpuFreq", &stcfg->disp_cpu_freq);
config_lookup_int(&cfg, "displayNetSpeed", &stcfg->disp_net_speed);
if (config_lookup_string(&cfg, "speedIfName", (const char **)&buff)) {
sprintf(stcfg->speed_if_name, "%s", buff);
}
config_lookup_int(&cfg, "interval", &stcfg->interval);
config_lookup_int(&cfg, "drawLine", &stcfg->draw_line);
config_lookup_int(&cfg, "drawRect", &stcfg->draw_rect);
config_lookup_int(&cfg, "fillRect", &stcfg->fill_rect);
config_lookup_int(&cfg, "drawCircle", &stcfg->draw_circle);
config_lookup_int(&cfg, "drawRoundCircle", &stcfg->draw_round_circle);
config_lookup_int(&cfg, "fillRoundCircle", &stcfg->fill_round_circle);
config_lookup_int(&cfg, "drawTriangle", &stcfg->draw_triangle);
config_lookup_int(&cfg, "fillTriangle", &stcfg->fill_triangle);
config_lookup_int(&cfg, "displayBitmap", &stcfg->disp_bitmap);
config_lookup_int(&cfg, "displayInvertNormal",
&stcfg->disp_invert_normal);
config_lookup_int(&cfg, "drawBitmapEg", &stcfg->draw_bitmap_eg);
config_lookup_int(&cfg, "scroll", &stcfg->scroll);
if (config_lookup_string(&cfg, "scrollText", (const char **)&buff)) {
sprintf(stcfg->scroll_text, "%s", buff);
}
if (config_lookup_string(&cfg, "i2cDevPath", (const char **)&buff)) {
sprintf(stcfg->i2c_dev_path, "%s", buff);
}
config_lookup_int(&cfg, "rotate", &stcfg->rotate);
config_lookup_int(&cfg, "needInit", &stcfg->need_init);
config_lookup_int(&cfg, "from", &stcfg->from);
config_lookup_int(&cfg, "to", &stcfg->to);
config_destroy(&cfg);
}
static int get_current_minitues() {
time_t rawtime;
struct tm *info;
time(&rawtime);
info = localtime(&rawtime);
// printf("Current local time and date: %s", asctime(info));
// printf("Current minutues: %d\n", info->tm_hour * 60 + info->tm_min);
return (info->tm_hour * 60 + info->tm_min);
}
/* Oh Compiler-Please leave me as is */
volatile unsigned char flag = 0;
/** Shared variable by the threads */
static unsigned long int __shared_rx_speed = 0;
static unsigned long int __shared_tx_speed = 0;
static int __shared_sleeped = 0;
/** Mutual exclusion of the shared variable */
static pthread_mutex_t __mutex_shared_variable =
(pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t __mutex_shared_variable1 =
(pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
/* thread id */
static pthread_t tid = 0;
static pthread_t tid1 = 0;
static float get_uptime() {
FILE *fp1;
float uptime = 0, idletime = 0;
if ((fp1 = fopen("/proc/uptime", "r")) != NULL) {
if (fscanf(fp1, "%f %f", &uptime, &idletime))
;
fclose(fp1);
}
return uptime;
}
static void *pth_time_check(void *arg) {
int now;
struct st_config *stcfg;
stcfg = (struct st_config *)arg;
while (1) {
// Work only during specified time periods
now = get_current_minitues();
pthread_mutex_lock(&__mutex_shared_variable1);
{
if (stcfg->from != stcfg->to &&
(now < stcfg->from || now >= stcfg->to)) {
if (__shared_sleeped == 0) {
clearDisplay();
Display();
}
__shared_sleeped = 1;
} else {
__shared_sleeped = 0;
}
}
pthread_mutex_unlock(&__mutex_shared_variable1);
usleep(TIME_CHECK_INTERVAL);
}
}
static inline int get_sleep_flag() {
int flag;
pthread_mutex_lock(&__mutex_shared_variable1);
{ flag = __shared_sleeped; }
pthread_mutex_unlock(&__mutex_shared_variable1);
return flag;
}
static void *pth_netspeed(char *ifname) {
char rxbytes_path[80];
char txbytes_path[80];
unsigned long long int llu_bytes;
unsigned long int rx_bytes = 0, tx_bytes = 0, last_rx_bytes = 0,
last_tx_bytes = 0;
unsigned long int rx_speed, tx_speed;
FILE *fp1;
float last_uptime, uptime;
sprintf(rxbytes_path, "/sys/class/net/%s/statistics/rx_bytes", ifname);
sprintf(txbytes_path, "/sys/class/net/%s/statistics/tx_bytes", ifname);
last_uptime = get_uptime();
while (1) {
uptime = get_uptime();
if ((fp1 = fopen(rxbytes_path, "r")) != NULL) {
if (fscanf(fp1, "%llu", &llu_bytes))
;
fclose(fp1);
rx_bytes = llu_bytes % ULONG_MAX;
} else {
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
continue;
}
if ((fp1 = fopen(txbytes_path, "r")) != NULL) {
if (fscanf(fp1, "%llu", &llu_bytes))
;
fclose(fp1);
tx_bytes = llu_bytes % ULONG_MAX;
} else {
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
continue;
}
if ((last_rx_bytes == 0 && last_tx_bytes == 0) ||
(rx_bytes < last_rx_bytes) || (tx_bytes < last_tx_bytes) ||
(uptime <= last_uptime)) {
last_rx_bytes = rx_bytes;
last_tx_bytes = tx_bytes;
} else {
rx_speed =
(rx_bytes - last_rx_bytes) / (uptime - last_uptime);
tx_speed =
(tx_bytes - last_tx_bytes) / (uptime - last_uptime);
// write shared variables;
pthread_mutex_lock(&__mutex_shared_variable);
{
__shared_rx_speed = rx_speed;
__shared_tx_speed = tx_speed;
}
pthread_mutex_unlock(&__mutex_shared_variable);
last_rx_bytes = rx_bytes;
last_tx_bytes = tx_bytes;
}
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
}
}
/* Alarm Signal Handler */
void ALARMhandler(int sig)
{
/* Set flag */
flag = 5;
void ALARMhandler(int sig) {
/* Set flag */
flag = 5;
}
void BreakDeal(int sig)
{
clearDisplay();
usleep(1000000);
Display();
exit(0);
void BreakDeal(int sig) {
printf("Recived a KILL signal!\n");
if (tid != 0) {
pthread_cancel(tid);
pthread_join(tid, NULL);
}
if (tid1 != 0) {
pthread_cancel(tid1);
pthread_join(tid1, NULL);
}
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
exit(0);
}
int main(int argc, char* argv[])
{
char *eth=argv[1];
char *path=argv[2];
int main(int argc, char *argv[]) {
int option;
int option_index = 0;
char *config_file = NULL;
unsigned long int rx_speed, tx_speed;
struct st_config *stcfg;
if(path == NULL)
path = I2C_DEV0_PATH;
static struct option long_options[] = {
{"config", required_argument, 0, 'c'},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{"displayDate", no_argument, 0, 'D'},
{"displayIp", no_argument, 0, 'A'},
{"ipIfName", required_argument, 0, 'a'},
{"displayNetSpeed", no_argument, 0, 'S'},
{"speedIfName", required_argument, 0, 's'},
{"displayCpuTemp", no_argument, 0, 'T'},
{"displayCpuFreq", no_argument, 0, 'F'},
{"displayInvertNormal", no_argument, 0, 'I'},
{"interval", required_argument, 0, 'l'},
{"drawLine", no_argument, 0, 'L'},
{"drawRect", no_argument, 0, 'W'},
{"fillRect", no_argument, 0, 'w'},
{"drawCircle", no_argument, 0, 'C'},
{"drawRoundCircle", no_argument, 0, 'R'},
{"fillRoundCircle", no_argument, 0, 'r'},
{"drawTriangle", no_argument, 0, 'G'},
{"fillTriangle", no_argument, 0, 'g'},
{"displayBitmap", no_argument, 0, 'B'},
{"drawBitmapEg", no_argument, 0, 'E'},
{"scroll", no_argument, 0, 'O'},
{"scrollText", required_argument, 0, 'o'},
{"i2cDevPath", required_argument, 0, 'd'},
{"rotate", no_argument, 0, 'H'},
{"needInit", no_argument, 0, 'N'},
{"from", required_argument, 0, 'f'},
{"to", required_argument, 0, 't'},
{0, 0, 0, 0}};
/* Initialize I2C bus and connect to the I2C Device */
if(init_i2c_dev(path, SSD1306_OLED_ADDR) == 0)
{
printf("I2C: Bus Connected to SSD1306\r\n");
}
else
{
printf("I2C: OOPS! Something Went Wrong\r\n");
exit(1);
}
stcfg = (struct st_config *)malloc(sizeof(struct st_config));
memset(stcfg, 0, sizeof(struct st_config));
/* Register the Alarm Handler */
signal(SIGALRM, ALARMhandler);
signal(SIGINT, BreakDeal);
//signal(SIGTERM, BreakDeal);
/* set default value for config */
stcfg->need_init = 1;
stcfg->interval = 60;
stcfg->from = 0;
stcfg->to = 1440;
/* Run SDD1306 Initialization Sequence */
/* if (needinit==1)
display_Init_seq();
stcfg->ip_if_name = malloc(sizeof(char) * 20);
sprintf(stcfg->ip_if_name, "br-lan");
if (rotate==1)
display_rotate();
else
display_normal();
*/
/* Clear display */
clearDisplay();
stcfg->speed_if_name = malloc(sizeof(char) * 20);
sprintf(stcfg->speed_if_name, "eth0");
// draw a single pixel
// drawPixel(0, 1, WHITE);
// Display();
// usleep(1000000);
// clearDisplay();
stcfg->scroll_text = malloc(sizeof(char) * 100);
sprintf(stcfg->scroll_text, "Hello");
// draw many lines
while(1){
//setCursor(0,0);
setTextColor(WHITE);
stcfg->i2c_dev_path = malloc(sizeof(char) * 20);
sprintf(stcfg->i2c_dev_path, "%s", I2C_DEV0_PATH);
/* The end of set default value for config */
testintfstatus(FULL, 0);
display_bitmap_uploaddownload();
testnetspeed(SPLIT, 120);
testvpsip(FULL, 52);
Display();
usleep(5000000);
clearDisplay();
testinfo1();
Display();
usleep(1000000);
clearDisplay();
testinfo2();
Display();
usleep(800000);
clearDisplay();
testinfo3();
Display();
usleep(200000);
clearDisplay();
}
while ((option = getopt_long(argc, argv,
"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:",
long_options, &option_index)) != -1) {
switch (option) {
case 'c':
config_file = optarg;
break;
case 'h':
printHelp();
exit(EXIT_SUCCESS);
case 'v':
printVersion();
exit(EXIT_SUCCESS);
case '?':
// Invalid option or missing argument
exit(EXIT_FAILURE);
default:
// Handle other parameters
break;
}
}
if (config_file != NULL) {
// Read parameters from the configuration file
read_conf_file(config_file, stcfg);
}
// Update config from the command params
optind = 0;
while ((option = getopt_long(argc, argv,
"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:",
long_options, &option_index)) != -1) {
switch (option) {
case 'D':
stcfg->disp_date = 1;
break;
case 'A':
stcfg->disp_ip = 1;
break;
case 'a':
sprintf(stcfg->ip_if_name, "%s", optarg);
break;
case 'S':
stcfg->disp_net_speed = 1;
break;
case 's':
sprintf(stcfg->speed_if_name, "%s", optarg);
break;
case 'T':
stcfg->disp_cpu_temp = 1;
break;
case 'F':
stcfg->disp_cpu_freq = 1;
break;
case 'I':
stcfg->disp_invert_normal = 1;
break;
case 'l':
stcfg->interval = atoi(optarg);
break;
case 'L':
stcfg->draw_line = 1;
break;
case 'W':
stcfg->draw_rect = 1;
break;
case 'w':
stcfg->fill_rect = 1;
break;
case 'C':
stcfg->draw_circle = 1;
break;
case 'R':
stcfg->draw_round_circle = 1;
break;
case 'r':
stcfg->fill_round_circle = 1;
break;
case 'G':
stcfg->draw_triangle = 1;
break;
case 'g':
stcfg->fill_triangle = 1;
break;
case 'B':
stcfg->disp_bitmap = 1;
break;
case 'E':
stcfg->draw_bitmap_eg = 1;
break;
case 'O':
stcfg->scroll = 1;
break;
case 'o':
sprintf(stcfg->scroll_text, "%s", optarg);
break;
case 'd':
sprintf(stcfg->i2c_dev_path, "%s", optarg);
break;
case 'H':
stcfg->rotate = 1;
break;
case 'N':
stcfg->need_init = 1;
break;
case 'f':
stcfg->from = atoi(optarg);
break;
case 't':
stcfg->to = atoi(optarg);
break;
default:
// Handle other parameters
break;
}
}
if (stcfg->i2c_dev_path == NULL)
sprintf(stcfg->i2c_dev_path, "%s", I2C_DEV0_PATH);
/* Initialize I2C bus and connect to the I2C Device */
if (init_i2c_dev(stcfg->i2c_dev_path, SSD1306_OLED_ADDR) == 0) {
printf("Successfully connected to I2C device: %s\n",
stcfg->i2c_dev_path);
} else {
printf("Oops! There seems to be something wrong: %s\n",
stcfg->i2c_dev_path);
exit(EXIT_FAILURE);
}
if (stcfg->disp_net_speed == 1 &&
strcmp(stcfg->speed_if_name, "") != 0) {
pthread_create(&tid, NULL, (void *)pth_netspeed,
stcfg->speed_if_name);
}
/* Run SDD1306 Initialization Sequence */
if (stcfg->need_init == 1) display_Init_seq();
if (stcfg->rotate == 1)
display_rotate();
else
display_normal();
/* Clear display */
clearDisplay();
if (stcfg->from <= 0 || stcfg->from > 1440) {
stcfg->from = 0;
}
if (stcfg->to <= 0 || stcfg->to > 1440) {
stcfg->to = 1440;
}
if (stcfg->from > stcfg->to) {
int temp = stcfg->from;
stcfg->from = stcfg->to;
stcfg->to = temp;
}
pthread_create(&tid1, NULL, (void *)pth_time_check, (void *)stcfg);
/* Register the Alarm Handler */
signal(SIGALRM, ALARMhandler);
signal(SIGINT, BreakDeal);
signal(SIGTERM, BreakDeal);
// draw a single pixel
// drawPixel(0, 1, WHITE);
// Display();
// usleep(DISPLAY_INTERVAL);
// clearDisplay();
// draw many lines
while (1) {
if (get_sleep_flag() == 0 && stcfg->scroll) {
testscrolltext(stcfg->scroll_text);
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
if (get_sleep_flag() == 0 && stcfg->draw_line) {
testdrawline();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw rectangles
if (get_sleep_flag() == 0 && stcfg->draw_rect) {
testdrawrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw multiple rectangles
if (get_sleep_flag() == 0 && stcfg->fill_rect) {
testfillrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw mulitple circles
if (get_sleep_flag() == 0 && stcfg->draw_circle) {
testdrawcircle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw a white circle, 10 pixel radius
if (get_sleep_flag() == 0 && stcfg->draw_round_circle) {
testdrawroundrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Fill the round rectangle
if (get_sleep_flag() == 0 && stcfg->fill_round_circle) {
testfillroundrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Draw triangles
if (get_sleep_flag() == 0 && stcfg->draw_triangle) {
testdrawtriangle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Fill triangles
if (get_sleep_flag() == 0 && stcfg->fill_triangle) {
testfilltriangle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Display miniature bitmap
if (get_sleep_flag() == 0 && stcfg->disp_bitmap) {
display_bitmap();
Display();
usleep(DISPLAY_INTERVAL);
};
// Display Inverted image and normalize it back
if (get_sleep_flag() == 0 && stcfg->disp_invert_normal) {
display_invert_normal();
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
}
// Generate Signal after 20 Seconds
// draw a bitmap icon and 'animate' movement
if (get_sleep_flag() == 0 && stcfg->draw_bitmap_eg) {
alarm(10);
flag = 0;
testdrawbitmap_eg();
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
}
// setCursor(0,0);
setTextColor(WHITE);
// info display
int sum = stcfg->disp_date + stcfg->disp_ip +
stcfg->disp_cpu_freq + stcfg->disp_cpu_temp +
stcfg->disp_net_speed;
if (sum == 0) {
clearDisplay();
Display();
usleep(DISPLAY_INTERVAL);
continue;
}
for (int i = 1; i < stcfg->interval; i++) {
if (get_sleep_flag() == 1) {
usleep(DISPLAY_INTERVAL);
continue;
}
if (sum == 1) { // only one item for display
if (stcfg->disp_date) testdate(CENTER, 8);
if (stcfg->disp_ip)
testip(CENTER, 8, stcfg->ip_if_name);
if (stcfg->disp_cpu_freq)
testcpufreq(CENTER, 8);
if (stcfg->disp_cpu_temp)
testcputemp(CENTER, 8);
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed = __shared_rx_speed;
tx_speed = __shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(SPLIT, 0, rx_speed,
tx_speed);
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
} else if (sum == 2) { // two items for display
if (stcfg->disp_date) {
testdate(CENTER,
16 * (stcfg->disp_date - 1));
}
if (stcfg->disp_ip) {
testip(CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip - 1),
stcfg->ip_if_name);
}
if (stcfg->disp_cpu_freq) {
testcpufreq(
CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq - 1));
}
if (stcfg->disp_cpu_temp) {
testcputemp(
CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp - 1));
}
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed = __shared_rx_speed;
tx_speed = __shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
MERGE,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp +
stcfg->disp_net_speed - 1),
rx_speed, tx_speed);
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
} else { // more than two items for display
if (stcfg->disp_date) {
testdate(FULL,
8 * (stcfg->disp_date - 1));
}
if (stcfg->disp_ip) {
testip(FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip - 1),
stcfg->ip_if_name);
}
if (stcfg->disp_cpu_freq &&
stcfg->disp_cpu_temp) {
testcpu(8 * (stcfg->disp_date +
stcfg->disp_ip));
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed =
__shared_rx_speed;
tx_speed =
__shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip + 1 +
stcfg->disp_net_speed -
1),
rx_speed, tx_speed);
}
} else {
if (stcfg->disp_cpu_freq) {
testcpufreq(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq -
1));
}
if (stcfg->disp_cpu_temp) {
testcputemp(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp -
1));
}
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed =
__shared_rx_speed;
tx_speed =
__shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp +
stcfg->disp_net_speed -
1),
rx_speed, tx_speed);
}
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
} // for
} //while
if (stcfg->disp_net_speed == 1 &&
strcmp(stcfg->speed_if_name, "") != 0) {
pthread_cancel(tid);
pthread_join(tid, NULL);
}
if (tid1 != 0) {
pthread_cancel(tid1);
pthread_join(tid1, NULL);
}
clearDisplay();
Display();
exit(EXIT_SUCCESS);
}