GPS
}
+public class Alarm : Object
+{
+ public signal void trigger();
+
+ public time_t deadline;
+ public string label;
+
+ public Alarm(time_t deadline, string label)
+ {
+ this.deadline = deadline;
+ this.label = label;
+ }
+}
+
+private int alarm_compare(void* a, void* b)
+{
+ return (int)(((Alarm*)a)->deadline - ((Alarm*)b)->deadline);
+}
+
public class Clock: zavai.Service
{
protected time_t last_gps_time;
protected dynamic DBus.Object gps_time;
protected uint system_time_timeout;
protected time_t last_minute;
+ protected time_t chosen_time;
+ protected SourceType chosen_type;
+
+ protected SList<Alarm> alarms;
// Ticks once a minute
public signal void minute_changed(long time, SourceType source);
public Clock()
{
name = "clock";
-
+ alarms = null;
last_minute = 0;
last_gps_time = 0;
last_gps_time_system_time = 0;
last_system_time = time_t();
+ chosen_time = last_system_time;
gps_time = zavai.registry.sbus.get_object(
"org.freesmartphone.ogpsd",
"org.freedesktop.Gypsy.Time");
}
+ public void schedule(Alarm a)
+ {
+ alarms.insert_sorted(a, alarm_compare);
+ zavai.log.info("Next alarm: " + alarms.data.label + " at " + Time.local(alarms.data.deadline).to_string());
+ }
+
+ public void check_alarms()
+ {
+ last_system_time = time_t();
+ update_time();
+ while (alarms != null && alarms.data.deadline <= chosen_time)
+ {
+ Alarm a = alarms.data;
+ alarms.remove(a);
+ zavai.log.info("Triggering " + a.label);
+ a.trigger();
+ }
+ }
+
private void on_gps_time(dynamic DBus.Object pos, int t)
{
if (t == 0)
private void update_time()
{
- time_t chosen;
- SourceType type;
if (last_gps_time_system_time + 10 > last_system_time)
{
- chosen = last_gps_time;
- type = SourceType.GPS;
+ chosen_time = last_gps_time;
+ chosen_type = SourceType.GPS;
}
else
{
- chosen = last_system_time;
- type = SourceType.SYSTEM;
+ chosen_time = last_system_time;
+ chosen_type = SourceType.SYSTEM;
}
- if (chosen / 60 != last_minute)
+ if (chosen_time / 60 != last_minute)
{
- last_minute = chosen / 60;
- minute_changed(chosen, type);
+ last_minute = chosen_time / 60;
+ minute_changed(chosen_time, chosen_type);
}
}