/********************************************************************************* * Copyright: (C) 2018 LingYun IoT System Studio * All rights reserved. * * Filename: monitord.c * Description: This file is the monitord program, which use infrared to detect human * incoming, then turn on the LED by relay and take a photo for it. * * Version: 1.0.0(2018年05月29日) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "2018年05月29日 21时03分54秒" * ********************************************************************************/ #include #include #include #include "monitord.h" #include "cp_logger.h" #include "cp_proc.h" /* Show program version information, can used by 'monitord --version or monitord -v'*/ static inline void prog_version(const char *progname) { printf("%s Version 1.0.0 Build(%s)\n", progname, __DATE__); return ; } /* Show program help information, can used by 'monitord --help or monitord -h'*/ static void prog_usage(const char *progname) { prog_version(progname); printf("Usage: %s [OPTION]...\n", progname); printf("Receive date from a serial port and transfer the data to remote server by socket.\n"); printf("\nMandatory arguments to long options are mandatory for short options too:\n"); printf(" -d[debug ] Running in debug mode\n"); printf(" -l[level ] Set the log level as [0..%d]\n", LOG_LEVEL_MAX-1); printf(" -s[server ] Socket connect server host and port, format as: Hostname:Port, default as 127.0.0.1:8900\n"); printf(" -v[version ] Display program version\n"); printf(" -h[help ] Display this help information\n"); return ; } void *infrared_worker(void *arg); int main (int argc, char **argv) { const char *progname=NULL; int opt; int debug = 0; /* program running information log to stdard output */ char pid_file[64] = { 0 }; /* The file used to record the PID */ int log_level = LOG_LEVEL_TRACE; /* program running information log to file level */ cp_logger *logger; char *log_file="monitord.log"; /* program running information log file name */ char *server="127.0.0.1:8900"; /* default connect server address, can use '-s' option to change */ int rv; pthread_t tid; /* progranm command options */ struct option long_options[] = { {"debug", no_argument, NULL, 'd'}, /* monitord -d or monitord --debug, log to standard output or not */ {"level", required_argument, NULL, 'l'}, /* monitord -l 7, specify log to file level */ {"server", required_argument, NULL, 's'}, /* monitord -s 192.168.0.5:9999, specify server address and port */ {"version", no_argument, NULL, 'v'}, /* monitord -v or monitord --version to check program version information */ {"help", no_argument, NULL, 'h'}, /* monitord -h or monitord --help to get program help information */ {NULL, 0, NULL, 0} /* array end flag */ }; progname = basename(argv[0]); /* Parser the command line options */ while ((opt = getopt_long(argc, argv, "s:dl:vh", long_options, NULL)) != -1) { switch (opt) { case 'd': /* monitord -d or monitord --debug */ debug = 1; log_file = DBG_LOG_FILE; break; case 'l': /* monitord -l 7 */ rv = atoi(optarg); log_level = rv>LOG_LEVEL_MAX ? LOG_LEVEL_MAX-1 : rv; break; case 'v': /* monitord -v */ prog_version(progname); return EXIT_SUCCESS; case 'h': /* monitord -h */ prog_usage(progname); return 0; default: break; } /* end of "switch(opt)" */ } /* parser hostname and port by server*/ { char *ptr; ptr=strchr(server, ':'); if( !ptr ) { printf("Invalid server host[%s], which format should be [HostName:Port] such as \"127.0.0.1:8900\"", server); return -1; } } /* check program already running on background or not */ if( !debug ) { snprintf(pid_file, sizeof(pid_file), "/var/run/%s.pid", progname); if( check_daemon_running(pid_file) ) { printf("Programe already running, exit now.\n"); return -1; } } /* initialise logger system */ if( !(logger=cp_log_init(NULL, log_file, log_level, 0)) || cp_log_open()<0 ) { printf("Init logger system failed, program exit now...\n"); return -1; } /* set program running in background */ if( !debug ) { if( set_daemon_running(pid_file) ) { log_fatal("Set program \"%s\" running as daemon failure.\n", progname); return -2; } } /* install signal process handler */ cp_install_proc_signal(); /* start infrared detected thread */ thread_start(&tid, infrared_worker, NULL); while( !g_cp_signal.stop ) { /* control/main thread do nothing here */ sleep(1); } return 0; } void *infrared_worker(void *arg) { int rv = 0; #if 0 if( !arg ) { log_err("Invalid arguments\n"); return NULL; } #endif log_nrml("Thread worker for infrared start\n"); while( !g_cp_signal.stop ) { } return NULL; }