#include <stdio.h> // printf, system
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <windows.h>
// Cabecera API USB de Microchip
// Hay que incluírla después de windows.h
// (o agregar windows.h a _mpusbapi.h)
#include "_mpusbapi.h"
// Declaración de funciones
void openPipes();
void closePipes();
void sendPacket( unsigned char* sendData, DWORD sendLength );
void receivePacket( unsigned char* receiveData, DWORD receiveLength );
void sumaPIC( BYTE sumando1, BYTE sumando2 );
UINT resultadoPIC();
void ledPIC( UINT led );
int menu();
// Constantes para el menú
#define OPCION_SALIR 6
#define OPCION_APAGAR 1
#define OPCION_LEDVERDE 2
#define OPCION_LEDROJO 3
#define OPCION_SUMA 4
#define OPCION_DOSLEDS 5
// Variables globales
char* vidPid = "vid_04d8&pid_0011";
char* outPipe = "\\MCHP_EP1";
char* inPipe = "\\MCHP_EP1";
void* receiveData;
DWORD* receiveLength;
HANDLE myOutPipe;
HANDLE myInPipe;
BYTE sumando1 = 0;
BYTE sumando2 = 0;
int main() {
int opcion = 0;
do {
opcion = menu();
switch( opcion ) {
case OPCION_APAGAR:
cout << "Apagando leds..." << endl;
ledPIC( 0x00 );
break;
case OPCION_LEDVERDE:
cout << "Encendiendo LED verde" << endl;
ledPIC( 0x01 );
break;
case OPCION_LEDROJO:
cout << "Encendiendo LED rojo" << endl;
ledPIC( 0x02 );
break;
case OPCION_SUMA:
cout << "Primer sumando (0-99): "; scanf( "%d", &sumando1 );
cout << "Segundo sumando (0-99): "; scanf( "%i", &sumando2 );
sumaPIC( sumando1, sumando2 );
cout << "Resultado: " << resultadoPIC() << endl;
system( "pause" );
break;
case OPCION_SALIR:
system( "cls" );
cout << "Saliendo..." << endl;
break;
case OPCION_DOSLEDS:
ledPIC( 0x03 );
break;
default:
cout << "La opcion no existe, intente de nuevo" << endl;
system( "pause" );
break;
}
} while ( opcion != OPCION_SALIR );
system( "pause" );
return 0;
}
void openPipes() {
DWORD selection = 0;
myOutPipe = MPUSBOpen( selection, vidPid, outPipe, 0, 0 );
myInPipe = MPUSBOpen( selection, vidPid, inPipe, 1, 0 );
}
void closePipes() {
MPUSBClose( myOutPipe );
MPUSBClose( myInPipe );
}
void sendPacket( unsigned char* sendData, DWORD sendLength ) {
unsigned short sendDelay = 1000;
DWORD sentDataLength;
openPipes();
MPUSBWrite( myOutPipe, (void*)sendData, sendLength, &sentDataLength, sendDelay );
closePipes();
}
void receivePacket( unsigned char* receiveData, DWORD* receiveLength ) {
unsigned short receiveDelay = 1000;
DWORD expectedReceiveLength = *receiveLength;
openPipes();
MPUSBRead( myInPipe, (void*)receiveData, expectedReceiveLength, receiveLength, receiveDelay );
closePipes();
}
void sumaPIC( BYTE sumando1, BYTE sumando2 ) {
BYTE sendBuf[ 3 ];
sendBuf[ 0 ] = 0x00;
sendBuf[ 1 ] = sumando1;
sendBuf[ 2 ] = sumando2;
sendPacket( sendBuf, 3 );
}
UINT resultadoPIC() {
UINT result = 0;
BYTE receiveBuf[ 1 ];
DWORD receiveLength = 1;
receivePacket( receiveBuf, &receiveLength );
result = receiveBuf[ 0 ];
return result;
}
void ledPIC( UINT led ) {
BYTE sendBuf[ 2 ];
sendBuf[ 0 ] = 0x01;
sendBuf[ 1 ] = (BYTE)led;
sendPacket( sendBuf, 2 );
}
int menu() {
system( "cls" );
cout << "[ 1 ] Apagar LEDs" << endl;
cout << "[ 2 ] Encender LED verde" << endl;
cout << "[ 3 ] Encender LED rojo" << endl;
cout << "[ 4 ] Realizar Suma" << endl;
cout << "[ 5 ] Encender los dos LEDs" << endl;
cout << "[ 6 ] Salir" << endl;
cout << "Opcion: ";
int opcion;
cin >> opcion;
return opcion;
}