[#GADGETS] HowTo: Integrar el USB Email Notifier para mostrar los estados de Lync 2013 Beta (III)

image

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.

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

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:

image

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:

Saludos @ Home

El Bruno

image image image

[#RESHARPER] ReSharper 7.1 EAP ya esta abierto para todos

Buenas,

desde ayer ya podemos descargar la versión para prueba de ReSharper 7.1. Como todas las versiones no finales, pues estamos jugando con fuego. Sin embargo hay 2 o 3 features interesantes en esta versión:

  • No more regions después de un Code CleanUp
  • Hay un par de cosillas nuevas que afectan a ASP.Net MVC. Tengo que darle un vistazo a este listado para ver que han arreglado e incorporado.
  • Si sos un fan de .Net Framework 4.5, pues ya tenemos soporte para CallerInfo en las propiedades.
  • Etc ….

El listado completo en el siguiente link.

Fuente: http://blogs.jetbrains.com/dotnet/2012/09/resharper-71-early-access-is-open/

Descarga: http://confluence.jetbrains.net/display/ReSharper/ReSharper+7.1+Nightly+Builds

Saludos @ Home

El Bruno

image image image

[#WINDOWS8] HowTo: Obtener el numero de version de una aplicacion Windows 8

image

Buenas,

después de los grandes éxitos sobre cómo obtener el número de versión de un ensamblado y de sobre cómo obtener el número de versión de una aplicación ClickOnce, hoy toca un poco de ayuda para obtener el número de versión en una aplicación de Windows 8.

   1: string GetVersion()

   2: {

   3:     Package package = Package.Current;

   4:     PackageId packageId = package.Id;

   5:     PackageVersion version = packageId.Version;

   6:     return String.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);

   7: }

Saludos @ Home

El Bruno

image image image

[#ALM] Comprueba en que estado de madurez se encuentran tus procesos de desarrollo de software

ALM 03

Buenas,

tal vez algunos no lo conozcan, existe una tabla muy completa que nos permite identificar el grado de madurez de nuestros procesos de desarrollo de software en Basic, Standard, Advanced y Dynamic.

Esta tabla se encuentra disponible para descargar desde uno de los sites en CodePlex de los ALM Rangers y se puede descargar desde aquí.

image

Ahora bien, en la tabla se analizan diferentes puntos como por ejemplo “Despliegue y Operaciones” o “Software Configuration Management”. Es probable que para cada uno de ellos tengamos un nivel de madurez diferente, pero lo más importante es que tendremos claro cuales son los pasos que deberemos seguir para subir de nivel.

Excelente recurso!

Descarga: http://vsaralmassessment.codeplex.com/downloads/get/488960

Saludos @ Home

El Bruno

image image image

2

[#PERSONAL] Diferencia entre un programador y un buen programador

image

Buenas,

mientras sigo leyendo un par de libros muy buenos deja una frase que no me canso de leer:

The difference between a tolerable programmer and a great programmer is not how many programming languages they know, and it’s not whether they prefer Python or Java. It’s whether they can communicate their ideas. By persuading other people, they get leverage. By writing clear comments and technical specs, they let other programmers understand their code, which means other programmers can use and work with their code instead of rewriting it. Absent this, their code is worthless. By writing clear technical documentation for end users, they allow people to figure out what their code is supposed to do, which is the only way those users can see the value in their code. There’s a lot of wonderful, useful code buried on sourceforge somewhere that nobody uses because it was created by programmers who don’t write very well (or don’t write at all), and so nobody knows what they’ve done and their brilliant code languishes.

I won’t hire a programmer unless they can write, and write well, in English. If you can write, wherever you get hired, you’ll soon find that you’re getting asked to write the specifications and that means you’re already leveraging your influence and getting noticed by management.

Joel Spolsky, How To Write Without Writing

Saludos @ Home

El Bruno

image image image

[#VS2012] .REG para cambiar la acción por defecto de “Resolve” a “Associate” en Visual Studio 2012

image

Buenas,

hace un tiempo el amigo Luis nos mostraba la entrada en el registro de windows que debemos cambiar para cambiar la acción por defecto de “Resolve” a “Associate” cuando hacemos un CheckIn con Visual Studio 2010.

Yo luego escribí un post al respecto donde además ponía un .reg para cambiar esta entrada. Hoy actualizo este archivo para modificar el registro para Visual Studio 2012.

El mismo tiene el siguiente contenido

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio11.0TeamFoundationSourceControlBehavior]
"ResolveAsDefaultCheckinAction"="False"

y se puede descargar desde aquí: http://sdrv.ms/QFopEN

Saludos @ Home

El Bruno

image image image

[#GADGETS] Como controlar el USB Email Notifier con C# (II)

image

Buenas,

después del post donde comenté cómo identificar la información de un gadget USB conectado a un ordenador, hoy veremos como trabajar con el mismo desde una aplicación C#.

A partir de la información del dispositivo

image

Lo primero que haremos será definir un array de bytes de 6 elementos para enviar información al led (línea 1).

Luego definimos un par de constantes para identificar el gadget (líneas 7 y 8) y creando una clase del tipo USBInterface (ver el post anterior), podremos conectarnos a nuestro dispositivo.

   1: private readonly byte[] _cmdData = new byte[] { 0, 0, 0, 0, 0, 0 };

   2: private readonly USBInterface _device;

   3: private readonly bool _connected; 

   4:  

   5: public LightController()

   6: {

   7:     const string vendorId = "vid_1294"; 

   8:     const string productId = "pid_1320"; 

   9:     _device = new USBInterface(vendorId, productId);

  10:  

  11:     if (_connected)

  12:     {

  13:         return;

  14:     }

  15:     _device.enableUsbBufferEvent(UsbDeviceEventCacher);

  16:     _connected = true;

  17: }

Lo siguiente será crear una función para encender o apagar el Led del dispositivo. El escenario de encender es muy simple, cambiamos el 2do elemento del array de 0 a 1 y lo enviamos con la función writeDataSimple().

   1: public void TurnLight(bool lightOn)

   2: {

   3:     _cmdData[1] = 0;

   4:     if (lightOn)

   5:     {

   6:         _cmdData[1] = 1;

   7:     }

   8:     _device.UsbDevice.writeDataSimple(_cmdData);

   9: }

Para apagar hacemos lo mismo, pero con el 2do elemento igual a 0.

El código completo de la clase quedaría así:

   1: using System;

   2: using System.Diagnostics;

   3: using System.Linq;

   4: using USBHIDDRIVER;

   5:  

   6: namespace ElBruno.LightNotifier

   7: {

   8:     public class LightController

   9:     {

  10:         private readonly byte[] _cmdData = new byte[] { 0, 0, 0, 0, 0, 0 };

  11:         private readonly USBInterface _device;

  12:         private readonly bool _connected; 

  13:  

  14:         public LightController()

  15:         {

  16:             const string vendorId = "vid_1294"; 

  17:             const string productId = "pid_1320"; 

  18:             _device = new USBInterface(vendorId, productId);

  19:  

  20:             if (_connected)

  21:             {

  22:                 return;

  23:             }

  24:             _device.enableUsbBufferEvent(UsbDeviceEventCacher);

  25:             _connected = true;

  26:         }

  27:  

  28:  

  29:         public void TurnLight(bool lightOn)

  30:         {

  31:             _cmdData[1] = 0;

  32:             if (lightOn)

  33:             {

  34:                 _cmdData[1] = 1;

  35:             }

  36:             _device.UsbDevice.writeDataSimple(_cmdData);

  37:         }

  38:  

  39:         private void UsbDeviceEventCacher(object sender, EventArgs e)

  40:         {

  41:             if (USBInterface.usbBuffer.Count <= 0) return;

  42:             const int counter = 0;

  43:             while (USBInterface.usbBuffer[counter] == null)

  44:             {

  45:                 lock (USBInterface.usbBuffer.SyncRoot)

  46:                 {

  47:                     USBInterface.usbBuffer.RemoveAt(0);

  48:                 }

  49:             }

  50:             var currentRecord = (byte[])USBInterface.usbBuffer[0];

  51:             lock (USBInterface.usbBuffer.SyncRoot)

  52:             {

  53:                 USBInterface.usbBuffer.RemoveAt(0);

  54:             }

  55:             if (currentRecord == null) return;

  56:             var msg = currentRecord.Aggregate("current record:", (current, t) => current + t);

  57:             msg += "rn";

  58:             Trace.WriteLine(msg);

  59:         }

  60:     }

  61: }

Y listo! en 60 líneas tenemos una clase que nos permite encender y apagar el LEG de nuestro gadget USB.

Mañana el código fuente y el ejemplo completo.

Saludos @ La Finca

El Bruno

image image image

[#GADGETS] Como controlar el USB Email Notifier con C# (I)

image

Buenas,

ayer en la charla de robotics en la universidad mostré como conectar un dispositivo USB y comenzar a jugar con el mismo para ver si podemos hacer algo utilizando C#. Para la demo utilicé un gadget parecido a este USB Email Notifier (link) que venden por internet a sólo U$S:8,68 (gastos de envío incluido).

image

Este HUB USB viene con un software especial que frente a determinados eventos hace que el sobre cambie de color. Por ejemplo: revisa nuestro buzón de correos y cuando llega un nuevo correo, pues enciende un led rojo dentro del mismo.

El objetivo de este post es mostrar como crear una clase C# para encender o apagar la luz a nuestro gusto. Lo primero que tenemos que hacer es identificar el dispositivo HID como explico en este post. Para esto utilizamos la herramienta SimpleHIDWrite (descarga desde aquí). Con la misma podemos ver información relativa a todos los dispositivos USB que tenemos conectados a nuestro ordenador. Por ejemplo:

image

Nuestro dispositivo se llama “DDD Mail Notifier”. Si accedemos a la información del dispositivo veremos un par de datos importantes:

  • Vendor name: “DDD Mail Notifier”
  • Product name: “DDD Mail Notifier”
  • Input Buffer: 9 Bytes
  • Input Buffer: 6 Bytes

image

Si volvemos al formulario principal, veremos que el buffer de 6 bytes se representa dinámicamente con 6 cajas de texto en el formulario. Así que ahora nos toca ver que datos son los que tenemos que enviar para poder encender la luz.

Si introducimos la siguiente información

{ 00, 00, 00, 00, 00, 00 }

y presionamos el botón Write

image

veremos que el LED sigue apagado.

image

Si en cambio introducimos la siguiente información

{ 01, 00, 00, 00, 00, 00 }

y presionamos el botón Write

image

veremos que se enciende el LED rojo.

image

Si volvemos a introducir la siguiente información

{ 00, 00, 00, 00, 00, 00 }

veremos que se apaga el LED.

En este punto ya hemos dejado en claro que

  • { 00, 00, 00, 00, 00, 00 } >= Turn OFF
  • { 01, 00, 00, 00, 00, 00 } >= Turn ON

En el siguiente post veremos como hacer esto mismo con C#.

See you later !!!

Saludos @ Home

El Bruno

image image image

[#EVENT] Materiales del evento de Robotics y Kinect en la Universidad Carlos III

image

Buenas,

aquí os dejo los links a las presentaciones y el código fuente que utilice ayer en el evento de Robotics y Kinect en la Universidad:

https://skydrive.live.com/?cid=BEF06DFFDB192125&id=BEF06DFFDB192125%213842#cid=BEF06DFFDB192125&id=BEF06DFFDB192125%218070

Y el video de la misma se puede ver en

http://imagineware.org/charla-msrobotics-2012.html

Saludos @ Home

El Bruno

image image image