From: Enrico Zini Date: Sun, 28 Mar 2010 12:24:03 +0000 (+0100) Subject: Redone vibrator in a stackable way X-Git-Url: https://git.toastfreeware.priv.at/gregoa/zavai.git/commitdiff_plain/d18e95b593a6bca0b579ad59f10df1943bb84aed?hp=c08de527ef9fe883ffa9b9633bac007eaa8ceb3d Redone vibrator in a stackable way --- diff --git a/src/audio.vala b/src/audio.vala index 1c39420..7639bcb 100644 --- a/src/audio.vala +++ b/src/audio.vala @@ -23,11 +23,110 @@ using GLib; namespace zavai { namespace audio { -public class Audio: zavai.Service +public class VibratorState +{ + public string name; + public int brightness; + public string trigger; + public int delay_on; + public int delay_off; + + public VibratorState(string name) + { + this.name = name; + set_constant(0); + } + + public void set_constant(int power) + { + brightness = power; + trigger = "none"; + delay_on = 0; + delay_off = 0; + } + + public void set_blink(int power, int delay_on=200, int delay_off=300) + { + brightness = power; + trigger = "timer"; + this.delay_on = delay_on; + this.delay_off = delay_off; + } + + public void to_omhacks(ref Omhacks.Led led) + { + led.brightness = brightness; + Memory.copy(led.trigger, trigger, trigger.size()); + led.delay_on = 200; + led.delay_off = 300; + } +} + +public class Vibrator : zavai.Resource, Object { protected Omhacks.Led vibrator; - protected bool has_vibrator; + protected List states; + + public Vibrator() throws FileError + { + if (vibrator.init("neo1973:vibrator") != 0) + throw new FileError.NOENT("vibrator not found"); + + states = new List(); + } + + public void turn_off() + { + vibrator.brightness = 0; + Memory.copy(vibrator.trigger, "none", 5); + vibrator.set(); + } + + public void push_state(VibratorState state) + { + states.prepend(state); + state.to_omhacks(ref vibrator); + vibrator.set(); + } + + public void pop_state(string name) + { + // Handle empty list + if (states == null) return; + + // Track if the list head changed + weak List old_top = states; + + // Remove state "name" from the stack + for (weak List i = states; i != null; i = i.next) + if (i.data.name == name) + { + states.delete_link(i); + break; + } + + // If the list head changed, put into action the new top state + if (states != old_top) + if (states == null) + turn_off(); + else { + // Activate the new top + states.data.to_omhacks(ref vibrator); + vibrator.set(); + } + } + + public void shutdown() + { + while (states != null) + states.delete_link(states); + turn_off(); + } +} + +public class Audio: zavai.Service +{ /* protected dynamic DBus.Object audiodev; protected dynamic DBus.Object vibdev; @@ -37,8 +136,6 @@ public class Audio: zavai.Service { Object(name: "audio"); - has_vibrator = (vibrator.init("neo1973:vibrator") == 0); - /* audiodev = zavai.registry.sbus.get_object( "org.freesmartphone.odeviced", @@ -57,20 +154,11 @@ public class Audio: zavai.Service public void on_alarm_trigger(clock.AlarmTriggerInfo info) { zavai.log.debug("Make noise for alarm"); - if (has_vibrator) + if (vibrator != null) { - vibrator.brightness = 256; - // FIXME: is there a better way? I hope there is a better way. Please - // tell me there is a better way. - var trig = "timer"; - for (int i = 0; ; ++i) - { - vibrator.trigger[i] = (char)trig[i]; - if (trig[i] == 0) break; - } - vibrator.delay_on = 200; - vibrator.delay_off = 300; - vibrator.set(); + var state = new VibratorState("alarm"); + state.set_blink(255); + vibrator.push_state(state); } soundplayer.play(config.ringtone_alarm, true); } @@ -78,34 +166,10 @@ public class Audio: zavai.Service public void on_alarm_done(clock.AlarmTriggerInfo info) { zavai.log.debug("Stop noise for alarm"); - if (has_vibrator) - { - var trig = "none"; - for (int i = 0; ; ++i) - { - vibrator.trigger[i] = (char)trig[i]; - if (trig[i] == 0) break; - } - vibrator.brightness = 0; - vibrator.set(); - } + if (vibrator != null) + vibrator.pop_state("alarm"); soundplayer.stop(); } - -/* - public void notify_alarm(zavai.clock.Alarm a) - { - // Wiggle screen to turn on backlight - zavai.ui.power.backlight.wiggle(); - try { - // Method does not exist in this frameworkd - vibdev.BlinkSeconds(5, 500, 200); - } catch (Error e) { - zavai.log.error("Cannot blink vibrator: " + e.message); - } - // TODO: play music? - } -*/ } public class Player: zavai.Resource, Object @@ -207,12 +271,20 @@ stderr.printf("Playing %s\n", uri); } } +public Vibrator vibrator = null; public Audio audio = null; public Player musicplayer = null; public Player soundplayer = null; public void init() { + try { + vibrator = new Vibrator(); + zavai.registry.register(vibrator); + } catch (Error e) { + zavai.log.info("No vibrator found"); + vibrator = null; + } audio = new Audio(); musicplayer = new Player(); soundplayer = new Player();