diff --git a/init.sh b/init.sh old mode 100644 new mode 100755 index be3bfef..a252c71 --- a/init.sh +++ b/init.sh @@ -1,4 +1,4 @@ -#! /bin/bash +#! /bin/sh ### BEGIN INIT INFO # Provides: robotd # Required-Start: @@ -9,8 +9,7 @@ ### END INIT INFO start() { - PID=`pidof robotd` - if [ $? -eq 0 ] + if pidof robotd > /dev/null then echo "robotd already started." return @@ -22,8 +21,7 @@ start() { } stop() { - PID=`pidof weblabsd` - if [ $? -eq 0 ] + if pidof robotd > /dev/null then echo "Stopping robotd" kill -s INT `pidof robotd` @@ -34,15 +32,14 @@ stop() { } case "$1" in - start) + start|restart|force-reload) start ;; stop) stop ;; status) - PID=`pidof robotd` - if [ $? -eq 0 ] + if pidof robotd > /dev/null then echo "robotd is running." else @@ -54,8 +51,7 @@ case "$1" in start ;; *) - echo "Usage: {start|stop|restart|status}" + echo "Usage: {start|stop|restart|force-reload|status}" exit 1 ;; esac -exit $? diff --git a/robotd.c b/robotd.c index 9b7647a..73e5178 100644 --- a/robotd.c +++ b/robotd.c @@ -2,21 +2,37 @@ #include #include #include +#include #include #include #include #include - #include #define GPIO_PIN_4 4 #define GPIO_PIN_13 13 +mraa_result_t mr; +mraa_gpio_context pin13, pin4; + +void clean_up() { + syslog(LOG_DAEMON | LOG_WARNING, "Cleaning up."); + mr = mraa_gpio_write(pin4, 0); + // TODO: MRAA error handling + closelog(); +} + +void sig_handler(int signal) { + // Turn off the red LED + syslog(LOG_DAEMON | LOG_WARNING, "Robot daemon interrupted."); + clean_up(); + exit(EXIT_FAILURE); +} + int main(int argc, char ** argv) { - int rv; - bool done = false; - mraa_gpio_context pin13, pin4; - mraa_result_t mr; + int rv; + bool done = false; + sighandler_t sh; // Turn the process into a daemon. rv = daemon(0, 1); @@ -26,6 +42,14 @@ int main(int argc, char ** argv) { return EXIT_FAILURE; } + // Set SIGINT signal handler + sh = signal(SIGINT, sig_handler); + + if (sh == SIG_ERR) { + perror("sh = signal(SIGINT, sig_handler)"); + return EXIT_FAILURE; + } + // Open a syslog connection openlog(argv[0], LOG_NDELAY | LOG_PID, LOG_DAEMON); syslog(LOG_DAEMON | LOG_NOTICE, "Started robot daemon."); @@ -36,22 +60,22 @@ int main(int argc, char ** argv) { mr = mraa_gpio_mode(pin13, MRAA_GPIO_PULLUP); syslog(LOG_DAEMON | LOG_NOTICE, "Push button ready."); - // TODO: MRAA error handling. + // TODO: MRAA error handling // Open PIN 4 as an output pin for the red indicator LED pin4 = mraa_gpio_init(GPIO_PIN_4); mr = mraa_gpio_dir(pin4, MRAA_GPIO_OUT); syslog(LOG_DAEMON | LOG_NOTICE, "Red LED ready."); - // TODO: MRAA error handling. + // TODO: MRAA error handling - // Star pin processing loop + // Start pin processing loop while (!done) { // Keep the red LED on and read from the push button pin mr = mraa_gpio_write(pin4, 1); rv = mraa_gpio_read(pin13); - // TODO: MRAA error handling. + // TODO: MRAA error handling if (rv == 0) { // If the button is pressed then stop reading and go on with the program @@ -63,26 +87,41 @@ int main(int argc, char ** argv) { // Turn off the red LED mr = mraa_gpio_write(pin4, 0); - // TODO: MRAA error handling. + // TODO: MRAA error handling // Open the source code file for the Python script syslog(LOG_DAEMON | LOG_NOTICE, "Opening Python source code."); - FILE * code = fopen("/home/root/robot.py", "r"); + FILE * code = fopen("/home/root/Robotd/robot.py", "r"); if (code == NULL) { + perror("FILE * code = fopen(\"/home/root/Robotd/robot.py\", \"r\")"); syslog(LOG_DAEMON | LOG_NOTICE, "Failed to load Python program."); + clean_up(); return EXIT_FAILURE; } + // Return SIGINT handler to it's default state + sh = signal(SIGINT, SIG_DFL); + + if (sh == SIG_ERR) { + perror("sh = signal(SIGINT, SIG_DLF)"); + syslog(LOG_DAEMON | LOG_NOTICE, "Failed to disable signal handler."); + clean_up(); + return EXIT_FAILURE; + } + // Execute the Python code syslog(LOG_DAEMON | LOG_NOTICE, "Performing Python call."); Py_SetProgramName(argv[0]); Py_Initialize(); - PyRun_SimpleFile(code, "/home/root/robot.py"); + PyRun_SimpleFile(code, "/home/root/Robotd/robot.py"); Py_Finalize(); - // TODO: Python error handling. + // TODO: Python error handling + // Close the source code file + fclose(code); + // Clean up and leave syslog(LOG_DAEMON | LOG_NOTICE, "Finishing."); closelog();