Frame Level Language for controlling DUALSHOCK2

Dependents:   koibumi2000

fll.h

Committer:
amutake
Date:
2015-02-19
Revision:
1:905fe1a0ca5a
Parent:
0:a436e2063a3d

File content as of revision 1:905fe1a0ca5a:

// Frame Level Language
// interface

#pragma once

#include "mbed.h"
#include "rtos.h"
#include <stdint.h>

#define MAIL_BOX_SIZE 16

#define FRAME (1.0 / 59.94) // 1 frame (sec)

#define R1       0x0001
#define TRIANGLE 0x0002
#define CIRCLE   0x0004
#define CROSS    0x0008
#define SQUARE   0x0010
#define R2       0x0020
#define START    0x0040
#define ANALOG   0x0080
#define SELECT   0x0100
#define L2       0x0200
#define UP       0x0400
#define DOWN     0x0800
#define LEFT     0x1000
#define RIGHT    0x2000
#define L1       0x4000
#define BUTTON_NUM   15

typedef uint16_t button_t;

// Base object for stream network
class Producer
{
public:
    virtual button_t await() = 0;
    virtual bool is_finished() = 0;
    virtual void reset() = 0;
};

// Sink is the end of button stream network
// It sends next button to Output object through rtos::Mail
class Sink
{
private:
    Producer* source;
    rtos::Mail<button_t, MAIL_BOX_SIZE>* mail_box;
    Mutex* mutex;
    button_t temporary[MAIL_BOX_SIZE];
    int temporary_size;
    bool paused;
public:
    Sink(Producer* src, rtos::Mail<button_t, MAIL_BOX_SIZE>* box, Mutex* mut);
    void run();
    void resume();
    void pause();
    void restart(); // reset source
    void reset(Producer* src); // reset with new source
};

class FLL
{
public:
    FLL(Producer* p);
    ~FLL();
    void press(button_t btn);
    void run();
private:
    Producer *producer;
    DigitalOut* pin[BUTTON_NUM];
    int off[BUTTON_NUM];
};

// Output reads the next button from mail box and press the button
// It must be run per 1/60 sec
class Output
{
private:
    rtos::Mail<button_t, MAIL_BOX_SIZE>* mail_box;
    FLL *fll;
public:
    Output(rtos::Mail<button_t, MAIL_BOX_SIZE>* box, FLL *f);
    void run();
};