int main() { init_lcd(); init_watch(&watch_state); disp_watch(&watch_state); P1 = 0x0F; // LEDs as outputs, switches as inputs. while(1) { update_watch(&watch_state); disp_watch(&watch_state); } }
int main(int argc, char *argv[]) { char read_only = 0; char new_dbfile = 0; char autostarted = 0; unsigned long timeout = 0; unsigned long output_mins = 0; unsigned long past = 0; unsigned long out_delay = 0; char cntr; printf("Sleepwatch version 0.1, Copyright (C) 2016 Philip Manke\n" "Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\n" "type 'sleepwatch -g'. This is free software, and you are welcome\n" "to redistribute it under certain conditions;\n" "read the file 'COPYING' for details.\n\n"); for (cntr = 1; cntr < argc; cntr++) { if (argv[cntr][0] == '-') { switch (argv[cntr][1]) { case 'a': { autostarted = 1; } break; case 'd': { if (argv[cntr][2] == '=') { dbfile = (char *)calloc(strlen(&argv[cntr][3]) + 1, sizeof(char)); strncpy(dbfile, &argv[cntr][3], strlen(&argv[cntr][3])); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'f': { if (argv[cntr][2] == '=') { output = (char *)calloc(strlen(&argv[cntr][3]) + 1, sizeof(char)); strncpy(output, &argv[cntr][3], strlen(&argv[cntr][3])); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'g': { printf("NO WARRANTY\n\n" "11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS " "NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY " "APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE " "COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM " "\"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR " "IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES " "OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE " "ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM " "IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME " "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n" "12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO " "IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO " "MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, " "BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, " "INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR " "INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO " "LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES " "SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM " "TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR " "OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH " "DAMAGES.\n"); } break; case 'n': { new_dbfile = 1; printf("Starting new database.\n"); } break; case 'l': { if (argv[cntr][2] == '=') { logfile = (char *)calloc(strlen(&argv[cntr][3]) + 1, sizeof(char)); strncpy(logfile, &argv[cntr][3], strlen(&argv[cntr][3])); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'o': { if (argv[cntr][2] == '=') { output_mins = strtoul(&argv[cntr][3], NULL, 0); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'p': { if (argv[cntr][2] == '=') { past = strtoul(&argv[cntr][3], NULL, 0); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'r': { read_only = 1; printf("Only outputting data. Monitoring disabled.\n"); } break; case 't': { if (argv[cntr][2] == '=') { timeout = strtoul(&argv[cntr][3], NULL, 0); printf("Timeout enabled. Shutting down after %lu minutes...\n", timeout); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; case 'w': { if (argv[cntr][2] == '=') { out_delay = strtoul(&argv[cntr][3], NULL, 0); } else { printf("Unknown argument: %s !\n", argv[cntr]); return 1; } } break; default: { printf("Unknown option: %c !\n", argv[cntr][1]); print_usage(); return 1; } break; } } else { printf("Unknown argument: %s !\n", argv[cntr]); print_usage(); return 1; } } // check file paths or set defaults // output file if (output == NULL) { output = (char *)calloc(strlen(DEFAULT_OUTPUT) + 1, sizeof(char)); strncpy(output, DEFAULT_OUTPUT, strlen(DEFAULT_OUTPUT)); } if (test_path(output) == 1) { printf( "ERROR! Path for output file not valid or insufficient permissions!"); cleanup(); return 1; } else { remove(output); } // database file if (dbfile == NULL) { dbfile = (char *)calloc(strlen(DEFAULT_DB) + 1, sizeof(char)); strncpy(dbfile, DEFAULT_DB, strlen(DEFAULT_DB)); } int ret = test_path(dbfile); if (ret == 1) { printf( "ERROR! Path for database file not valid or insufficient permissions!"); cleanup(); return 1; } if (ret == 2) { new_dbfile = 1; } // log file if (logfile == NULL) { logfile = (char *)calloc(strlen(DEFAULT_LOG) + 1, sizeof(char)); strncpy(logfile, DEFAULT_LOG, strlen(DEFAULT_LOG)); } if (test_path(logfile) == 1) { printf("ERROR! Path for log file not valid or insufficient permissions!"); cleanup(); return 1; } // set output fimeframe default if (output_mins == 0) { output_mins = DEFAULT_OUTPUT_MINS; } // sets output update delay default if (out_delay == 0) { out_delay = DEFAULT_OUT_DELAY; } out_delay *= 1000; // convert timeout from minutes to unit of 100 milliseconds if set if (timeout) { timeout *= 600; } unsigned int to = (unsigned int)past; unsigned int from = (unsigned int)(past + output_mins); // initialize the modules printf("Initializing...\n"); init_log(logfile); if (new_dbfile) { remove(dbfile); } init_db(dbfile, new_dbfile); init_watch(!read_only); init_out(output, out_delay, &from, &to, read_only); printf("Running... "); if (!read_only) { char running = 1; OTHR *thread = (OTHR *)malloc(sizeof(OTHR)); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; thread->spinlock = &mutex; if (!autostarted) { // start thread to check for user input start_other_thread(thread, 0, &check_q); } // main loop printf("Press 'Q'-Enter to stop!\n"); while (running) { if (!autostarted) { pthread_mutex_lock(thread->spinlock); running = thread->running; pthread_mutex_unlock(thread->spinlock); } sleep_milliseconds(100); if (timeout > 0) { timeout--; if (timeout == 0) { printf("Timeout! Stopping...\n"); logm("Timeout hit! Stopping...\n"); if (!autostarted) { pthread_cancel(thread->t_id); } running = 0; } } } free(thread); pthread_mutex_destroy(&mutex); } else { printf("\n"); refresh_out_time(); } cleanup(); return 0; }