Buenas,
hoy cierro la serie donde comento como utilizando C# podemos controlar el estado de las luces de un USB Email Notifier de poco más de U$S 8.00.
- [#GADGETS] Como controlar el USB Email Notifier con C# (I)
- [#GADGETS] Como controlar el USB Email Notifier con C# (II)
- [#GADGETS] HowTo: Integrar el USB Email Notifier para mostrar los estados de Lync 2013 Beta (III)
En primer lugar el ejemplo real que estaba armando era una aplicación que mostraba las alertas para un servidor de Builds con Team Foundation Server 2012. Como alguna vez hace tiempo ya armé algo parecido con el lanza misiles USB y Team Foundation Server 2008, pues hoy haré algo diferente.
Hace un tiempo me llamo la atención este post de Scott Hanselman, donde comenta como ha puesto un BusyLight en la puerta de su oficina para que su familia sepa si está en una call, conferencia, etc. Además de sentirme bastante identificado con su situación, me llamó la atención de que nadie haya creado una solución “barata” para esto. Pues bien, aquí está por unos U$S 20 y con la satisfacción de haberlo hecho uno mismo.
Lo único que necesitamos es un light notifier y un par de extensiones USB, por ejemplo
- USB Universal E-mail/Webmail Notifier + 4-Port Hub (Gmail/Outlook/Outlook Express/POP3)
- USB 2.0 High Speed Extension Cable with Signal Power Amplifier Chip (5-Meter)
Lo siguiente es crear una aplicación WPF donde utilicemos los controles de presencia de Lync. En este caso estoy utilizando LYNC 2013 BETA, con lo que tuve que descargar el SDK también en modo Beta desde aquí. Lo bueno de este SDK, es que además del clásico modelo de objetos, también tenemos una serie de controles WPF que nos permiten crear una aplicación como la que podemos ver la siguiente imagen en pocos minutos:
El código WPF
1: <Window x:Class="ElBruno.LyncLightNotifier.MainWindow"
2: xmlns:controls="clr-namespace:Microsoft.Lync.Controls;assembly=Microsoft.Lync.Controls"
3: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5: Title="El Bruno - LYNC 2013 Light Alert"
6: Height="264"
7: Width="405">
8: <Grid>
9: <Grid.RowDefinitions>
10: <RowDefinition />
11: <RowDefinition />
12: </Grid.RowDefinitions>
13: <Grid.ColumnDefinitions>
14: <ColumnDefinition Width="187*" />
15: <ColumnDefinition Width="384*" />
16: </Grid.ColumnDefinitions>
17: <Grid.Background>
18: <ImageBrush ImageSource="Lync.png" />
19: </Grid.Background>
20: <StackPanel Orientation="Vertical"
21: Margin="10,0,0,10"
22: HorizontalAlignment="Stretch"
23: VerticalAlignment="Center"
24: Height="106"
25: Grid.Column="1"
26: Grid.Row="1">
27: <controls:MyPresenceChooser x:Name="myPresence"
28: HorizontalAlignment="Stretch" />
29: <controls:MyStatusArea x:Name="myStatus" />
30: </StackPanel>
31: </Grid>
32: </Window>
Ahora bien, como no he invertido mucho tiempo en ver como funciona el SDK, en los primeros 10 minutos no encontré un evento que me indique el cambio de estado. Es por eso que el siguiente código es casi igual de dañino para el mundo de la programación como asesinar al último unicornio o hacer un par de kilómetros en mi coche (lo último es dañino para la ecología).
1: using System;
2: using System.Timers;
3: using System.Windows;
4: using System.Windows.Threading;
5: using ElBruno.LightNotifier;
6: using Microsoft.Lync.Controls;
7:
8: namespace ElBruno.LyncLightNotifier
9: {
10: public partial class MainWindow
11: {
12: private readonly Timer _timer = new Timer(1000);
13: public MainWindow()
14: {
15: InitializeComponent();
16: Loaded += MainWindowLoaded;
17: Unloaded += MainWindowUnloaded;
18: }
19:
20: void MainWindowUnloaded(object sender, RoutedEventArgs e)
21: {
22: _timer.Elapsed -= TimerElapsed;
23: _timer.Stop();
24: }
25:
26: void MainWindowLoaded(object sender, RoutedEventArgs e)
27: {
28: _timer.Elapsed += TimerElapsed;
29: _timer.Enabled = true;
30: }
31:
32: void TimerElapsed(object sender, ElapsedEventArgs e)
33: {
34: Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(CheckLyncState));
35: }
36: void CheckLyncState()
37: {
38: var state = myPresence.AvailabilityState;
39: var lightController = new LightController();
40: lightController.TurnLight(state == ContactAvailability.DoNotDisturb);
41: }
42: }
43: }
Pues bien, la solución es bastante simple: un timer que cada segundo verifica el estado en LYNC 2013 y si el mismo es Do Not Disturb, pues enciende el light notifier. Las líneas 32 hasta la 41 te harán feliz.
Si una imagen vale más que mil palabras, el siguiente valor debe valer 2 o 3 monosílabos
Video: http://youtu.be/Tah42D8Vozw
El código de la aplicación completa se puede descargar desde http://sdrv.ms/PkgQ4L.
Referencias:
- Microsoft Lync 2013 SDK (Preview)
http://www.microsoft.com/en-gb/download/details.aspx?id=30350 - Lync 2013 Preview SDK Documentation
http://msdn.microsoft.com/en-us/library/lync/jj265569(v=office.15).aspx - Is Daddy on a call? A BusyLight Presence indicator for Lync for my Home Office
http://www.hanselman.com/blog/IsDaddyOnACallABusyLightPresenceIndicatorForLyncForMyHomeOffice.aspx
Saludos @ Home
El Bruno

Leave a reply to [#HDI] HowTo: Listar dispositivos #HDI conectados en Windows 8.1 | El Bruno Cancel reply