Projet AutoStart pour projecteur LG

Dependencies:   mbed

main_J.cpp

Committer:
nnguyen
Date:
2017-07-03
Revision:
0:f09b7c760de7

File content as of revision 0:f09b7c760de7:

//* ********************************************** */
/* main_J.cpp
/* Projector autostart project
/* Nam Nguyen
/* Oksana Tovstolytkina
/* May 2017
/* ********************************************** */

#include <mbed.h>

#include "ReceiverIR.h"
#include "TransmitterIR.h"

#define SIMPLE_TEST 1
AnalogIn usb(PA_7);// recevoir le feedback du projecteur
ReceiverIR ir_rx( D8 );
TransmitterIR ir_tx( D9 );
Ticker ledTicker;

Serial pc(USBTX,USBRX);
/**
 * Receive.
 *
 * @param format Pointer to a format.
 * @param buf Pointer to a buffer.
 * @param bufsiz Size of the buffer.
 *
 * @return Bit length of the received data.
 */
int receive(RemoteIR::Format *format, uint8_t *buf, int bufsiz, int timeout = 100)
{
    int cnt = 0;
    while (ir_rx.getState() != ReceiverIR::Received) {
        cnt++;
        if (timeout < cnt) {
            return -1;
        }
    }
    return ir_rx.getData(format, buf, bufsiz * 8);
}

/**
 * Transmit.
 *
 * @param format Format.
 * @param buf Pointer to a buffer.
 * @param bitlength Bit length of the data.
 *
 * @return Bit length of the received data.
 */
int transmit(RemoteIR::Format format, uint8_t *buf, int bitlength, int timeout = 100)//buffer est un espace de stockage que je peux trasmettre ou recevoir
{
    int cnt = 0;
    while (ir_tx.getState() != TransmitterIR::Idle) { //IDLE pour dire que mon transmetteur est pret à envoyer
        cnt++;
        if (timeout < cnt) {
            return -1;
        }
    }
    return ir_tx.setData(format, buf, bitlength);
}

void executeCommand(char* _command)
{
    if (strcmp(_command, "projectorOff") == 0) {
        float value=0.0f;
        value=usb.read();
        if(value >= 1) {
            uint8_t test_buflength1 = 32;
            RemoteIR::Format testformat = RemoteIR::NEC;

            uint8_t power_buf[32]= {  0x04,    0x0F,   0xAD,   0x52,
                                      0x00, 0x00, 0x00, 0x00,
                                      0x00, 0x00, 0x00, 0x00,
                                      0x00, 0x00, 0x00, 0x00,
                                   };


            test_buflength1 = transmit(testformat, power_buf, test_buflength1);
            pc.printf("Ok\n");
        } else {
            pc.printf("Already Off\n");
        }
        return;
    }
    if (strcmp(_command, "projectorOn") == 0) {
        float value=0.0f;
        value=usb.read();
        if(value<1) {
            uint8_t power_buf[32]= {  0x04,    0x0F,   0xAD,   0x52,
                                      0x00, 0x00, 0x00, 0x00,
                                      0x00, 0x00, 0x00, 0x00,
                                      0x00, 0x00, 0x00, 0x00,
                                   };
            uint8_t test_buflength1 = 32;
            RemoteIR::Format testformat = RemoteIR::NEC;
            test_buflength1 = transmit(testformat, power_buf, test_buflength1);
            pc.printf("Ok\n");
        } else {
            pc.printf("Already On\n");
        }
        return;
    }
    return;
}

void getQueryResponse(char* _query)
{
    if (strcmp(_query, "projectorStatus") == 0) {
        float value = 0.0f;
        value=usb.read();
        if (value<1) {
            pc.printf("Off\n");
        } else {
            pc.printf("On\n");
        }
        return;
    }
    if (strcmp(_query, "version") == 0)   {
        pc.printf("1.0\n");
        return;
    }
}

/**
 * Entry point.
 */
int main(void)
{
    unsigned int bufferCounter=0;
    char buffer[1024];

    char* queryStart = "<query>";
    char* queryEnd = "</query>";
    char* commandStart = "<command>";
    char* commandEnd = "</command>";

    pc.baud(115200);

    while(1) {
        if (pc.readable()) {
            char currentChar = pc.getc(); // lire la currentSymbole par le STM envoyé par PC
            if (currentChar == '\n' || currentChar == '\r') {
                buffer[bufferCounter + 1] = 0;

                if (strncmp(buffer, queryStart, strlen(queryStart)) == 0) {
                    char* queryEndPos = strstr(buffer, queryEnd);
                    *queryEndPos = '\0';
                    getQueryResponse(buffer + strlen(queryStart));
                    memset(&buffer[0], 0, 1024);
                    bufferCounter = 0;
                }

                if (strncmp(buffer, commandStart, strlen(commandStart)) == 0) {
                    char* commandEndPos = strstr(buffer, commandEnd);
                    *commandEndPos = '\0';
                    executeCommand(buffer + strlen(commandStart));
                    memset(&buffer[0], 0, 1024);
                    bufferCounter = 0;
                }
            } else {
                buffer[bufferCounter] = currentChar;
                bufferCounter++;
                if (bufferCounter > 1024) {
                    memset(&buffer[0], 0, 1024);
                    bufferCounter = 0;
                }
                printf("%c", currentChar);
            }
        }
    }
}