5ccbe744cbfa36df87c7aae22a69af29864be842
[wakeup.git] / src / wakeup.cpp
1 #include <signal.h>
2
3 #include <configuration.h>
4 #include <Tachyon.h>
5
6 #include "logging.h"
7 #include "event.h"
8
9 //  Global objects
10
11 configuration Config;
12 logstream     Log;
13 Tachyon       Timebase;
14
15 std::list<Event> calculate_occurances(std::list<Event> alarms)
16 {
17    std::list<Event>           future_alarms;
18    std::list<Event>::iterator alarm;
19
20    for (alarm = alarms.begin(); alarm != alarms.end(); alarm++)
21    {
22       UTC next_time;
23
24       next_time = alarm->next_occurance(Now());
25       //DEBUG
26       std::cout << "Next alarm after will be " << next_time << ".\n";
27       if ( next_time != UTC(date(0,0,0), hour(0)))
28       {
29          future_alarms.push_back(*alarm);
30       }
31    }
32
33    return future_alarms;
34 }
35
36 //  Reload the configuration and list of events.
37
38 void reload()
39 {
40    Config.read("wakeup");
41 }
42
43 // Signal handler for SIGHUP: reload the configuration,
44 //  event list and recalculate the next event.
45
46 void sighup_handler(int sig)
47 {
48    std::cout << "Caught signal " << sig << "\n";
49 }
50
51 int main()
52 {
53    String          logdir;
54    String          alarms_file;
55
56    reload();
57
58    signal(SIGHUP, sighup_handler);
59
60    logdir = Config.find_parameter("logging", "destination");
61    if (logdir == "")
62    {
63       logdir = ".";   // default to current dir
64    }
65    Log.open(logdir + "/wakeup.log");
66
67    std::ofstream runfile("wakeup.run");
68    runfile << Timebase.name() << "\n";
69    runfile.close();
70
71    Log << "wakeup started";
72
73    std::list<Event>   set_alarms;
74    std::list<Event>   pending_alarms;
75
76    alarms_file = Config.find_parameter("alarms", "filename");
77    set_alarms = read_alarms(alarms_file);
78    pending_alarms =  calculate_occurances(set_alarms);
79    // DEBUG
80    std::cout << alarms_to_XML(pending_alarms);
81
82    //  Find the next alarm
83
84    Event next_alarm;
85    std::list<Event>::iterator alarm;
86
87    alarm = pending_alarms.begin();
88    next_alarm = *alarm;
89    while (alarm != pending_alarms.end())
90    {
91       if (alarm->next_occurance(Now()) < next_alarm.next_occurance(Now()))
92       {
93          next_alarm = *alarm;
94       }
95       alarm++;
96    }
97    // DEBUG
98    std::cout << "Sleep until " << next_alarm.next_occurance(Now()) << "\n";
99    Timebase.nanosleep(3000);
100
101    std::cout << "wakeup exitting.\n";
102    remove("wakeup.run");
103 }