MBED implementation of JAudioStream

JAudioStream.cpp

Committer:
ollie8
Date:
2015-08-12
Revision:
0:6f03883f9b43
Child:
1:b49a6e72f353

File content as of revision 0:6f03883f9b43:

#include "JAudioStream.h"

const char cont[] = {'c','o','n','t'};
const char cond[] = {'c','o','n','d'};
const char dcon[] = {'d','c','o','n'};
const char rqst[] = {'r','q','s','t'};
const char begn[] = {'b','e','g','n'};
const char comt[] = {'c','o','m','t'};

JAudioStream::JAudioStream() {
    connected = false;
    inTransmission = false;
}

void JAudioStream::onUDPSocketEvent(UDPSocketEvent e) {

}

void JAudioStream::begin(char* mac, char* ip, short port) {
    EthernetErr ethErr = eth.setup();
    if (ethErr) {
        // do something
    }
    Host me(IpAddr(), PORT);
    udp.setOnEvent(this, &JAudioStream::onUDPSocketEvent);
    udp.bind(me);
}

bool JAudioStream::connect(char* ip, short port, char* name) {
    remotePort = port;
    remoteIp = ip;
    char size = MESSAGE_SIZE*2;
    char message[size];
    buildMeassge(cont, REQUEST_RESPONSE_MODE, name, message);
    send(message, size);
    char resp[MAX_PACKT];
    if (read(resp, MAX_PACKT, 500)) {
        if (memcmp(resp, cond, 4) == 0) {
            connected = true;
        }
    }
    return connected;
}

bool JAudioStream::read(char *buffer, short amount, short timeOut) {
    Timer t;
    t.start();
    short to = t.read()+timeOut;
    bool result = false;
    while (1) {
        int packetSize = Udp.available();
        if (packetSize) {
            Udp.readPacket(buffer, MAX_PACKT);
            result = true;
            break;
          }
        int c = t.read();
        if (to < c) {
            break;
        }
    }
    t.stop();
    return result;
}

bool JAudioStream::available() {
    if (inTransmission) {
        return true;
    } else {
        char resp[MAX_PACKT];
        if (read(resp, MAX_PACKT, 500)) {
            if (memcmp(resp, begn, 4) == 0) {
                memmove(&nowPlaying[0], &resp[4], 20);
                inTransmission = true;
                return true;
            }
        }
    }
    return false;
}

bool JAudioStream::isConnected() {
    return connected;
}

void JAudioStream::request(char amount) {
    char message[MESSAGE_SIZE];
    buildMeassge(rqst, amount, message);
    send(message, MESSAGE_SIZE);
}

void JAudioStream::disconnect() {
    char message[MESSAGE_SIZE];
    buildMeassge(dcon, -1, message);
    send(message, MESSAGE_SIZE);
}

void JAudioStream::buildMeassge(const char* cmd, char param, char* message) {
    char i;
    for(i=0; i<MESSAGE_COMP_SIZE; i++) {
            message[i] = cmd[i];
    }
    char bParam[MESSAGE_COMP_SIZE];
    intTocharArr(param, bParam);
    for(i=MESSAGE_COMP_SIZE; i<MESSAGE_SIZE; i++) {
            message[i] = bParam[i-MESSAGE_COMP_SIZE];
    }
}

void JAudioStream::buildMeassge(const char* cmd, char param, char* data, char* message) {
    char i;
    for(i=0; i<MESSAGE_COMP_SIZE; i++) {
            message[i] = cmd[i];
    }
    char bParam[MESSAGE_COMP_SIZE];
    intTocharArr(param, bParam);
    for(i=MESSAGE_COMP_SIZE; i<MESSAGE_SIZE; i++) {
            message[i] = bParam[i-MESSAGE_COMP_SIZE];
    }
    char dataSize = MESSAGE_SIZE*2;
    for(i=MESSAGE_SIZE; i<dataSize; i++) {
        message[i] = data[i-MESSAGE_SIZE];
    }
}

void JAudioStream::intTocharArr(char value, char* buff) {
    buff[0] = (value >> 24) & 0xFF;
    buff[1] = (value >> 16) & 0xFF;
    buff[2] = (value >> 8) & 0xFF;
    buff[3] = value;
}

void JAudioStream::send(char* data, short len) {
    udp.sendPacket(data, len, remoteIp, remotePort);
}

char* JAudioStream::getNowPlaying() {
    return nowPlaying;
}