Vamos a programar #7 - Inútil-apps #1 - C# y arduino.

Avanzando lo anterior.

Hola de nuevo a todos el dia de hoy vamos a terminar de implementar lo que estabamos haciendo el post anterior.
Vamos a ver el código que hace funcionar a todo, está compuesto por dos partes, una de ellas es un programa para windows que se encargara de obtener la informacion de lo que estamos escuchando en ITunes.
De seguro te preguntarás: ¿Por qué Itunes y no otro programa? La respuesta es simple, ITunes ofrece soporte para que aquellos programadores que quieran hacaer uso del API de ITunes puedan hacerlo de manera sencilla, además de que el API tambien funciona en la plataforma .NET de microsoft.

La parte del PC. La aplicación  para Windows.
Una vez que creamos en proyecto en #Develop o en C# de Visual studio. Lo primero que vamos a hacer es agregar una referencia a ITunes X.XX Type Library. Para eso iremos al menu Proyecto>Agregar Referencia.
La versión puede variar un poco dependiendo de la versión de itunes que se usa.
La aplicación esta compuesta por lo siguientes controles (además del formulario):
  • El formulario
      • (name): MainForm
  • Un GroupBox
    • 4 Label (Los nombres no son necesarios)
    • 1 ComboBox
      • (name): cboportname
    • 1 TextBox
      • (name): txtBaudNumber
      • Text: 9600
    • 1 TrackBar
      • (name): TrB
      • Maximum: 15
      • Minimum: 1
    • 1 NumericUpDown
      • (name): NUDVelocity
      • Maximum: 500
      • Minimum: 20
    • Button
      • (name):BtnConnect
      • Text: Conectar
    • Button
      • (name):BtnDisconnect
      • Text: Desconectar
Agregando los controles y estableciendo las propiedades como se muestra en la lista, solo bastara con agregar el siguiente codigo a MainForm, reemplazando todo el codigo previo.

/*
 * MPM Develop
 * Usuario: Ra
 * Fecha: 13/07/2016
 * Forget Your troubles C'mon get happy
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;
using iTunesLib;
using System.Configuration;

namespace Message_Sender
{
    public partial class MainForm : Form
    {
        int MessageType = 0;
        private enum Trackinfo
        {
            Title = 0,
            Artist,
            Album,
            BPM,
            Duration
        }
        private SerialPort Port = new SerialPort();
        private string GetTrackOnItunes(Trackinfo Detail)
        {
            iTunesApp ItunesInfo = new iTunesAppClass();
            switch (ItunesInfo.PlayerState) {
                case ITPlayerState.ITPlayerStateStopped:
                    return "Detenido  ";
                case ITPlayerState.ITPlayerStatePlaying:
                    IITTrack Track = ItunesInfo.CurrentTrack;
                    switch (Detail)
                    {
                        case MainForm.Trackinfo.Title:
                            return "Cancion: " + Track.Name + "  ";
                        case MainForm.Trackinfo.Artist:
                            return "Artista: " + Track.Artist+ "  ";
                        case MainForm.Trackinfo.Album:
                            return "Album: " + Track.Album+ "  ";
                        case MainForm.Trackinfo.BPM:
                            return "BPM: " + Track.BPM.ToString()+ "  ";
                        case MainForm.Trackinfo.Duration:
                            return "Duracion: " + TimeSpan.FromSeconds(Track.Duration).ToString()+ "  ";
                        default:
                            return "??? ??? ??? ???  ";
                    }
                case ITPlayerState.ITPlayerStateFastForward:
                    return ">> Avance Rapido >>  ";
                case ITPlayerState.ITPlayerStateRewind:
                    return "<< Retroceso Rapido <<  ";
                default:
                    return "??? ??? ??? ???  ";
            }
        }

        private void ArduinoMessage(string Message)
        {
            try
            {
                Port.Write(Message);
            } catch (Exception e) {
                MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public MainForm()
        {
            InitializeComponent();
        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            if (indata == "Done")
            {
                MessageType++;
                if (MessageType > 4)
                {
                    MessageType = 0;
                }
                ArduinoMessage(GetTrackOnItunes((Trackinfo)MessageType) + "  ");
            }
        }

        void MainFormLoad(object sender, EventArgs e)
        {
            string[] Ports = SerialPort.GetPortNames();
            cboportname.Items.AddRange(Ports);
            Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }

        void BtnConnectClick(object sender, EventArgs e)
        {
            try {
                if (Port.IsOpen == false)
                {
                    Port.BaudRate = int.Parse(txtBaudNumber.Text);
                    Port.PortName = cboportname.Text;
                    Port.Open();
                }
            } catch (Exception ex) {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        void BtnDisconnectClick(object sender, EventArgs e)
        {
            if (Port.IsOpen == true)
            {
                Port.Write("Se ha desconectado el cliente");
                Port.Close();
            }
        }

        void MainFormFormClosing(object sender, FormClosingEventArgs e)
        {
            if (Port.IsOpen == true)
            {
                Port.Close();
            }
        }

        void TrBMouseUp(object sender, MouseEventArgs e)
        {
            ArduinoMessage(">LUM"+TrB.Value.ToString());
        }

        void NUDVelocityValueChanged(object sender, EventArgs e)
        {
            ArduinoMessage(">SPD"+NUDVelocity.Value.ToString());
        }
    }
}
La funcion del codigo es muy sencilla, lo unico que haces es primer crear un objeto del tipo Port y le asignamos un puerto (en mi caso COM3) con la velocidad de transferencia en 9600 Baudio. Después obtiene la informacion desde ITunes y la envía para el arduino.


Ahora solo nos resta por hacer el código para el arduino, pero eso será en la próxima ocasion.

Todo el código fuente lo puedes descargar aquí

Los leo luego
La siguiente parte está aquí.

No hay comentarios.