Library which creates a serial test console, it supports pages and menu items. The items are added and the pages are added as necessary when the user sets it up. This is a great too for creating an easy to maintain menu system, whether for a test sytem, or anything else.

Dependencies:   Terminal

menuitem.h

Committer:
glansberry
Date:
2015-07-24
Revision:
9:b1fdd7ea6f72
Parent:
8:170f8c0bb5ee

File content as of revision 9:b1fdd7ea6f72:

#ifndef __MENUITEM_H
#define __MENUITEM_H

#include "Terminal.h"

extern Terminal term;

typedef enum {menu, heading, display, control} MenuType;
typedef char * (*callback_function)(bool); // type for conciseness

#define MAX_NAME_LEN (80-10-10)
#define MAKE_PORT(x, io) (new Menu##io(#x, io(x)))  //use this macro to create a port (it saves name as well as creatign the IO
#define REUSE_PORT(x, io, port) (new Menu##io(#x, port))  //use this macro if you created the port externally

class MenuAction;
class Page;

class MenuItem {
public:
    MenuItem();
    MenuItem(const char * name_p, MenuAction *action_p, int level, MenuType type_p, int target_page = -1);
    MenuItem(Page &target_page_p);  //construct a menu selection item this way
    const char *name;   //reference to the name 
    int level;      //0 if primary 1 or greater if this is a sub-menu
    MenuType type;  //are we displaying something or controlling something
    
    MenuAction *action; //callback for getting/setting the data
    
    int name_len;
    
    int data_col;   //column where the data is shown
    int target_page;  //the page to go to if called
};

class MenuAction {
public:
    MenuAction(char const *name):
        m_name(name)
    {}
    
    char const *getName() {
        return m_name;
    }
    
    virtual void getString(char *buf, int bufLen) {
        if(buf && bufLen > 0) {
            buf[0] = '\0';
        }
    }
    virtual void doAction() {}
    
private:
    char const *m_name;
};


class MenuDigitalIn: public MenuAction {
public:
    MenuDigitalIn(char const *name, DigitalIn const & myIO):
        MenuAction(name),
        m_io(myIO)
    {}
    
    virtual void getString(char *buf, int bufLen) {
        snprintf(buf, bufLen, "%d", int(m_io));
    }
private:
    DigitalIn m_io;
};

class MenuDigitalOut: public MenuAction {
public:
    MenuDigitalOut(char const *name, DigitalOut const & myIO):
        MenuAction(name),
        m_io(myIO)
    {}
    
    virtual void getString(char *buf, int bufLen) {
        snprintf(buf, bufLen, "%d", int(m_io));
    }
    virtual void doAction() {
        m_io = !m_io;
    }
private:
    DigitalOut m_io;
};

class MenuAnalogIn: public MenuAction {
public:
    MenuAnalogIn(char const *name, AnalogIn const & myIO):
        MenuAction(name),
        m_io(myIO)
    {}
    
    virtual void getString(char *buf, int bufLen) {
        snprintf(buf, bufLen, "%f", m_io.read());
    }

private:
    AnalogIn m_io;
};


class MenuNotImplementedAction:public MenuAction {
public:
    MenuNotImplementedAction(char const *name):  MenuAction(name)
    {}
    
    virtual void getString(char *buf, int bufLen) {
        snprintf(buf, bufLen, "N/A");
    }
};

class MenuTestAction: public MenuAction {
public:
    MenuTestAction(char const *name):
        MenuAction(name),
        m_value(false)
    {}
    
    virtual void getString(char *buf, int bufLen) {
        snprintf(buf, bufLen, "%d", int(m_value));
    }
    virtual void doAction() {
        m_value = !m_value;
    }
    
private:
    bool m_value;
};


#endif