Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
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;
}