#pypp 0 #include #include enum Ins: TOTAL_TIME START NUM_INS enum Outs: CURRENT_TIME ALARM NUM_OUTS typedef UI ui_t static ui_t ui static ui_t::in total_time static ui_t::in_event do_start static ui_t::out current_time static ui_t::out_event do_alarm static bool ticking static void event (unsigned code): switch code: case TOTAL_TIME: break case START: current_time = total_time if !ticking: if !current_time: do_alarm () else: ticking = true Iris::my_receiver.set_alarm (HZ) break default: Iris::panic (0, "invalid event for alarm clock") Iris::Num start (): ticking = false; Iris::Cap ui_cap = Iris::my_receiver.create_capability (0) ui.init (ui_cap.copy ()); Iris::free_cap (ui_cap) total_time.init () do_start.init () current_time.init () do_alarm.init () ui.add_in (&total_time, TOTAL_TIME); ui.add_in (&do_start, START); ui.add_out (¤t_time, CURRENT_TIME); ui.add_out (&do_alarm, ALARM); Iris::my_parent.init_done () while true: Iris::wait () switch Iris::recv.protected_data.l: case ~0: // alarm. if current_time: current_time = current_time - 1 if !current_time: do_alarm () ticking = false else: // TODO: use rtc for scheduling an event. Iris::my_receiver.set_alarm (HZ) continue case 0: // ui event. if !ui.event (&event): // Exit request. return 0