stackable sakura.io board for patlite

Dependencies:   SakuraIO mbed

main.cpp

Committer:
misodengaku
Date:
2017-08-09
Revision:
0:a277e27599ee
Child:
1:36220c7411e9

File content as of revision 0:a277e27599ee:

#include "mbed.h"
#include "SakuraIO.h"

#define SEND_INTERVAL 5

DigitalOut status_led(PA_15);

DigitalOut patlite_1(PA_0); // Clear
DigitalOut patlite_2(PA_1); // Blue
DigitalOut patlite_3(PA_2); // Green
DigitalOut patlite_4(PA_3); // Yellow
DigitalOut patlite_5(PA_4); // Red

DigitalIn patlite_state_1(PA_12);
DigitalIn patlite_state_2(PA_8);
DigitalIn patlite_state_3(PA_7);
DigitalIn patlite_state_4(PA_6);
DigitalIn patlite_state_5(PA_5);

DigitalOut patlite_out[5] = {patlite_1, patlite_2, patlite_4, patlite_5, patlite_3};
// DigitalOut patlite_out[5] = {patlite_1, patlite_3, patlite_4, patlite_2, patlite_5};
DigitalIn patlite_state[5] = {patlite_state_1, patlite_state_2, patlite_state_4, patlite_state_5, patlite_state_3};

I2C i2c(PB_7, PB_6); // sda, scl
uint64_t counter = 0;
uint32_t iine_count = 0;
uint8_t blink_flag = 0;
uint8_t changed = 0;

uint8_t last_state[5] = {0};

//SakuraIO_SPI sakuraio(spi, cs);
SakuraIO_I2C sakuraio(i2c);

Ticker tick;

void timer()
{
    uint8_t state[5];
    __disable_irq();
    for (int i = 0; i < 5; i++)
    {
        state[i] = !patlite_state[i];
    }

    for (int i = 0; i < 5; i++)
    {
        if (last_state[i] != state[i])
        {
            changed = 1;
            //sakuraio.enqueueTx(i, state[i]);
            status_led = !status_led;
            last_state[i] = state[i];
        }
    }
    __enable_irq();
}

int main()
{
    for (int i = 0; i < 5; i++)
    {
        patlite_state[i].mode(PullUp);
    }

    // Waiting to come online
    int a = 0;
    for (;;)
    {
        status_led = 1;
        patlite_out[a] = 1;

        if ((sakuraio.getConnectionStatus() & 0x80) == 0x80)
            break;
        wait_ms(500);
        status_led = 0;
        patlite_out[a] = 0;
        a++;
        if (a == 5)
            a = 0;
        wait_ms(500);
    }
    status_led = 1;
    for (int i = 0; i < 5; i++)
        patlite_out[i] = 1;

    wait(1);
    status_led = 0;
    for (int i = 0; i < 5; i++)
        patlite_out[i] = 0;

    // tick.attach_us(&timer, 100 * 1000); // 100ms

    while (1)
    {
        timer();

        uint8_t avail = 0;
        uint8_t queued = 0;

        __disable_irq();
        sakuraio.getRxQueueLength(&avail, &queued);
        for (uint8_t i = 0; i < queued; i++)
        {
            uint8_t channel;
            uint8_t type;
            uint8_t values[8];
            int64_t offset;

            // RXキューから点灯要求を取り出す
            uint8_t ret = sakuraio.dequeueRx(&channel, &type, values, &offset);
            if (ret == 0x01)
            {
                if (channel >= 0 && channel < 5)
                {
                    if (*((int32_t *)values) == 0)
                        patlite_out[channel] = 0;
                    else
                        patlite_out[channel] = 1;
                }
                changed = 1;
            }
        }

        avail = 0;
        queued = 0;
        sakuraio.getTxQueueLength(&avail, &queued);
        if (changed == 1)
        {
            uint8_t state[5];
            for (int i = 0; i < 5; i++)
            {
                state[i] = !patlite_state[i];
            }

            for (int i = 0; i < 5; i++)
            {
                sakuraio.enqueueTx(i, state[i]);
            }
            sakuraio.send();
            changed = 0;
        }
        __enable_irq();

        /*
        sakuraio.clearTx();
        sakuraio.enqueueTx(0, counter);
        sakuraio.enqueueTx(1, iine_count);
        sakuraio.send();
        */

//        wait_ms(10);
    }
}