OT: Cuando me miro al espejo. (Week Joke)

Dime obsesivo… pero me gustaría desvelar la extraña razón de porque últimamente me invade la inquietante sensación de que se me ha pasado el arroz!… alguna idea?

PepEmtium
PepEmtium


A los veteranos se nos hace difícil alcanzar a los jóvenes por su gran capacidad en ‘cores’, aunque pensándolo bien y a estas alturas pudiendo elegir no se si preferiría la hiperactividad de un montón de diminutos ‘cores’ difíciles de manejar, frente a un ‘cuore’ de los de ‘sin prisas pero sin pausa’ con sus inherentes capacidades para compartir ‘things’.

Con el tiempo quizás la simultaneidad cuántica se reinvente en un modelo positrónico simple “como el de Asimov :-)” … dejando a la ‘core mania’  en una pura anécdota dentro de la evolución del silicio, con su algorimetrica  del  paralelismo y  asincronía.

Lo mejor esta por venir!!
LoL!

Using SerialPort Legacy on Windows 8.1

Desde la aparición de Windows 8, se ha escrito mucho sobre la utilización de los espacios de nombres de .NET desde WinRT. Es divertido observar como muchos nos aferramos a estereotipos aparentemente para no tener que cambiar la forma en que utilizamos o hacemos las cosas.

El contenido del siguiente post no es valido si estáis pensando en aplicaciones para la versión RT de Windows… es obvio que difícilmente encontrareis puertos nativos en dispositivos con “RT” ni  USB’s de terceras partes con drivers que los soporten… dicho lo cual :

Esta es una de aquellas discusiones en foros y publicaciones en las que justificamos el porque WinRT no dispone de una implementación para utilizar los eternos “serial ports”.

SerialPortOnWindows81

Mas que la motivación por escribir un simple post, me mueve la inquietud generada al conversar con un responsable de RD en el que discutíamos sobre la decisión de desarrollar una solución en WPF por las limitaciones de WinRT para soportar la herencia de antiguos dispositivos unidos con algún  tipo de “Hardware” cuyos drivers llegaron como mucho a “Windows 7″.

De hecho la respuesta oficial, es que Windows 8 y posteriores soportan puertos series “CDC” a con WINUSB… la realidad es que no todos los fabricantes han actualizado el “firmware” para que sus  drivers se sustenten en “WinUSB”.

Dicho lo cual incluso antes que apareciera la inquietud de acceder a los puertos series nativos desde aplicaciones para la tienda, he utilizado WCF para compartir la comunicación con algún dispositivo de forma concurrente… no olvidéis que al tratarse de una comunicación PeerToPeer si nuestra aplicación “abre” el puerto serie nadie mas podrá acceder a el hasta que liberemos el recurso.

Aquí es donde entra en juego la implementación de un modelo “singlet” que nos permita acceder al envió y recepción de tramas de forma compartida.

Que mas fácil que llamar a un servicio WCF desde Windows 8.x para poder acceder a cualquier objeto que expongamos de .NET, simpre y cuando no estemos en uno de los escenarios donde PCL “Portable Class Library” nos cubra las necesidades.

El siguiente código muestra un punto de partida, entendible, simple y fácil… a petición vuestra podríamos ir desarrollando el tema si es de interés general.

Empezaremos creando un servicio con una simple función de enviar una trama al puerto serie (“con total independencia de si es un puerto nativo, CDC USB…etc”)
<ServiceContract()>
Public Interface ISerialPortService
    <OperationContract()>
    Function PortWrite(frame As StringAs String 
End Interface

Imports WcfSerialPort
Public Class SerialPortService
    Implements ISerialPortService
    Public Property mySerialPort As 
                     New System.IO.Ports.SerialPort

    Public Function writePort(frame As StringAs 
        String Implements ISerialPortService.PortWrite
        Try
            mySerialPort.ReadTimeout = 1000
            mySerialPort.NewLine = vbCrLf
            mySerialPort.PortName = "COM4"
            mySerialPort.BaudRate = 1200
            mySerialPort.Open()
            mySerialPort.Write(frame + vbCrLf)
 
            Dim response = ReadResponse()
            mySerialPort.Close()
            Return response
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function
 
    Private Function ReadResponse() As String
        Try
            Return mySerialPort.ReadLine()
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function
 
End Class

Una vez tengamos en servicio en marcha solo tendremos que añadir un proyecto nuevo para la tienda y listo!!
Public NotInheritable Class MainPage
    Inherits Page
    Private miSerialPort As
           New WcfSerialPort.SerialPortServiceClient
 
    Async Sub Btn_Click(sender As Object, 
                             e As RoutedEventArgs)
        Dim result = Await miSerialPort.PortWriteAsync                          ("Hello Windows 8.1 App!!")
        Dim msgbox As 
          New Windows.UI.Popups.MessageDialog(result)
        Await msgbox.ShowAsync()
    End Sub
End Class

Como veis… no muy difícil para empezar :-)
Me gustara que continuéis en este post, con vuestras conversaciones. Saludos domingueros!!
PepLluis,

Gadgeteer core 2.34.1000 Disponible en codeplex

Uniéndose a las ultimas actualizaciones, recién salido del horno ya tenemos disponible la versión de .NET Gadgeteer para VS2013/VS2012 o VS2010.

Os refresco los links : http://gadgeteer.codeplex.com/releases/view/134757

Beta para el SDK-R2 de MicroFramework 4.3 : http://netmf.codeplex.com/releases/view/133285

OpenTech de Microsoft  : http://msopentech.com/

NetMF  : http://www.netmf.com/

Saludos,
PepLluis,

 

Net Microframework – Volver a Empezar

Después de un periodo de sombra… parece ser que el tirón de IoT vuelve a poner en escena  a Microframework y Gadgeteer.

Para los que sintáis curiosidad os dejo un enlace a un “overview” en ch9 posteado hace poquitas horas.

Para los asiduos y seguidores mas que sorprenderos, vale la pena escuchar a Salvador Ramírez (microframework team), creo que aclara direcciones y planes de futuro.

NET-Micro-Framework

Que lo disfrutéis!

PepLluis,

Back on the road : Microframework SDK 4.3-R2 (Beta)

En los últimos macro-eventos de Microsoft hemos sido testigos de grandes anuncios, compromisos y cambios de orientación que la compañía promete introducir en un futuro casi  inmediato. Los primeros discursos de Satya Nadella dejaron definidas de forma clara las líneas que marcan la nueva orientación, y que dicho de paso generan buenas expectativas para un gran numero de desarrolladores deseosos de explorar nuevos horizontes.

Si recopilamos alguno de los mensajes muchas de estas iniciativas están directamente relacionadas con palabras que giran en torno al Cloud, Open Source y obviamente cualquier cosa relacionada con el IoT o el “Internet of yours things”.

Simultáneamente asistimos a una decidida apuesta por “Windows on Devices” integrando plataformas diversas entorno a “SoC’s” con Intel Atom o Quark. Sin duda una ventana enorme para los que apuestan por el internet de las cosas, como uno de los escenarios más propicios para generar potentes oportunidades de tecnología, innovación y negocio.

Muchos de los que seguimos de cerca la progresión de MicroFramework hemos estado durante meses esperando “alguna noticia” que despejara las dudas que se estaban generando sobre los planes que el equipo de MS tenía en su Roadmap. La gran explosión de IoT con WindowsOnDevices y los futuros Azure Intelligent System Services, sumados al hecho de que MicroFramework no estaba soportado en Visual Studio 2013 ponía en tela de juicio cualquier comentario sobre los planes más optimistas.

Pues bien como siempre el silencio y la calma no es más que el preludio de un gran revuelo. Hace pocas horas el equipo de NetMF anunciaba la disponibilidad en BETA del SDK-R2 de MicroFramework para Visual Studio 2013.

Es una gran noticia para la comunidad de NetMF que además viene respaldada por una renovada filosofía… de nuevo grandes cambios, grandes retos! :-)

El proyecto ha sido asignado al equipo OpenTech de Microsoft  : http://msopentech.com/

NetMF se renueva en su site : http://www.netmf.com/

Beta para el SDK-R2 de MicroFramework 4.3 : http://netmf.codeplex.com/releases/view/133285

En cuanto pueda os posteare otro corto con las características que se añadirán a este R2. Saludos, PepLluis,

Binding’s a la antigua : Remix (Enlazar textbox a la ‘column’ de una tabla)

Continuando con los remix, un antiguo pero recurrente ejemplo solicitado a menudo para enlazar datos a través de binding.
' Respondiendo a como añadir o modificar registros
' de una tabla de SQL con bindings y al viejo estilo
'
' Utilizaremos las columnas de Nombre y Teléfono 
' de la tabla ‘Shippers’
' Después de insertar un nuevo registro, usaremos el
' botón de actualizar para actualizar la BD.

Imports System.Data
Imports System.Data.SqlClient
Public Class miContenedor
'
'Constructores para tabla ‘Shippers’ 
' ...con su correspondiente BindingSource
Private MiConexion As New SqlConnection(“Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Temp\Northwind\NORTHWND.MDF” +
“;Integrated Security=True;Connect Timeout=30;User Instance=True”)
Private MiDataSet As New DataSet()
Private MiAdaptador As New SqlDataAdapter(“SELECT * FROM Shippers”, MiConexion)
Private MiEnlazador As New BindingSource
Private Sub Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
'
' Panel con los textbox para la entrada/modificación
    Dim Nombre As New TextBox
    Dim Telefono As New TextBox
    Dim marcoDatos = New FlowLayoutPanel
    marcoDatos.Dock = DockStyle.Top
    marcoDatos.Controls.AddRange(New Control() {Nombre, Telefono})
    Me.Controls.AddRange(New Control() {marcoDatos})
    '
    ' Panel conteniendo los botones de control
    Dim Avanza As New Button
    Dim Retrocede As New Button
    Dim Insertar As New Button
    Dim Actualizar As New Button
    Dim Controles As New FlowLayoutPanel
    Controles.Dock = DockStyle.Bottom
    Retrocede.Text = “<- Re”
    Avanza.Text = “Av ->”
    Insertar.Text = “Insertar”
    Actualizar.Text = “Actualizar”
    Controles.Controls.AddRange(New Control() {Retrocede, Avanza, Insertar, Actualizar})
    Me.Controls.AddRange(New Control() {Controles})
    '
    ' Asignar el eventos a las funciones
    AddHandler Retrocede.Click, AddressOf retroceder
    AddHandler Avanza.Click, AddressOf Avanzar
    AddHandler Insertar.Click, AddressOf Nuevo
    AddHandler Actualizar.Click, AddressOf Actualizacion
    '
    ' Conexión,relleno y asignacion del enlace al datos
    MiConexion.Open()
    MiAdaptador.Fill(MiDataSet)
    MiEnlazador.DataSource = MiDataSet.Tables(0)
    Dim Micommandbuilder As New SqlCommandBuilder(Me.MiAdaptador)
    '
    ' Enlace de los TextBox a sus omologos en la tabla
    Dim EnlaceNombre As New Binding(“Text”, MiEnlazador, “CompanyName”)
    Nombre.DataBindings.Add(EnlaceNombre)
    Dim EnlaceDireccion As New Binding(“Text”, MiEnlazador, “Phone”)
    Telefono.DataBindings.Add(EnlaceDireccion)
End Sub
 
' Avanzar un registro dentro del ‘recordset’ :-)
Sub Avanzar()
      MiEnlazador.MoveNext()
End Sub
 
' Retroceder un registro
Sub retroceder()
      MiEnlazador.MovePrevious()
End Sub
 
'Añadir un registro
Sub Nuevo()
      MiEnlazador.AddNew()
End Sub
 
' Actualizar el registro en curso o el recien creado
Sub Actualizacion()
      MiEnlazador.EndEdit()
      MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
End Sub

Saludos,
Pep Lluis,

Principales Mandatos del Puerto Serie :: Remix

El cambio de blog ha provocado que algunos de los post mas famosos no puedan visualizarse correctamente. algunos de vosotros me habéis pedido un “Remix” aquí tenéis uno de los mas visitados!
' Principales mandatos para utilizar el puerto serie:
Serie = My.Computer.Ports.OpenSerialPort("COM1")  'Constructor
'
'Definir las características de la comunicación
Serie.BaudRate = 19200        'velocidad de comunicaciones
Serie.DataBits = 8            'Longitud para Byte de datos
Serie.Parity = Parity.Even    'paridad(enumeracion parity)
Serie.StopBits = StopBits.Two 'Bits parada después datos

'
'Abrir/Control/Liberar Puerto
Serie.Open()            'Abrir el puerto Serie
Serie.Close()           'Cerrar el Puerto Serie
Serie.Dispose()         'Liberar objecto
Dim SiNo As Integer
SiNo = Serie.IsOpen     'El Puerto esta abierto?
Dim Puerto As String
Puerto = Serie.PortName 'Nombre del puerto

'
'Manejo y Control de señales
Dim Estado As Boolean     'True=Activa / False=Inactiva
Estado = Serie.CDHolding  'Estado de la señal carrier detect
Estado = Serie.CtsHolding 'Señal Clear to Send
Estado = Serie.DsrHolding 'Señal Data Set Ready
Serie.DtrEnable = True    'Activar de Data Terminal Ready
Serie.RtsEnable = True    'Activar Request To Send

'
'Control Transmission/Recepcion
Serie.ReadBufferSize = 1024  'Definir tamaño buffer recepcion
Serie.WriteBufferSize = 1024 'Definir tamaño buffer envio
Serie.ReadTimeout = 10       'Fuera de tiempo en receción
Serie.WriteTimeout = 10      'Fuera de tiempo en transmisión
Serie.Handshake = Handshake.XOnXOff 'Control recepcion/envio
Serie.DiscardInBuffer()             'Borrar buffer de entrada
Serie.DiscardOutBuffer()            'Borrar buffer de salida

'
'Enviar datos
Contador = Serie.BytesToWrite 'Bytes en espera de ser escritos
Serie.Write("Hola Mundo")     'Enviar una cadena de caracteres
Serie.WriteLine("Hola Mundo"'Enviar una linea

'
'Leer datos
Dim Contador as Integer
Contador = Serie.BytesToRead  'Bytes en espera de ser leidos
Serie.ReadByte()              'Leer un byte
Serie.ReadChar()              'Leer un char
Serie.ReadLine()              'Leer una linea
Serie.ReadExisting()          'Leer datos existentes en buffer

PepLluis :-)

El origen del Codigo Abierto

Recuerdo como si fuera ayer la primera vez que escuche el concepto “código abierto”. Luego volqué mi interés en desvelar los secretos del mismo devorando literatura entorno a la nueva filosofía, por aquellas épocas promulgada principalmente por el singular Richard Stallman.

En el fondo siempre tuve la sospecha de que alguna pieza no encajaba del todo en el recetario de dicha filosofía. Esa sospecha me sirvió de convencimiento para iniciar una incansable tarea de investigación que me permitiera desvelar que se ocultaba detrás de tan mágicas siglas.

Después de largos años de búsqueda, finalmente he podido desvelar el origen de una de las filosofías tecnologías que ha movilizado a la mayor masa de adeptos, simpatizantes, creyentes y practicantes de todas las épocas.

De forma inesperada y justo en una olvidada calle detrás del ‘Mercat de les flors’ de BCN he encontrado la prueba definitiva que evidencia empíricamente mi premonición… digitalizado en una vieja pizarra muestra sin lugar a dudas que : nuestras abuelas ya utilizaban código abierto!

Para los neófitos debéis considerar la gran importancia del descubrimiento, pues sin duda no todos los días podemos decir que hemos encontrado las fuentes de nuestro origen y con el mismo hecho poder responder de forma contundente la eterna pregunta “de dónde venimos?”.

CodigoAbierto
El Origen del Codigo Abierto


La riqueza de las palabras es inagotable! :-)
PepLluis,

 

From SerialPort to IoT Devices