This is a working HTTP server with I2C, GPIO and PWM commands accessible through URLs. It also includes the ability to serve files from an SD card.

Dependencies:   EthernetInterfaceMuri SDFileSystem mbed-rtos mbed

muri.cpp

Committer:
gsteiert
Date:
2013-12-06
Revision:
2:5c9ce3b50de6
Parent:
1:64f023138627

File content as of revision 2:5c9ce3b50de6:

#include "mbed.h"
#include "rtos.h"
#include "muri.h"

I2C i2c(p28, p27);
//PwmOut pwm1(p26);
PwmOut pwm(p25);
DigitalInOut pmd1(p14);
DigitalInOut pmd2(p11);
DigitalInOut pmd3(p12);
DigitalInOut pmd4(p13);
DigitalInOut pmd7(p24);
DigitalInOut pmd8(p23);
DigitalInOut pmd9(p22);
DigitalInOut pmd10(p21);

osTimerDef(poff, pwm_off);
osTimerId off_timer;

void init_dio()
{
    pmd1.mode(PullNone);
    pmd1.mode(OpenDrain);
    pmd1.write(1);
    pmd1.output();
    pmd2.mode(PullNone);
    pmd2.mode(OpenDrain);
    pmd2.write(1);
    pmd2.output();
    pmd3.mode(PullNone);
    pmd3.mode(OpenDrain);
    pmd3.write(1);
    pmd3.output();
    pmd4.mode(PullNone);
    pmd4.mode(OpenDrain);
    pmd4.write(1);
    pmd4.output();
    pmd7.mode(PullNone);
    pmd7.mode(OpenDrain);
    pmd7.write(1);
    pmd7.output();
    pmd8.mode(PullNone);
    pmd8.mode(OpenDrain);
    pmd8.write(1);
    pmd8.output();
    pmd9.mode(PullNone);
    pmd9.mode(OpenDrain);
    pmd9.write(1);
    pmd9.output();
    pmd10.mode(PullNone);
    pmd10.mode(OpenDrain);
    pmd10.write(1);
    pmd10.output();
    off_timer = osTimerCreate(osTimer(poff), osTimerOnce, NULL);
}

void cmd_i2c_write(char* qry, char* data, char* resp)
{
    int addr = 0;
    int dlen = 0;
    int dtmp = 0;
    if (sscanf(qry, "?%2x", &addr) == 1) {
        qry += 3;
        while (sscanf(qry, "&%2x", &dtmp) == 1) {
            data[dlen] = dtmp;
            qry +=3;
            dlen +=1;
        }
    } else {
        dlen = -1;
    }
    if (dlen > 0 ) {
        i2c.write(addr, data, dlen);
        sprintf(resp,"200 %d\r\n", dlen);
    } else {
        if (dlen == 0) {
            sprintf(resp,"204 No data to write: %s\r\n", qry);
        } else {
            sprintf(resp,"400 Invalid parameters: %s\r\n", qry);

        }
    }
}

void cmd_i2c_read(char* qry, char* data, char* resp)
{
    int addr = 0;
    int dlen = 0;
    int dcnt = 0;
    if (sscanf(qry, "?%2x", &addr) == 1) {
        qry += 3;
        if (sscanf(qry, "&%2x", &dlen) == 1) {
            if (i2c.read(addr, data, dlen)!=0) {
                dlen = -1;
                sprintf(resp, "500 I2C read failed\r\n");
            }
        } else {
            sprintf(resp, "400 Invalid data length: %s\r\n", qry);
        }
    } else {
        dlen = -1;
        sprintf(resp, "400 Invalid address: %s\r\n", qry);
    }
    if (dlen > 0) {
        sprintf(resp,"200");
        resp += 3;
        for (dcnt = 0; dcnt < dlen; dcnt++) {
            sprintf(resp," %02x", data[dcnt]);
            resp +=3;
        }
    }
}

void cmd_i2c_addr_read(char* qry, char* data, char* resp)
{
    int addr = 0;
    int radd = 0;
    int dlen = 0;
    int dcnt = 0;
    if (sscanf(qry, "?%2x", &addr) == 1) {
        qry += 3;
        if (sscanf(qry, "&%2x", &radd) == 1) {
            qry += 3;
            if (sscanf(qry, "&%2x", &dlen) == 1) {
                data[0] = radd;
                i2c.write(addr, data, 1, false);
                if (i2c.read(addr, data, dlen)!=0) {
                    dlen = -1;
                    sprintf(resp, "500 I2C read failed\r\n");
                }
            } else {
                sprintf(resp, "400 Invalid data length: %s\r\n", qry);
            }
        } else {
            dlen = -1;
            sprintf(resp, "400 Invalid register address: %s\r\n", qry);
        }
    } else {
        dlen = -1;
        sprintf(resp, "400 Invalid address: %s\r\n", qry);
    }
    if (dlen > 0) {
        sprintf(resp,"200");
        resp += 3;
        for (dcnt = 0; dcnt < dlen; dcnt++) {
            sprintf(resp," %02x", data[dcnt]);
            resp +=3;
        }
    }
}

void cmd_pmd_setio(char* qry, char* data, char* resp)
{
    int pdir = -1;
    int pdata = -1;
    if (sscanf(qry, "?%2x", &pdir) == 1) {
        if (pdir == 0) {
            pmd1.mode(PullNone);
            pmd2.mode(PullNone);
            pmd3.mode(PullNone);
            pmd4.mode(PullNone);
            pmd7.mode(PullNone);
            pmd8.mode(PullNone);
            pmd9.mode(PullNone);
            pmd10.mode(PullNone);
        } else {
            if (sscanf(qry+3, "&%2x", &pdata) == 1) {
                if (pdir & (1 << 0)) {
                    if (pdata & (1 << 0)) pmd1.mode(PullUp);
                    else pmd1.mode(PullDown);
                }  else {
                    pmd1.mode(PullNone);
                }
                if (pdir & (1 << 1)) {
                    if (pdata & (1 << 1)) pmd2.mode(PullUp);
                    else pmd2.mode(PullDown);
                }  else {
                    pmd2.mode(PullNone);
                }
                if (pdir & (1 << 2)) {
                    if (pdata & (1 << 2)) pmd3.mode(PullUp);
                    else pmd3.mode(PullDown);
                }  else {
                    pmd3.mode(PullNone);
                }
                if (pdir & (1 << 3)) {
                    if (pdata & (1 << 3)) pmd4.mode(PullUp);
                    else pmd4.mode(PullDown);
                }  else {
                    pmd4.mode(PullNone);
                }
                if (pdir & (1 << 4)) {
                    if (pdata & (1 << 4)) pmd7.mode(PullUp);
                    else pmd7.mode(PullDown);
                }  else {
                    pmd7.mode(PullNone);
                }
                if (pdir & (1 << 5)) {
                    if (pdata & (1 << 5)) pmd8.mode(PullUp);
                    else pmd8.mode(PullDown);
                }  else {
                    pmd8.mode(PullNone);
                }
                if (pdir & (1 << 6)) {
                    if (pdata & (1 << 6)) pmd9.mode(PullUp);
                    else pmd9.mode(PullDown);
                }  else {
                    pmd9.mode(PullNone);
                }
                if (pdir & (1 << 7)) {
                    if (pdata & (1 << 7)) pmd10.mode(PullUp);
                    else pmd10.mode(PullDown);
                }  else {
                    pmd10.mode(PullNone);
                }
            }
        }

        pdata = 0;
        pdata += (pmd1 << 0);
        pdata += (pmd2 << 1);
        pdata += (pmd3 << 2);
        pdata += (pmd4 << 3);
        pdata += (pmd7 << 4);
        pdata += (pmd8 << 5);
        pdata += (pmd9 << 6);
        pdata += (pmd10 << 7);
        sprintf(resp,"200 %02x", pdata);
    } else {
        sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
    }
}

void cmd_pmd_write(char* qry, char* data, char* resp)
{
    int pdata = -1;
    if (sscanf(qry, "?%2x", &pdata) == 1) {
        pmd1 = pdata & (1 << 0);
        pmd2 = pdata & (1 << 1);
        pmd3 = pdata & (1 << 2);
        pmd4 = pdata & (1 << 3);
        pmd7 = pdata & (1 << 4);
        pmd8 = pdata & (1 << 5);
        pmd9 = pdata & (1 << 6);
        pmd10 = pdata & (1 << 7);
        pdata = 0;
        pdata += (pmd1 << 0);
        pdata += (pmd2 << 1);
        pdata += (pmd3 << 2);
        pdata += (pmd4 << 3);
        pdata += (pmd7 << 4);
        pdata += (pmd8 << 5);
        pdata += (pmd9 << 6);
        pdata += (pmd10 << 7);
        sprintf(resp,"200 %02x", pdata);
    } else {
        sprintf(resp,"400 Invalid parameters: %s\r\n", qry);

    }
}

void cmd_pmd_read(char* qry, char* data, char* resp)
{
    int pdata = 0;
    pdata += (pmd1 << 0);
    pdata += (pmd2 << 1);
    pdata += (pmd3 << 2);
    pdata += (pmd4 << 3);
    pdata += (pmd7 << 4);
    pdata += (pmd8 << 5);
    pdata += (pmd9 << 6);
    pdata += (pmd10 << 7);
    sprintf(resp,"200 %02x", pdata);
}

void pwm_off(void const *arg)
{
//        pwm.period_us(0);
    pwm.pulsewidth_us(0);
}

void cmd_pwm_set(char* qry, char* data, char* resp)
{
    int pwmP = 0;
    int pwmW = 0;
    int pwmD = 0;
    if (sscanf(qry, "?%4x&%4x&%4x", &pwmP, &pwmW, &pwmD) == 3) {
        pwm.period_us(pwmP);
        pwm.pulsewidth_us(pwmW);
        osTimerStart(off_timer, pwmD);
        sprintf(resp,"200 %04x %04x %04x", pwmP, pwmW, pwmD);
    } else {
        sprintf(resp,"400 Invalid parameters: %s\r\n", qry);

    }
}

void muri(char* uri, char* data, char* resp)
{
//    sprintf(resp, "501 %s", uri);
//}
//void get_cgi(char* uri, char* qry)
//{
    char *qry;
    printf("muri uri:  %s\n", uri);
    qry = strstr(uri, "?");
    if (!strncmp(uri, "i2cw?", 5)) { // i2cw [addr] [data] [data] [data] ...
        cmd_i2c_write(qry, data, resp);
    } else if (!strncmp(uri, "i2cr?", 5)) { // i2cr [addr] [count]
        cmd_i2c_read(qry, data, resp);
    } else if (!strncmp(uri, "i2car?", 6)) { // i2car [addr] [radd] [count]
        cmd_i2c_addr_read(qry, data, resp);
    } else if (!strncmp(uri, "pmdio?", 6)) { // pmdio [dir] [data]
        cmd_pmd_setio(qry, data, resp);
    } else if (!strncmp(uri, "pmdw?", 5)) { // pmdw [data]
        cmd_pmd_write(qry, data, resp);
    } else if (!strncmp(uri, "pmdr", 4)) { // pmdr
        cmd_pmd_read(qry, data, resp);
    } else if (!strncmp(uri, "pwmd?", 5)) { // pwmd [period] [width] [duration]
        cmd_pwm_set(qry, data, resp);
    } else {
        sprintf(resp, "501 %s", uri);
    }
    printf("muri resp:  %s\n", resp);
}