Tamagotchi

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

main.cpp

Committer:
alansong95
Date:
2017-03-13
Revision:
0:f2c4b70c6e2f

File content as of revision 0:f2c4b70c6e2f:

#include "mbed.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "rtos.h"
#define X 0x000000
#define _ 0xFFFFFF
#define MONSTER_HEIGHT 24
#define MONSTER_WIDTH 33

uLCD_4DGL uLCD(p28, p27, p26);
SDFileSystem sd(p5, p6, p7, p8, "sd");
AnalogOut DACout(p18);
wave_player waver(&DACout);
FILE *fp;
FILE *wave_file;
int menu_state;
bool arrow_state;
bool light_state; // 0: on 1: off
int info_state;

class Nav_Switch
{
public:
    Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
    int read();
//boolean functions to test each switch
    bool up();
    bool down();
    bool left();
    bool right();
    bool fire();
//automatic read on RHS
    operator int ();
//index to any switch array style
    bool operator[](int index) {
        return _pins[index];
    };
private:
    BusIn _pins;
 
};
Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
    _pins(up, down, left, right, fire)
{
    _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
    wait(0.001); //delays just a bit for pullups to pull inputs high
}
inline bool Nav_Switch::up()
{
    return !(_pins[0]);
}
inline bool Nav_Switch::down()
{
    return !(_pins[1]);
}
inline bool Nav_Switch::left()
{
    return !(_pins[2]);
}
inline bool Nav_Switch::right()
{
    return !(_pins[3]);
}
inline bool Nav_Switch::fire()
{
    return !(_pins[4]);
}
inline int Nav_Switch::read()
{
    return _pins.read();
}
inline Nav_Switch::operator int ()
{
    return _pins.read();
}
 
Nav_Switch myNav( p12, p15, p14, p16, p13);

// draw start

int FOOD[22*17]={
    _,_,_,_,_,_,_,X,X,X,X,X,X,X,X,_,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,_,_,_,_,_,_,X,X,_,_,_,_,_,_,
    _,_,_,_,_,X,X,_,_,_,_,_,_,_,_,X,X,_,_,_,_,_,
    _,_,_,_,X,X,_,_,_,_,_,_,_,_,_,_,X,X,_,_,_,_,
    _,_,_,X,X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,_,_,_,
    _,_,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,_,_,
    _,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,_,
    X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    _,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,
    _,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,
};

int FOOD2[22*6]={
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    X,X,_,_,_,_,X,X,X,X,X,X,X,X,X,X,_,_,_,_,X,X,
    _,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,
    _,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,
};

int MED[16*16]={
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,X,X,X,X,X,X,X,X,X,X,_,X,X,
    X,X,_,X,X,X,X,X,X,X,X,X,X,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
};

int MED2[16*8]={
    X,X,_,X,X,X,X,X,X,X,X,X,X,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,X,X,_,_,_,_,_,X,X,
    X,X,_,_,_,_,_,_,_,_,_,_,_,_,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
};


int POOP[8*11]={
    _,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,X,_,_,_,_,_,
    _,_,_,_,_,X,X,_,_,_,_,
    _,_,_,_,X,X,X,X,_,_,_,
    _,_,_,X,X,X,_,X,_,_,_,
    _,_,X,X,X,X,X,_,X,_,_,
    _,X,X,X,X,X,X,X,X,X,_,
};

int MONSTER1_1[MONSTER_HEIGHT * MONSTER_WIDTH]={
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    X,X,X,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    X,X,X,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,
    X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,
    X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
};

int MONSTER1_2[MONSTER_HEIGHT * MONSTER_WIDTH]={
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,X,X,X,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    _,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,
    _,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,
    _,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
};


int MONSTER1_MAD1[MONSTER_HEIGHT * MONSTER_WIDTH]={
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,X,X,_,_,_,_,_,_,
    X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,X,_,_,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    _,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,
    _,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,
    _,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,
};





int MONSTER1_SICK1[MONSTER_HEIGHT * MONSTER_WIDTH]={
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,
    _,_,_,X,X,X,X,X,_,X,_,X,_,X,X,X,X,X,X,X,_,X,_,X,_,X,X,X,X,X,_,_,_,
    _,_,_,X,X,X,X,X,_,_,X,_,_,X,X,X,X,X,X,X,_,_,X,_,_,X,X,X,X,X,_,_,_,
    _,_,_,X,X,X,X,X,_,X,_,X,_,X,X,X,X,X,X,X,_,X,_,X,_,X,X,X,X,X,_,_,_,
    X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,X,X,X,_,_,_,X,X,X,X,X,X,_,_,_,_,_,_,_,_,_,
};

int MONSTER1_SLEEP1[MONSTER_HEIGHT * MONSTER_WIDTH]={
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,X,X,X,_,X,X,X,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,_,_,_,X,_,_,_,X,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,X,X,X,_,X,X,X,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,X,X,X,_,_,_,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,_,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,_,_,_,
    _,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,X,X,X,X,X,X,X,_,_,_,
    _,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,
    _,_,_,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,_,_,_,
    X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
};

void drawMenu1(int color) {
    uLCD.line(12, 6, 13, 6, color);
    uLCD.line(24, 6, 25, 6, color);
    uLCD.line(13, 7, 14, 7, color);
    uLCD.line(23, 7, 25, 7, color);
    uLCD.line(10, 8, 11, 8, color);
    uLCD.line(14, 8, 15, 8, color);
    uLCD.line(22, 8, 25, 8, color);
    uLCD.line(8, 9, 9, 9, color);
    uLCD.line(11, 9, 13, 9, color);
    uLCD.line(15, 9, 16, 9, color);
    uLCD.line(21, 9, 25, 9, color);
    uLCD.line(9, 10, 10, 10, color);
    uLCD.line(12, 10, 14, 10, color);
    uLCD.line(15, 10, 16, 10, color);
    uLCD.line(20, 10, 25, 10, color);
    uLCD.line(10, 11, 11, 11, color);
    uLCD.line(13, 11, 16, 11, color);
    uLCD.line(19, 11, 24, 11, color);
    uLCD.line(11, 12, 16, 12, color);
    uLCD.line(18, 12, 23, 12, color);
    uLCD.line(12, 13, 15, 13, color);
    uLCD.line(17, 13, 22, 13, color);
    uLCD.line(16, 14, 21, 14, color);
    uLCD.line(15, 15, 18, 15, color);
    uLCD.line(14, 16, 17, 16, color);
    uLCD.line(19, 16, 21, 16, color);
    uLCD.line(13, 17, 16, 17, color);
    uLCD.line(18, 17, 22, 17, color);
    uLCD.line(11, 18, 15, 18, color);
    uLCD.line(19, 18, 23, 18, color);
    uLCD.line(11, 19, 14, 19, color);
    uLCD.line(20, 19, 24, 19, color);
    uLCD.line(9, 20, 13, 20, color);
    uLCD.line(21, 20, 25, 20, color);
    uLCD.line(10, 21, 12, 21, color);
    uLCD.line(22, 21, 25, 21, color);
}

void drawMenu2(int color) {
    uLCD.line(44, 5, 45, 5, color);
    uLCD.line(53, 5, 54, 5, color);
    uLCD.line(45, 6, 46, 6, color);
    uLCD.line(52, 6, 53, 6, color);
    uLCD.line(45, 7, 46, 7, color);
    uLCD.line(52, 7, 53, 7, color);
    uLCD.line(47, 8, 51, 8, color);
    uLCD.line(42, 9, 43, 9, color);
    uLCD.line(45, 9, 50, 9, color);
    uLCD.line(51, 9, 53, 9, color);
    uLCD.line(55, 9, 56, 9, color);
    uLCD.line(45, 10, 51, 10, color);
    uLCD.line(52, 10, 53, 10, color);
    uLCD.line(44, 11, 52, 11, color);
    uLCD.line(53, 11, 54, 11, color);
    uLCD.line(44, 12, 52, 12, color);
    uLCD.line(53, 12, 54, 12, color);
    uLCD.line(40, 13, 43, 13, color);
    uLCD.line(44, 13, 54, 13, color);
    uLCD.line(55, 13, 58, 13, color);
    uLCD.line(44, 14, 54, 14, color);
    uLCD.line(45, 15, 53, 15, color);
    uLCD.line(43, 16, 44, 16, color);
    uLCD.line(45, 16, 53, 16, color);
    uLCD.line(54, 16, 55, 16, color);
    uLCD.line(41, 17, 42, 17, color);
    uLCD.line(46, 17, 52, 17, color);
    uLCD.line(56, 17, 57, 17, color);
    uLCD.line(46, 18, 52, 18, color);
    uLCD.line(47, 19, 51, 19, color);
    uLCD.line(47, 21, 51, 21, color);
    uLCD.line(47, 22, 51, 22, color);
}

void drawMenu3(int color) {
    uLCD.line(73, 4, 74, 4, color);
    uLCD.line(72, 5, 76, 5, color);
    uLCD.line(71, 6, 77, 6, color);
    uLCD.line(71, 7, 78, 7, color);
    uLCD.line(72, 8, 79, 8, color);
    uLCD.line(73, 9, 79, 9, color);
    uLCD.line(74, 10, 80, 10, color);
    uLCD.line(75, 11, 81, 11, color);
    uLCD.line(76, 12, 82, 12, color);
    uLCD.line(77, 13, 83, 13, color);
    uLCD.line(79, 14, 83, 14, color);
    uLCD.line(80, 15, 84, 15, color);
    uLCD.line(82, 16, 85, 16, color);
    uLCD.line(83, 17, 86, 17, color);
    uLCD.line(84, 18, 86, 18, color);
    uLCD.line(85, 19, 87, 19, color);
    uLCD.line(74, 20, 76, 20, color);
    uLCD.line(86, 20, 88, 20, color);
    uLCD.line(73, 21, 76, 21, color);
    uLCD.line(87, 21, 89, 21, color);
    uLCD.line(73, 22, 76, 22, color);
    uLCD.line(88, 22, 90, 22, color);
}

void drawMenu4(int color) {
    uLCD.line(106, 4, 110, 4, color);
    uLCD.line(104, 5, 106, 5, color);
    uLCD.line(110, 5, 112, 5, color);
    uLCD.line(104, 6, 105, 6, color);
    uLCD.line(111, 6, 113, 6, color);
    uLCD.line(103, 7, 104, 7, color);
    uLCD.line(112, 7, 114, 7, color);
    uLCD.line(103, 8, 104, 8, color);
    uLCD.line(113, 8, 115, 8, color);
    uLCD.line(103, 9, 104, 9, color);
    uLCD.line(114, 9, 116, 9, color);
    uLCD.line(103, 10, 104, 10, color);
    uLCD.line(115, 10, 117, 10, color);
    uLCD.line(104, 11, 105, 11, color);
    uLCD.line(116, 11, 118, 11, color);
    uLCD.line(104, 12, 106, 12, color);
    uLCD.line(115, 12, 119, 12, color);
    uLCD.line(105, 13, 107, 13, color);
    uLCD.line(114, 13, 120, 13, color);
    uLCD.line(106, 14, 108, 14, color);
    uLCD.line(113, 14, 121, 14, color);
    uLCD.line(107, 15, 109, 15, color);
    uLCD.line(112, 15, 122, 15, color);
    uLCD.line(108, 16, 109, 16, color);
    uLCD.line(111, 16, 122, 16, color);
    uLCD.line(109, 17, 122, 17, color);
    uLCD.line(110, 18, 122, 18, color);
    uLCD.line(111, 19, 122, 19, color);
    uLCD.line(112, 20, 122, 20, color);
    uLCD.line(113, 21, 122, 21, color);
    uLCD.line(114, 22, 121, 22, color);
}

void drawMenu5(int color) {
    uLCD.line(20, 107, 24, 107, color);
    uLCD.line(19, 108, 25, 108, color);
    uLCD.line(18, 109, 25, 109, color);
    uLCD.line(18, 110, 25, 110, color);
    uLCD.line(17, 111, 25, 111, color);
    uLCD.line(17, 112, 24, 112, color);
    uLCD.line(17, 113, 24, 113, color);
    uLCD.line(18, 114, 23, 114, color);
    uLCD.line(11, 115, 18, 115, color);
    uLCD.line(21, 115, 22, 115, color);
    uLCD.line(10, 116, 11, 116, color);
    uLCD.line(18, 116, 21, 116, color);
    uLCD.line(9, 117, 11, 117, color);
    uLCD.line(17, 117, 21, 117, color);
    uLCD.line(11, 118, 21, 118, color);
    uLCD.line(10, 119, 11, 119, color);
    uLCD.line(16, 119, 20, 119, color);
    uLCD.line(11, 120, 20, 120, color);
    uLCD.line(12, 121, 19, 121, color);
    uLCD.line(12, 122, 13, 122, color);
    uLCD.line(14, 122, 19, 122, color);
    uLCD.line(12, 123, 19, 123, color);
    uLCD.line(12, 124, 19, 124, color);
}

void drawMenu6(int color) {
    uLCD.line(46, 107, 50, 107, color);
    uLCD.line(46, 108, 51, 108, color);
    uLCD.line(45, 109, 51, 109, color);
    uLCD.line(46, 110, 51, 110, color);
    uLCD.line(48, 111, 49, 111, color);
    uLCD.line(46, 113, 53, 113, color);
    uLCD.line(46, 114, 53, 114, color);
    uLCD.line(46, 115, 51, 115, color);
    uLCD.line(46, 116, 51, 116, color);
    uLCD.line(46, 117, 51, 117, color);
    uLCD.line(46, 118, 51, 118, color);
    uLCD.line(46, 119, 51, 119, color);
    uLCD.line(46, 120, 51, 120, color);
    uLCD.line(46, 121, 51, 121, color);
    uLCD.line(46, 122, 51, 122, color);
    uLCD.line(44, 123, 53, 123, color);
    uLCD.line(44, 124, 53, 124, color);
}

void drawMenu7(int color) {
    uLCD.line(89, 108, 90, 108, color);
    uLCD.line(89, 109, 90, 109, color);
    uLCD.line(77, 110, 81, 110, color);
    uLCD.line(85, 110, 88, 110, color);
    uLCD.line(89, 110, 90, 110, color);
    uLCD.line(76, 111, 77, 111, color);
    uLCD.line(83, 111, 88, 111, color);
    uLCD.line(89, 111, 90, 111, color);
    uLCD.line(76, 112, 77, 112, color);
    uLCD.line(80, 112, 88, 112, color);
    uLCD.line(89, 112, 90, 112, color);
    uLCD.line(76, 113, 88, 113, color);
    uLCD.line(89, 113, 90, 113, color);
    uLCD.line(71, 114, 73, 114, color);
    uLCD.line(74, 114, 88, 114, color);
    uLCD.line(89, 114, 90, 114, color);
    uLCD.line(71, 115, 73, 115, color);
    uLCD.line(74, 115, 88, 115, color);
    uLCD.line(89, 115, 90, 115, color);
    uLCD.line(71, 116, 73, 116, color);
    uLCD.line(74, 116, 88, 116, color);
    uLCD.line(89, 116, 90, 116, color);
    uLCD.line(71, 117, 73, 117, color);
    uLCD.line(74, 117, 88, 117, color);
    uLCD.line(89, 117, 90, 117, color);
    uLCD.line(72, 118, 73, 118, color);
    uLCD.line(75, 118, 88, 118, color);
    uLCD.line(89, 118, 90, 118, color);
    uLCD.line(78, 119, 88, 119, color);
    uLCD.line(89, 119, 90, 119, color);
    uLCD.line(81, 120, 88, 120, color);
    uLCD.line(89, 120, 90, 120, color);
    uLCD.line(85, 121, 88, 121, color);
    uLCD.line(89, 121, 90, 121, color);
    uLCD.line(89, 122, 90, 122, color);
    uLCD.line(89, 123, 90, 123, color);
}

void drawMenu8(int color) {
    uLCD.line(103, 108, 106, 108, color);
    uLCD.line(112, 108, 114, 108, color);
    uLCD.line(103, 109, 107, 109, color);
    uLCD.line(112, 109, 115, 109, color);
    uLCD.line(103, 110, 108, 110, color);
    uLCD.line(112, 110, 117, 110, color);
    uLCD.line(103, 111, 110, 111, color);
    uLCD.line(112, 111, 118, 111, color);
    uLCD.line(103, 112, 111, 112, color);
    uLCD.line(112, 112, 119, 112, color);
    uLCD.line(103, 113, 121, 113, color);
    uLCD.line(103, 114, 122, 114, color);
    uLCD.line(103, 115, 122, 115, color);
    uLCD.line(103, 116, 122, 116, color);
    uLCD.line(103, 117, 122, 117, color);
    uLCD.line(103, 118, 120, 118, color);
    uLCD.line(103, 119, 111, 119, color);
    uLCD.line(112, 119, 119, 119, color);
    uLCD.line(103, 120, 110, 120, color);
    uLCD.line(112, 120, 118, 120, color);
    uLCD.line(103, 121, 108, 121, color);
    uLCD.line(112, 121, 117, 121, color);
    uLCD.line(103, 122, 107, 122, color);
    uLCD.line(112, 122, 115, 122, color);
    uLCD.line(103, 123, 106, 123, color);
    uLCD.line(112, 123, 114, 123, color);
}

void drawUpperFrame() {
    uLCD.filled_rectangle(0, 0, 127, 25, GREEN);
}

void drawMiddleFrame() {
    uLCD.filled_rectangle(0, 26, 127, 127-25+1, WHITE);
}

void drawLowerFrame() {
    uLCD.filled_rectangle(0, 127-25, 127, 127, GREEN);
}

void drawUpperMenu() {
    drawMenu1(0xA0A0A0);
    drawMenu2(0xA0A0A0);
    drawMenu3(0xA0A0A0);
    drawMenu4(0xA0A0A0);
}

void drawLowerMenu() {
    drawMenu5(0xA0A0A0);
    drawMenu6(0xA0A0A0);
    drawMenu7(0xA0A0A0);
    drawMenu8(0xA0A0A0);
}

void drawBackground() {
    drawUpperFrame();
    drawMiddleFrame();
    drawLowerFrame();
    drawUpperMenu();
    drawLowerMenu();
}

void clearMiddle() {
    uLCD.filled_rectangle(0, 25, 127, 127-25+1, WHITE);
}

void turnOffLight() {
    uLCD.filled_rectangle(0, 25, 127, 127-25+1, BLACK);
}

void drawArrow1(int color) {
    uLCD.line(18, 39, 20, 39, color);
    uLCD.line(18, 40, 21, 40, color);
    uLCD.line(18, 41, 22, 41, color);
    uLCD.line(19, 42, 23, 42, color);
    uLCD.line(20, 43, 24, 43, color);
    uLCD.line(9, 44, 25, 44, color);
    uLCD.line(8, 45, 25, 45, color);
    uLCD.line(8, 46, 25, 46, color);
    uLCD.line(9, 47, 25, 47, color);
    uLCD.line(20, 48, 24, 48, color);
    uLCD.line(19, 49, 23, 49, color);
    uLCD.line(18, 50, 22, 50, color);
    uLCD.line(18, 51, 21, 51, color);
    uLCD.line(18, 52, 20, 52, color);
}

void drawArrow2(int color) {
    uLCD.line(18, 72, 20, 72, color);
    uLCD.line(18, 73, 21, 73, color);
    uLCD.line(18, 74, 22, 74, color);
    uLCD.line(19, 75, 23, 75, color);
    uLCD.line(20, 76, 24, 76, color);
    uLCD.line(9, 77, 25, 77, color);
    uLCD.line(8, 78, 25, 78, color);
    uLCD.line(8, 79, 25, 79, color);
    uLCD.line(9, 80, 25, 80, color);
    uLCD.line(20, 81, 24, 81, color);
    uLCD.line(19, 82, 23, 82, color);
    uLCD.line(18, 83, 22, 83, color);
    uLCD.line(18, 84, 21, 84, color);
    uLCD.line(18, 85, 20, 85, color);
}

void displayOption2() {
    clearMiddle();
    uLCD.text_width(4); // 4 times
    uLCD.text_height(4);
    
    uLCD.locate(1, 1);
    uLCD.printf("ON");
    uLCD.locate(1, 2);
    uLCD.printf("OFF");
    
    if (arrow_state == 0) {
        drawArrow2(WHITE);
        drawArrow1(BLACK);
    } else {
        drawArrow1(WHITE);
        drawArrow2(BLACK);
    }
}

void drawRock(int color, int x) {
    uLCD.line(33, 35+x, 34, 35+x, color);
uLCD.line(31, 36+x, 35, 36+x, color);
uLCD.line(31, 37+x, 35, 37+x, color);
uLCD.line(33, 38+x, 35, 38+x, color);
uLCD.line(28, 39+x, 32, 39+x, color);
uLCD.line(36, 39+x, 39, 39+x, color);
uLCD.line(27, 40+x, 34, 40+x, color);
uLCD.line(36, 40+x, 39, 40+x, color);
uLCD.line(26, 41+x, 35, 41+x, color);
uLCD.line(37, 41+x, 39, 41+x, color);
uLCD.line(25, 42+x, 31, 42+x, color);
uLCD.line(32, 42+x, 36, 42+x, color);
uLCD.line(24, 43+x, 30, 43+x, color);
uLCD.line(33, 43+x, 37, 43+x, color);
uLCD.line(39, 43+x, 41, 43+x, color);
uLCD.line(24, 44+x, 30, 44+x, color);
uLCD.line(34, 44+x, 37, 44+x, color);
uLCD.line(38, 44+x, 42, 44+x, color);
uLCD.line(24, 45+x, 30, 45+x, color);
uLCD.line(32, 45+x, 33, 45+x, color);
uLCD.line(38, 45+x, 42, 45+x, color);
uLCD.line(24, 46+x, 30, 46+x, color);
uLCD.line(36, 46+x, 40, 46+x, color);
uLCD.line(24, 47+x, 31, 47+x, color);
uLCD.line(32, 47+x, 33, 47+x, color);
uLCD.line(35, 47+x, 39, 47+x, color);
uLCD.line(24, 48+x, 30, 48+x, color);
uLCD.line(32, 48+x, 34, 48+x, color);
uLCD.line(35, 48+x, 38, 48+x, color);
uLCD.line(40, 48+x, 43, 48+x, color);
uLCD.line(23, 49+x, 30, 49+x, color);
uLCD.line(32, 49+x, 34, 49+x, color);
uLCD.line(39, 49+x, 43, 49+x, color);
uLCD.line(22, 50+x, 30, 50+x, color);
uLCD.line(31, 50+x, 35, 50+x, color);
uLCD.line(37, 50+x, 42, 50+x, color);
uLCD.line(21, 51+x, 29, 51+x, color);
uLCD.line(31, 51+x, 35, 51+x, color);
uLCD.line(37, 51+x, 41, 51+x, color);
uLCD.line(21, 52+x, 28, 52+x, color);
uLCD.line(30, 52+x, 36, 52+x, color);
uLCD.line(37, 52+x, 40, 52+x, color);
uLCD.line(22, 53+x, 36, 53+x, color);
uLCD.line(22, 54+x, 37, 54+x, color);
uLCD.line(23, 55+x, 38, 55+x, color);
uLCD.line(24, 56+x, 37, 56+x, color);
uLCD.line(24, 57+x, 35, 57+x, color);
uLCD.line(25, 58+x, 29, 58+x, color);
uLCD.line(27, 59+x, 28, 59+x, color);
}
void drawPaper(int color, int x) {
    uLCD.line(67, 35+x, 68, 35+x, color);
uLCD.line(66, 36+x, 69, 36+x, color);
uLCD.line(65, 37+x, 68, 37+x, color);
uLCD.line(71, 37+x, 73, 37+x, color);
uLCD.line(64, 38+x, 67, 38+x, color);
uLCD.line(70, 38+x, 73, 38+x, color);
uLCD.line(57, 39+x, 58, 39+x, color);
uLCD.line(64, 39+x, 67, 39+x, color);
uLCD.line(69, 39+x, 72, 39+x, color);
uLCD.line(56, 40+x, 58, 40+x, color);
uLCD.line(63, 40+x, 66, 40+x, color);
uLCD.line(68, 40+x, 71, 40+x, color);
uLCD.line(74, 40+x, 75, 40+x, color);
uLCD.line(55, 41+x, 59, 41+x, color);
uLCD.line(62, 41+x, 65, 41+x, color);
uLCD.line(67, 41+x, 70, 41+x, color);
uLCD.line(73, 41+x, 75, 41+x, color);
uLCD.line(55, 42+x, 58, 42+x, color);
uLCD.line(61, 42+x, 64, 42+x, color);
uLCD.line(66, 42+x, 69, 42+x, color);
uLCD.line(72, 42+x, 75, 42+x, color);
uLCD.line(54, 43+x, 58, 43+x, color);
uLCD.line(60, 43+x, 63, 43+x, color);
uLCD.line(65, 43+x, 68, 43+x, color);
uLCD.line(71, 43+x, 74, 43+x, color);
uLCD.line(54, 44+x, 57, 44+x, color);
uLCD.line(59, 44+x, 63, 44+x, color);
uLCD.line(64, 44+x, 68, 44+x, color);
uLCD.line(70, 44+x, 73, 44+x, color);
uLCD.line(53, 45+x, 57, 45+x, color);
uLCD.line(58, 45+x, 67, 45+x, color);
uLCD.line(69, 45+x, 72, 45+x, color);
uLCD.line(75, 45+x, 76, 45+x, color);
uLCD.line(53, 46+x, 57, 46+x, color);
uLCD.line(59, 46+x, 62, 46+x, color);
uLCD.line(63, 46+x, 66, 46+x, color);
uLCD.line(68, 46+x, 71, 46+x, color);
uLCD.line(73, 46+x, 76, 46+x, color);
uLCD.line(53, 47+x, 58, 47+x, color);
uLCD.line(59, 47+x, 62, 47+x, color);
uLCD.line(63, 47+x, 70, 47+x, color);
uLCD.line(72, 47+x, 75, 47+x, color);
uLCD.line(53, 48+x, 58, 48+x, color);
uLCD.line(59, 48+x, 62, 48+x, color);
uLCD.line(64, 48+x, 69, 48+x, color);
uLCD.line(71, 48+x, 74, 48+x, color);
uLCD.line(53, 49+x, 58, 49+x, color);
uLCD.line(59, 49+x, 63, 49+x, color);
uLCD.line(64, 49+x, 68, 49+x, color);
uLCD.line(70, 49+x, 73, 49+x, color);
uLCD.line(53, 50+x, 58, 50+x, color);
uLCD.line(59, 50+x, 63, 50+x, color);
uLCD.line(65, 50+x, 68, 50+x, color);
uLCD.line(69, 50+x, 72, 50+x, color);
uLCD.line(53, 51+x, 64, 51+x, color);
uLCD.line(66, 51+x, 71, 51+x, color);
uLCD.line(53, 52+x, 70, 52+x, color);
uLCD.line(53, 53+x, 69, 53+x, color);
uLCD.line(53, 54+x, 68, 54+x, color);
uLCD.line(52, 55+x, 67, 55+x, color);
uLCD.line(52, 56+x, 66, 56+x, color);
uLCD.line(53, 57+x, 64, 57+x, color);
uLCD.line(54, 58+x, 63, 58+x, color);
uLCD.line(55, 59+x, 59, 59+x, color);
uLCD.line(57, 60+x, 58, 60+x, color);
}

void drawScissors(int color, int x) {
uLCD.line(100, 34+x, 101, 34+x, color);
uLCD.line(99, 35+x, 102, 35+x, color);
uLCD.line(99, 36+x, 101, 36+x, color);
uLCD.line(98, 37+x, 101, 37+x, color);
uLCD.line(97, 38+x, 100, 38+x, color);
uLCD.line(97, 39+x, 100, 39+x, color);
uLCD.line(96, 40+x, 99, 40+x, color);
uLCD.line(105, 40+x, 109, 40+x, color);
uLCD.line(95, 41+x, 99, 41+x, color);
uLCD.line(104, 41+x, 108, 41+x, color);
uLCD.line(95, 42+x, 98, 42+x, color);
uLCD.line(102, 42+x, 107, 42+x, color);
uLCD.line(101, 43+x, 105, 43+x, color);
uLCD.line(99, 44+x, 103, 44+x, color);
uLCD.line(92, 45+x, 98, 45+x, color);
uLCD.line(100, 45+x, 102, 45+x, color);
uLCD.line(90, 46+x, 99, 46+x, color);
uLCD.line(89, 47+x, 94, 47+x, color);
uLCD.line(97, 47+x, 99, 47+x, color);
uLCD.line(88, 48+x, 93, 48+x, color);
uLCD.line(95, 48+x, 96, 48+x, color);
uLCD.line(88, 49+x, 91, 49+x, color);
uLCD.line(93, 49+x, 96, 49+x, color);
uLCD.line(99, 49+x, 102, 49+x, color);
uLCD.line(87, 50+x, 91, 50+x, color);
uLCD.line(93, 50+x, 94, 50+x, color);
uLCD.line(97, 50+x, 102, 50+x, color);
uLCD.line(87, 51+x, 91, 51+x, color);
uLCD.line(92, 51+x, 93, 51+x, color);
uLCD.line(95, 51+x, 101, 51+x, color);
uLCD.line(87, 52+x, 91, 52+x, color);
uLCD.line(92, 52+x, 93, 52+x, color);
uLCD.line(95, 52+x, 98, 52+x, color);
uLCD.line(86, 53+x, 91, 53+x, color);
uLCD.line(92, 53+x, 93, 53+x, color);
uLCD.line(99, 53+x, 101, 53+x, color);
uLCD.line(86, 54+x, 90, 54+x, color);
uLCD.line(92, 54+x, 95, 54+x, color);
uLCD.line(97, 54+x, 102, 54+x, color);
uLCD.line(85, 55+x, 94, 55+x, color);
uLCD.line(96, 55+x, 100, 55+x, color);
uLCD.line(85, 56+x, 95, 56+x, color);
uLCD.line(96, 56+x, 97, 56+x, color);
uLCD.line(86, 57+x, 95, 57+x, color);
uLCD.line(86, 58+x, 96, 58+x, color);
uLCD.line(88, 59+x, 94, 59+x, color);
uLCD.line(89, 60+x, 91, 60+x, color);
}

void drawEneRockFrame() {
    uLCD.rectangle(17, 28+2, 45, 65-2, BLACK);
}

void drawEnePaperFrame() {
    uLCD.rectangle(17+32, 28+2, 45+32, 65-2, BLACK);
}

void drawEneSciFrame() {
    uLCD.rectangle(17+32*2+1, 28+2, 45+32*2+1, 65-2, BLACK);
}

void drawMyRockFrame() {
    uLCD.rectangle(17, 28+32+4, 45, 65+32-2, BLACK);
}

void drawMyPaperFrame() {
    uLCD.rectangle(17+32, 28+32+4, 45+32, 65+32-2, BLACK);
}

void drawMySciFrame() {
    uLCD.rectangle(17+32*2+1, 28+32+4, 45+32*2+1, 65+32-2, BLACK);
}

void displayOption3() {
    clearMiddle();
    drawRock(BLACK, 0);
    drawPaper(BLACK, 0);
    drawScissors(BLACK, 0);
    drawRock(BLACK, 32);
    drawPaper(BLACK, 32);
    drawScissors(BLACK, 32);
}


// draw end

class Pet {
public:
    Pet() {
        setAge(0);
        setWeight(5);
        setDiscipline(0);
        setHungry(0);
        setHappy(0);
    }
    
    void increaseAge() {
        age = age + 1;
    }
    
    void setAge(int _age) {
        age = _age;
    }
    int getAge() {
        return age;
    }
    
    void setWeight(int _weight) {
        weight = _weight;
    }
    int getWeight() {
        return weight;
    }
    
    void increaseDiscipline() {
        if (discipline < 4) {
            discipline = discipline + 1;
        }
    }
    void decreaseDiscipline() {
        if (discipline > 0) {
            discipline = discipline - 1;
        }
    }
    void setDiscipline(int _discipline) {
        discipline = _discipline;
    }
    int getDiscipline() {
        return discipline;
    }
    
    void increaseHungry() {
        if (hungry < 4) {
            hungry = hungry + 1;
        }
    }
    void decreaseHungry() {
        if (hungry > 0) {
            hungry = hungry - 1;
        }
    }
    void setHungry(int _hungry) {
        hungry = _hungry;
    }
    int getHungry() {
        return hungry;
    }
    
    
    void increaseHappy() {
        if (happy < 4) {
            happy = happy + 1;
        }
    }
    void decreaseHappy() {
        if (happy > 0) {
            happy = happy - 1;
        }
    }
    void setHappy(int _happy) {
        happy = _happy;
    }
    int getHappy() {
        return happy;
    }
    
private:
    int age;
    int weight;
    int discipline;
    int hungry;
    int happy;
};


void thread1(void const *args)
{
    wave_file=fopen("/sd/song.wav","r");
    if(wave_file == NULL) {
        error("Could not open file for write\n");
    }
    waver.play(wave_file);
    Thread::wait(500); // wait 0.5s
    fclose(wave_file);
}



Pet pet;


void displayOption6() {
    clearMiddle();
    
    printf("%d\n\r", info_state);
    
    if (info_state%4 == 0) {
        uLCD.text_width(3); // 4 times
        uLCD.text_height(3);
        uLCD.locate(0, 1);
        uLCD.printf("AGE: %d\n", pet.getAge());
        uLCD.locate(0, 2);
        uLCD.printf("W:   %d\n", pet.getWeight());
    } else if (info_state%4 == 1) { //discipline
        uLCD.text_width(3); // 4 times
        uLCD.text_height(3);
        uLCD.locate(0, 1);
        uLCD.printf("Discip");
        if (pet.getDiscipline() == 0) {
            uLCD.circle(16, 72, 10, BLACK);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getDiscipline() == 1) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getDiscipline() == 2) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getDiscipline() == 3) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getDiscipline() == 4) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.filled_circle(16+32*3, 72, 10, RED);
        }
    } else if (info_state%4 == 2) { //hungry
        uLCD.text_width(3); // 4 times
        uLCD.text_height(3);
        uLCD.locate(0, 1);
        uLCD.printf("Hungry");
        if (pet.getHungry() == 0) {
            uLCD.circle(16, 72, 10, BLACK);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHungry() == 1) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHungry() == 2) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHungry() == 3) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHungry() == 4) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.filled_circle(16+32*3, 72, 10, RED);
        }
    } else if (info_state%4 == 3) { //happy
        uLCD.text_width(3); // 4 times
        uLCD.text_height(3);
        uLCD.locate(0, 1);
        uLCD.printf("Happy");
        if (pet.getHappy() == 0) {
            uLCD.circle(16, 72, 10, BLACK);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHappy() == 1) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.circle(16+32, 72, 10, BLACK);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHappy() == 2) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.circle(16+32*2, 72, 10, BLACK);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHappy() == 3) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.circle(16+32*3, 72, 10, BLACK);
        } else if (pet.getHappy() == 4) {
            uLCD.filled_circle(16, 72, 10, RED);
            uLCD.filled_circle(16+32, 72, 10, RED);
            uLCD.filled_circle(16+32*2, 72, 10, RED);
            uLCD.filled_circle(16+32*3, 72, 10, RED);
        }
    }
}




int main() {
    
    Thread t1(thread1);
    
    bool fired = 0;
    
    uLCD.baudrate(1500000);
    uLCD.textbackground_color(WHITE);
    uLCD.color(BLACK);
    
    
    int getpositionx = 48;
    int getpositiony = 70;
    

    

    
    Thread::wait(100);
    
    drawBackground();
    
    menu_state = 0;
    arrow_state = 0;
    light_state = 0;
    info_state = 0;
    bool sick_state = 0;
    bool poop_state = 0;
    bool sleep_state = 0;
    
    int rand_sick;
    int rand_sleep;
    
    int token = 0;

    
    //monster1.draw();
    
    int poop_count = 0;
    
    while(1) {
        
        if (light_state == 1) { // light off
                    
        } else {
            if (sleep_state == 1) {
                uLCD.BLIT(getpositionx, getpositiony, MONSTER_WIDTH, MONSTER_HEIGHT, MONSTER1_SLEEP1);
                if (poop_state == 1) {
                    uLCD.BLIT(100, 85, 11, 8, POOP);
                }
            } else { 
                if (sick_state == 1) {                   
                    
                    uLCD.BLIT(getpositionx, getpositiony, MONSTER_WIDTH, MONSTER_HEIGHT, MONSTER1_SICK1);      
                    if (poop_state == 1) {
                        uLCD.BLIT(100, 85, 11, 8, POOP);
                    }
                } else {
                    if (token == 1) {
                        uLCD.BLIT(getpositionx, getpositiony, MONSTER_WIDTH, MONSTER_HEIGHT, MONSTER1_1);
                        if (poop_state == 1) {
                            uLCD.BLIT(100, 85, 11, 8, POOP);
                        }
                    } else if (token == 100000) {
                        uLCD.BLIT(getpositionx, getpositiony, MONSTER_WIDTH, MONSTER_HEIGHT, MONSTER1_2);
                        if (poop_state == 1) {
                            uLCD.BLIT(100, 85, 11, 8, POOP);
                        }
                    } else if (token == 200000) {
                        token = 0;   
                        // sleep
                        rand_sleep = rand()%10000 + 1;
                        if (rand_sleep <= 10) {
                            sleep_state = 1;
                        }
            
                        // sick
                        rand_sick = rand()%10000 + 1;
                        if (poop_state == 1) {
                            if (rand_sick <= 50) {
                                sick_state = 1;    
                            }
                        } else {
                            if (rand_sick <= 10) {
                                sick_state = 1;    
                            }
                        }
                    }
                    token++;
                }
            }
            
        }
        
        // poop
        poop_count++;
        if (poop_count == 10000000) {
            if (poop_state == 0) {
                //uLCD.BLIT(90, 80, 11, 8, ERASE_POOP);
                uLCD.BLIT(100, 85, 11, 8, POOP);
                //poop_draw(90,80);
                poop_state = 1;    
            } 
            poop_count = 0;
        }
        
        
        
        
        
        
        
        
  
          if (myNav.right()) { // left
            if (menu_state > 1) {
                menu_state--;   
            }
            
             switch (menu_state) {
                case 1: drawMenu2(0xA0A0A0);
                    drawMenu1(BLACK);
                    break;
                case 2: drawMenu3(0xA0A0A0);
                    drawMenu2(BLACK);
                    break;
                case 3: drawMenu4(0xA0A0A0);
                    drawMenu3(BLACK);
                    break;
                case 4: drawMenu5(0xA0A0A0);
                    drawMenu4(BLACK);
                    break;
                case 5: drawMenu6(0xA0A0A0);
                    drawMenu5(BLACK);
                    break;
                case 6: drawMenu7(0xA0A0A0);
                    drawMenu6(BLACK);
                    break;
                case 7: drawMenu8(0xA0A0A0);
                    drawMenu7(BLACK);
                    break;
            }
            Thread::wait(500);
            
        } else if (myNav.left()) { // right
            if (menu_state < 8) {
                menu_state++;    
            }
             switch (menu_state) {
                case 1: drawMenu1(BLACK);
                    break;
                case 2: drawMenu1(0xA0A0A0);
                    drawMenu2(BLACK);
                    break;
                case 3: drawMenu2(0xA0A0A0);
                    drawMenu3(BLACK);
                    break;
                case 4: drawMenu3(0xA0A0A0);
                    drawMenu4(BLACK);
                    break;
                case 5: drawMenu4(0xA0A0A0);
                    drawMenu5(BLACK);
                    break;
                case 6: drawMenu5(0xA0A0A0);
                    drawMenu6(BLACK);
                    break;
                case 7: drawMenu6(0xA0A0A0);
                    drawMenu7(BLACK);
                    break;
                case 8: drawMenu7(0xA0A0A0);
                    drawMenu8(BLACK);
                    break;
            }
            Thread::wait(500);
            
            
        } else if (myNav.down()) { // up
            if (menu_state == 5) {
                menu_state = 1;   
            } else if (menu_state == 6) {
                menu_state = 2;   
            } else if (menu_state == 7) {
                menu_state = 3;   
            } else if (menu_state == 8) {
                menu_state = 4;   
            }
            
            switch (menu_state) {
                case 1: drawMenu5(0xA0A0A0);
                    drawMenu1(BLACK);
                    break;
                case 2: drawMenu6(0xA0A0A0);
                    drawMenu2(BLACK);
                    break;
                case 3: drawMenu7(0xA0A0A0);
                    drawMenu3(BLACK);
                    break;
                case 4: drawMenu8(0xA0A0A0);
                    drawMenu4(BLACK);
                    break;
            }
            
            Thread::wait(500);
        } else if (myNav.up()) { // down
            if (menu_state == 1) {
                menu_state = 5;   
            } else if (menu_state == 2) {
                menu_state = 6;   
            } else if (menu_state == 3) {
                menu_state = 7;   
            } else if (menu_state == 4) {
                menu_state = 8;   
            }
            
            switch (menu_state) {
                case 5: drawMenu1(0xA0A0A0);
                    drawMenu5(BLACK);
                    break;
                case 6: drawMenu2(0xA0A0A0);
                    drawMenu6(BLACK);
                    break;
                case 7: drawMenu3(0xA0A0A0);
                    drawMenu7(BLACK);
                    break;
                case 8: drawMenu4(0xA0A0A0);
                    drawMenu8(BLACK);
                    break;
            } 
            Thread::wait(500);
        } else if (myNav.fire()) {
            fired = 1;
            Thread::wait(500);
        }
           
    
        if (fired == 1) {
            fired = 0;
            if (menu_state == 1) {
                if (light_state == 1) { // light off
                    
                } else {
                    clearMiddle();
                    for (int i = 0; i < 10000000; i++) {
                        if (i == 0) {
                            uLCD.BLIT(55, 60, 22, 17, FOOD);
                        }
                        if (i== 5000000) {
                            clearMiddle();
                            uLCD.BLIT(55, 70, 22, 6, FOOD2);
                        }
                    }
                    
                    clearMiddle();
    
                    //monster1.draw();
                    pet.increaseHungry();
                }
                drawMenu1(0xA0A0A0);
                menu_state = 0;
                sleep_state = 0;
            } else if (menu_state == 2) {                     
                displayOption2();
                while (1) {

                    if (myNav.up() || myNav.down()) {
                        
                        if (arrow_state == 0) {
                            arrow_state = 1;
                        } else {
                            arrow_state = 0;
                        }
                        displayOption2();
                        Thread::wait(500);
                        
                    } else if (myNav.fire()) {
                        if (arrow_state == 0) {
                            clearMiddle();
                            //monster1.draw();
                            light_state = 0;
                        } else {
                            turnOffLight();
                            light_state = 1;
                        }
                        Thread::wait(500);
                        break;
                    } 
                }
                arrow_state = 0;
                drawMenu2(0xA0A0A0);
                menu_state = 0;
            } else if (menu_state == 3) {
                if (light_state == 1) { // light off
                    
                } else {

                    
                    displayOption3();
                    
                    int ene = rand()%3+1;
                    int result = 0; // 1: win 2: lose 3: tie
                    
                    while (1) {

                        if (myNav.right()) {
                            drawMyRockFrame();
                            if (ene == 1) {
                                drawEneRockFrame();
                                result = 3;
                            } else if (ene == 2) {
                                drawEnePaperFrame();
                                result = 2;
                            } else if (ene == 3) {
                                drawEneSciFrame();
                                result = 1;
                            }
                            Thread::wait(2000);
                        } else if (myNav.fire()) {
                            drawMyPaperFrame();
                            if (ene == 1) {
                                drawEneRockFrame();
                                result = 1;
                            } else if (ene == 2) {
                                drawEnePaperFrame();
                                result = 3;
                            } else if (ene == 3) {
                                drawEneSciFrame();
                                result = 2;
                            }
                            Thread::wait(2000);
                        } else if (myNav.left()) {
                            drawMySciFrame();
                            if (ene == 1) {
                                drawEneRockFrame();
                                result = 2;
                            } else if (ene == 2) {
                                drawEnePaperFrame();
                                result = 1;
                            } else if (ene == 3) {
                                drawEneSciFrame();
                                result = 3;
                            }
                            Thread::wait(2000);
                        }
                        
                        if (result == 3) {
                            clearMiddle();
                            uLCD.text_width(4); // 4 times
                            uLCD.text_height(4);
                            uLCD.locate(0, 1);
                            uLCD.printf("TIE");
                            Thread::wait(2000);
                            ene = rand()%3+1;
                            displayOption3();
                            result = 0;
                        } else if (result == 1) {
                            clearMiddle();
                            uLCD.text_width(4); // 4 times
                            uLCD.text_height(4);
                            uLCD.locate(0, 1);
                            uLCD.printf("WIN");
                            pet.increaseHappy();
                            Thread::wait(2000);
                            break;
                        } else if (result == 2) {
                            clearMiddle();
                            uLCD.text_width(4); // 4 times
                            uLCD.text_height(4);
                            uLCD.locate(0, 1);
                            uLCD.printf("LOSE");
                            pet.decreaseHappy();
                            Thread::wait(2000);
                            break;
                        }
                    }
                    clearMiddle();
                    //monster1.draw();
                }
                drawMenu3(0xA0A0A0);
                menu_state = 0;
                sleep_state = 0;
            } else if (menu_state == 4) { // medicine
                if (light_state == 1) { // light off
                    
                } else {
                    clearMiddle();
                    for (int i = 0; i < 10000000; i++) {
                        if (i == 0) {
                            uLCD.BLIT(60, 58, 16, 16, MED);
                        }
                        if (i== 5000000) {
                            clearMiddle();
                            uLCD.BLIT(60, 66, 16, 8, MED2);
                        }
                    }
                    
                    clearMiddle();
                    
                }
                drawMenu4(0xA0A0A0);
                menu_state = 0;
                sick_state = 0;
                sleep_state = 0;
            } else if (menu_state == 5) { // poop
                if (light_state == 1) { // light off
                    
                } else {
                    for (int i = 0; i < 128; i = i + 5) {
                        if (i == 0) {
                            uLCD.filled_rectangle(0+i, 26, 5+i,127-25+1, BLACK);
                        } else {
                            uLCD.filled_rectangle(0+i-5, 26, 5+i-5,127-25+1, WHITE);
                            uLCD.filled_rectangle(0+i, 26, 5+i,127-25+1, BLACK);
                        }
                        Thread::wait(100);
                    }
                    poop_state = 0;
                    poop_count = 0;
                    clearMiddle();
                    //monster1.draw();
                }
                drawMenu5(0xA0A0A0);
                menu_state = 0;
            } else if (menu_state == 6) { // info // working
                displayOption6();
                while (1) {

                    
                    if (myNav.left()) {
                        info_state = info_state + 1;
                        displayOption6();
                        Thread::wait(500);
                    } else if (myNav.right()) {
                        info_state = info_state - 1;
                        if (info_state < 0) {
                            info_state = info_state + 4; 
                        }
                        displayOption6();
                        Thread::wait(500);
                    } else if (myNav.fire()) {
                        Thread::wait(500);
                        break;
                    }                   
                }
                info_state = 0;
                
                if (light_state == 1) { // light off
                    drawUpperFrame();
                    drawUpperMenu();
                    turnOffLight();
                } else {
                    clearMiddle();
                    drawUpperFrame();
                    drawUpperMenu();
                    
                    //monster1.draw();
                }
                drawMenu6(0xA0A0A0);
                menu_state = 0;
            } else if (menu_state == 7) { // yell
                if (light_state == 1) { // light off
                    
                } else {
                    for (int i = 0; i < 10000000; i++) {
                        if (i % 1000000 == 0) {
                            uLCD.BLIT(getpositionx, getpositiony, MONSTER_WIDTH, MONSTER_HEIGHT, MONSTER1_MAD1);
                        }
                    }
                    
                    clearMiddle();
                    //monster1.draw();
                    pet.increaseDiscipline();
                    pet.decreaseHappy();
                }
                
                drawMenu7(0xA0A0A0);
                menu_state = 0;
                sleep_state = 0;
            } else if (menu_state == 8) {
                pet.increaseAge();
                drawMenu8(0xA0A0A0);
                menu_state = 0;
                sleep_state = 0;
            }             
        } 
        
        
    }
    
    
}