Example #1
0
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();
    }
}
Example #2
0
/**
 * 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);
	    }
        }
    }
}
Example #3
0
/**
 * 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();
}