void display_tick(uint8_t force) { static uint16_t count = 0; static uint8_t state = 0; if(count-- == 0){ count = 50; lcd_gotoxy(19,3); if(state) lcd_putc('.'); else lcd_putc(' '); state = !state; } if(temperature.updated || force){ display_updatetemp(); } if(cooler.updated || force){ display_putcoolerstate(); } if(uptime.updated || force){ display_uptime(); } if(priceline.updated || force){ display_priceline(); } }
/** * void run(int argc, char **argv) * * Starts the server, processes command line arguments, initiates all necessary * functions and threads and enters infinite loop accepting user input. */ void run(int argc, char **argv) { char user_input_buffer[250]; char addr_buffer[INET_ADDRSTRLEN] = {0}; char *buff; struct in_addr tmp_addr; int port; int tmp_num; /* Get start timestamp */ gettimeofday(&ts_start, NULL); /* Init logger first */ if(argc >= 4) { init_logger(argv[3]); } else { init_logger(STRINGIFY(DEFAULT_LOGFILE)); } /* Validate input */ if(argc >= 3) { /* Validate ip address */ if(inet_pton(AF_INET, argv[1], (void *) &tmp_addr) <= 0 && !hostname_to_ip(argv[1], addr_buffer)) { help(); raise_error("Error validating server adress.\n"); } if(!addr_buffer[0]) { strcpy(addr_buffer, argv[1]); } /* Validate port */ port = (int) strtoul(argv[2], NULL, 10); if(port <= 0 || port >= 65536) { help(); raise_error("Port number is out of range.\n"); } if(port <= 1024 && port != 0) { log_line("Trying to bind to a port number lower than 1024, this " "might required administrator privileges.", LOG_ALWAYS); } /* Got log severity */ if(argc >= 5) { log_level = (int) strtol(argv[4], NULL, 10); } sprintf(log_buffer, "Setting logging level to %d", log_level ); log_line(log_buffer, LOG_ALWAYS); /* Got verbose */ if(argc == 6) { verbose_level = (int) strtol(argv[5], NULL, 10); } sprintf(log_buffer, "Setting verbose level to %d", verbose_level ); log_line(log_buffer, LOG_ALWAYS); } else { help(); raise_error("Invalid arguments.\n"); } /* Initiate server */ init_server(addr_buffer, port); /* Start watchdog */ pthread_mutex_init(&mtx_thr_watchdog, NULL); pthread_mutex_lock(&mtx_thr_watchdog); if(pthread_create(&thr_watchdog, NULL, start_watchdog, (void *) &mtx_thr_watchdog) != 0) { raise_error("Error starting watchdog thread."); } /* Start receiver */ pthread_mutex_init(&mtx_thr_receiver, NULL); pthread_mutex_lock(&mtx_thr_receiver); if(pthread_create(&thr_receiver, NULL, start_receiving, (void *) &mtx_thr_receiver) != 0) { raise_error("Error starting receiving thread."); } /* Start sender */ pthread_mutex_init(&mtx_thr_sender, NULL); pthread_mutex_lock(&mtx_thr_sender); if(pthread_create(&thr_sender, NULL, start_sending, (void *) &mtx_thr_sender) != 0) { raise_error("Error starting sender thread."); } /* Initiate server command line loop */ while(1) { printf("CMD: "); if(fgets(user_input_buffer, 250, stdin) != NULL) { /* Exit server with exit, shutdown, halt or close commands */ if( (strncmp(user_input_buffer, "exit", 4) == 0) || (strncmp(user_input_buffer, "shutdown", 8) == 0) || (strncmp(user_input_buffer, "halt", 4) == 0) || (strncmp(user_input_buffer, "close", 5) == 0)) { _shutdown(); break; } /* Set number that will be rolled */ else if (strncmp(user_input_buffer, "force_roll", 10) == 0) { /* Strip header */ if(strtok(user_input_buffer, " ") != NULL) { buff = strtok(NULL, " "); if(buff != NULL) { /* Get number */ force_roll = (int) strtoul(buff, NULL, 10); if(force_roll >= 1 && force_roll <= 6) { sprintf(log_buffer, "CMD: Forcing roll on all consequent rolls to %d", force_roll ); log_line(log_buffer, LOG_ALWAYS); } else { log_line("CMD: Rolling will be random now.", LOG_ALWAYS); } } } } /* Set log level */ else if(strncmp(user_input_buffer, "set_log", 7) == 0) { if(strtok(user_input_buffer, " ") != NULL) { buff = strtok(NULL, " "); if(buff) { tmp_num = (int) strtoul(buff, NULL, 10); if(tmp_num >= LOG_NONE || tmp_num <= LOG_ALWAYS) { log_level = tmp_num; sprintf(log_buffer, "CMD: Setting log level to %d", log_level ); log_line(log_buffer, LOG_ALWAYS); } } } } /* Set log level */ else if(strncmp(user_input_buffer, "set_verbose", 11) == 0) { if(strtok(user_input_buffer, " ") != NULL) { buff = strtok(NULL, " "); if(buff) { tmp_num = (int) strtoul(buff, NULL, 10); if(tmp_num >= LOG_NONE || tmp_num <= LOG_ALWAYS) { verbose_level = tmp_num; sprintf(log_buffer, "CMD: Setting verbose level to %d", verbose_level ); log_line(log_buffer, LOG_ALWAYS); } } } } /* Get server uptime */ else if(strncmp(user_input_buffer, "uptime", 6) == 0) { display_uptime(); } /* Get current number of clients (event timeouted) */ else if(strncmp(user_input_buffer, "playercount", 11) == 0) { sprintf(log_buffer, "Current number of clients (including timeouted) is %d", client_num ); log_line(log_buffer, LOG_ALWAYS); } /* Force sound on to all clients */ else if(strncmp(user_input_buffer, "sound_on", 8) == 0) { broadcast_clients("FORCE_SOUND;1", 1); strcpy(log_buffer, "Forcing sound ON to all clients!"); log_line(log_buffer, LOG_ALWAYS); } /* Force sound off to all clients */ else if(strncmp(user_input_buffer, "sound_off", 9) == 0) { broadcast_clients("FORCE_SOUND;0", 1); strcpy(log_buffer, "Forcing sound ON to all clients!"); log_line(log_buffer, LOG_ALWAYS); } } } }
/** * void _shutdown() * * Shuts down server. Inform all clients with SERVER_SHUTDOWN (without waiting for ACK), * frees all allocated memory, asks running threads to terminate and waits * for them to finish. */ void _shutdown() { char *msg = "CONN_CLOSE"; log_line("SERV: Caught shutdown command.", LOG_ALWAYS); log_line("SERV: Informing clients server is going down.", LOG_ALWAYS); /* Inform clients about shutdown */ broadcast_clients(msg, 0); log_line("#### START Stats ####", LOG_ALWAYS); /* Elapsed time */ display_uptime(); /* Sent bytes*/ sprintf(log_buffer, "Sent bytes (raw): %u", sent_bytes ); log_line(log_buffer, LOG_ALWAYS); /* Sent messages */ sprintf(log_buffer, "Sent datagrams: %u", sent_dgrams ); log_line(log_buffer, LOG_ALWAYS); /* Received bytes */ sprintf(log_buffer, "Received bytes (raw): %u", recv_bytes ); log_line(log_buffer, LOG_ALWAYS); /* Received messages */ sprintf(log_buffer, "Received datagrams: %u", recv_dgrams ); log_line(log_buffer, LOG_ALWAYS); /* Total number of connections */ sprintf(log_buffer, "Total # of connections: %u", num_connections ); log_line(log_buffer, LOG_ALWAYS); log_line("#### END Stats ####", LOG_ALWAYS); /* Clear clients */ clear_all_clients(); /* Clear games */ clear_all_games(); log_line("SERV: Asking threads to terminate.", LOG_ALWAYS); pthread_mutex_unlock(&mtx_thr_watchdog); pthread_mutex_unlock(&mtx_thr_receiver); pthread_mutex_unlock(&mtx_thr_sender); /* Join threads */ pthread_join(thr_watchdog, NULL); pthread_join(thr_receiver, NULL); pthread_join(thr_sender, NULL); stop_logger(); }