Deleted done items
[gregoa/zavai.git] / src / leds.vala
1 /*
2  * leds - Leds support
3  *
4  * Copyright (C) 2010  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 using GLib;
22
23 namespace zavai {
24 namespace led {
25
26 public class LedState
27 {
28     public string name;
29     public int brightness;
30     public string trigger;
31     public int delay_on;
32     public int delay_off;
33
34     public LedState(string name)
35     {
36         this.name = name;
37         set_constant(0);
38     }
39
40     public void set_constant(int power)
41     {
42         brightness = power;
43         trigger = "none";
44         delay_on = 0;
45         delay_off = 0;
46     }
47
48     public void set_blink(int power, int delay_on=200, int delay_off=300)
49     {
50         brightness = power;
51         trigger = "timer";
52         this.delay_on = delay_on;
53         this.delay_off = delay_off;
54     }
55
56     public void to_omhacks(ref Omhacks.Led led)
57     {
58         led.brightness = brightness;
59         Memory.copy(led.trigger, trigger, trigger.size());
60         led.delay_on = 200;
61         led.delay_off = 300;
62     }
63 }
64
65 public class Led : zavai.Resource, Object
66 {
67     protected Omhacks.Led led;
68
69     protected List<LedState> states;
70
71     public Led(string name) throws FileError
72     {
73         if (led.init(name) != 0)
74             throw new FileError.NOENT("led " + name + " not found");
75         states = new List<LedState>();
76     }
77
78     public void turn_off()
79     {
80         led.brightness = 0;
81         Memory.copy(led.trigger, "none", 5);
82         led.set();
83     }
84
85     public void push_state(LedState state)
86     {
87         states.prepend(state);
88         state.to_omhacks(ref led);
89         led.set();
90     }
91
92     public void pop_state(string name)
93     {
94         // Handle empty list
95         if (states == null) return;
96
97         // Track if the list head changed
98         weak List<LedState> old_top = states;
99
100         // Remove state "name" from the stack
101         for (weak List<LedState> i = states; i != null; i = i.next)
102             if (i.data.name == name)
103             {
104                 states.delete_link(i);
105                 break;
106             }
107
108         // If the list head changed, put into action the new top state
109         if (states != old_top)
110             if (states == null)
111                 turn_off();
112             else {
113                 // Activate the new top
114                 states.data.to_omhacks(ref led);
115                 led.set();
116             }
117     }
118
119     public void shutdown()
120     {
121         while (states != null)
122             states.delete_link(states);
123         turn_off();
124     }
125 }
126
127 public class AUXButton: zavai.Service
128 {
129     public signal bool event(ulong time, bool pressed);
130
131     public AUXButton()
132     {
133         // Listen to the button via X
134         input.hotkeys.hotkey += on_auxbutton;
135         input.hotkeys.grab(zavai.config.aux_button_keycode, 0, false);
136         input.hotkeys.request("auxbutton");
137     }
138
139     protected bool on_auxbutton(uint keycode, ulong time, bool pressed)
140     {
141         if (keycode == zavai.config.aux_button_keycode)
142             return event(time, pressed);
143         return false;
144     }
145 }
146
147 public Led aux = null;
148 public Led vibrator = null;
149 public AUXButton auxbutton = null;
150
151 public void init()
152 {
153     auxbutton = new AUXButton();
154
155     try {
156         aux = new Led("gta02-aux:red");
157         zavai.registry.register(aux);
158     } catch (Error e) {
159         zavai.log.info("No aux led found");
160         aux = null;
161     }
162
163     try {
164         vibrator = new Led("neo1973:vibrator");
165         zavai.registry.register(vibrator);
166     } catch (Error e) {
167         zavai.log.info("No vibrator found");
168         vibrator = null;
169     }
170 }
171
172 }
173 }