Multi-Function Clock

Dependencies:   Clock DHT22 DigitDisplay mbed my8x8RGB

main.cpp

Committer:
mmoodevil
Date:
2015-12-08
Revision:
1:f9ce8c057b73
Parent:
0:1ef228e02562

File content as of revision 1:f9ce8c057b73:

#include "mbed.h"
#include "Clock.h"
#include "DHT22.h"
#include "my8x8RGB.h"

Ticker UpdateScreen,TCK_player;
Timeout w8;
Timer timer1;
InterruptIn BTN_Up(PA_14),BTN_Down(PA_15),BTN_Shoot(PA_13);

class bullet
{
public:
    int y,x;
    uint8_t enable;
    void display() {

        if(enable==1) {
            rgb_point(y,6-x,0,0,100);
        }
    }
    void RST() {
        rgb_point(y,7-x,0,0,0);
        y=0;
        x=0;
        enable=0;
    }

};

class enemy
{
public:
    int y,x;
    uint8_t level,enable;
    int t_delay;
    void display() {
        if(enable==1) {
            if(level==2 && x>=0)rgb_point(y,x,100,100,0);
            if(level==1 && x>=0)rgb_point(y,x,100,0,0);

        }
    }

    void RST() {
        rgb_point(y,x,0,0,0);
        y=0;
        x=0;
        enable=0;
        level=0;
    }

};

/**************OEY******************/
//define game variable
#define enemy_size1 10
#define enemy_size2 15
#define enemy_size3 20
#define bullet_speed 50
#define btn_delay 0.02
#define mooBTN 0.1
uint8_t player_location=1; // in Colum
bullet mybullet[10];
enemy wave1[enemy_size1];
enemy wave2[enemy_size2];
enemy wave3[enemy_size3];
enemy wave4[enemy_size2];
enemy wave5[enemy_size3];
uint8_t currentbullet=0;
uint8_t gameLevel=1;
int t_ms_easy[4]= {800,1000,1200,1400};
int t_ms_normal[4]= {500,600,700,800};
int t_ms_hard[4]= {500,400,400,500};
int CN[2]= {2,1};
/*************FUNCTION*****************/
void createWall();
void createWall2(uint8_t r,uint8_t g,uint8_t b);
void gameOver();

void PMD();
void PMU();
void playerMoveDown();
void playerMoveUp();
void SHT();
void shooting();
void bulletUpdate();

void genarate_enemy(enemy stage[],int enemy_size,int t_ms[]);
void genarate_enemy_rand(enemy stage[],int enemy_size,int t_ms[]);
void newSetting();
void enemyUpdate(enemy temp[],int enemy_size);
void TomaTosetting();
void TomaToloop();

/**************MOO****************/
Clock Clk(I2C_SDA,I2C_SCL); // I2C CLOCK DS1307
DigitDisplay Dis(PC_8, PC_6); // Display 7segment TM1636
InterruptIn K1(PC_10); // Inc Min (Alarm)
InterruptIn K2(PA_11); // Inc Hours (Alarm)
InterruptIn K3(PB_12); // Set Alarm
InterruptIn KS(PB_2);  // Change mode
DigitalOut Beep(PC_5); // Buzzer
int M=0,H=0,N=0,I=0;  // Cache Alarm
int SetH = 99 , SetM = 0; // Cache Alarm
int mode=3; // Init Mode = 0 (Default) 
int flag = 0; // Init Flag for Alarm
int temperature; //Init for Memmory Temp
int Ft=0,St=0; // Cache Temp
DHT22 dht(PB_1); // OneWire for Temp get
/**************MOO****************/

int alarmset(int sH,int sM) // Function Set Alarm
{
    int I,J,K;
    Clk.getAlarm(&I,&J,&K);
    if(sH == K && sM == J )
        return 1; 
    else
        return 0;        
}

void sentoo() // Set time
{
    //wait(0.3);
    SetM = (N*10) + M ;
    SetH = (I*10) + H ;
    //alarmset(SetH,int SetM)
    printf("%d:%d",SetH,SetM);
}

void minUoo(){
    M++;
   // wait(0.3);
    if(M>9 && N<5){
    M = 0;
    N++;
    }
    if(M>9 && N==5)
    {
        M = 0;
        N = 0;
    }
}

void hoursUoo(){
    H++;
  //  wait(0.3);
    if(H>9 && I<2){
    H = 0;
    I++;
    }
    if(H>3 && I==2)
    {
        H = 0;
        I = 0;
    }
}

void modepoo(){
   // wait(0.5);
    screen_off();
    mode++;
    printf("%d\n",mode);
    if(mode==3){
        newSetting();
        gameLevel=1;
        genarate_enemy(wave1,enemy_size1,t_ms_easy);
        
        }
    if(mode == 4)
    { mode = 0 ;}
  //  wait(0.5);
    
}

void sent(){
    w8.attach(&sentoo,mooBTN);
    }
    void minU(){
    w8.attach(&minUoo,mooBTN);
    }
    void hoursU(){
    w8.attach(&hoursUoo,mooBTN);
    }
    void modep(){
    w8.attach(&modepoo,mooBTN);
    }

void aalm(){
    Beep=1;
    }
void aalm_off(){
    Beep=0;
    }

int main(){
    //Clk.settime2bcd(0,19,01,0,0,0,0);
    KS.rise(&modep);
    K1.rise(&minU);
    K2.rise(&hoursU);
    K3.rise(&sent);
    TomaTosetting();
    while(1){
    while(mode == 0){
        
        Clk.displays();
        wait(1);
        flag = alarmset(SetH,SetM);
        
        if(flag==1){
            UpdateScreen.attach(&aalm,0.1);
            TCK_player.attach(&aalm_off,0.2);
            newSetting();
            gameLevel=1;
            genarate_enemy(wave1,enemy_size1,t_ms_easy);
            }
        
        while(flag == 1){
            TomaToloop();
        }
    }
    
    while(mode == 1){
        Dis.write(3,M);
        Dis.write(2,N);
        Dis.write(1,H);
        Dis.write(0,I);
    }
    while(mode == 2){
     dht.sample();
     wait(0.5);
     temperature = dht.getTemperature();
     temperature = temperature/10;
     Dis.clear();
     Ft = temperature/10;
     St = temperature%10;
     Dis.write(3,12);
     Dis.write(2,St);
     Dis.write(1,Ft);
     
     //printf("%d \n",temperature);
    }
    
    while(mode == 3){
    TomaToloop();}
    }
}

/************OEY FUNCTION*****************/
void createWall()
{
    for(int i=0; i<8; i++) {
        rgb_point(0,i,50,50,50);
        rgb_point(7,i,50,50,50);
    }

}

void createWall2(uint8_t r,uint8_t g,uint8_t b)
{
    for(int i=0; i<8; i++) {
        rgb_point(0,i,r,g,b);
        rgb_point(7,i,r,g,b);
    }

}

void PMD()
{
    rgb_point(player_location,7,0,0,0);
    player_location++;
    if(player_location>=7) {
        player_location=6;
    }
    rgb_point(player_location,7,0,50,0);
}
void playerMoveDown()
{

    w8.attach(&PMD,btn_delay);
}

void PMU()
{
    rgb_point(player_location,7,0,0,0);
    player_location--;
    if(player_location<=0) {
        player_location=1;
    }
    rgb_point(player_location,7,0,50,0);

}
void playerMoveUp()
{

    w8.attach(&PMU,btn_delay);
}

void SHT()
{
    mybullet[currentbullet].y=player_location;
    mybullet[currentbullet].enable=1;
    currentbullet++;
    if(currentbullet>=10)currentbullet=0;
}

void shooting()
{
    w8.attach(&SHT,btn_delay);
}

void bulletUpdate()
{

    for(int i=0; i<10; i++) {
        if(mybullet[i].enable==1) {
            mybullet[i].display();
            if(timer1.read_ms()%bullet_speed==0) {
                rgb_point(mybullet[i].y,6-mybullet[i].x,0,0,0);
                mybullet[i].x++;
                if(mybullet[i].x>=7)mybullet[i].RST();
            }
        }

    }
}


void genarate_enemy(enemy stage[],int enemy_size,int t_ms[])
{
    for(int i=0; i<enemy_size; i++) {
        stage[i].x=0;
        stage[i].y=(rand()%6) +1;
        for(int j=0; j< enemy_size && i!=j; j++) {
            if(stage[i].y==stage[j].y && stage[i].x==stage[j].x)stage[i].x++;

        }
        stage[i].level=1;
        stage[i].enable=1;
        stage[i].t_delay=t_ms[rand()%4 +1];
        if(stage[i].y==0 || stage[i].y==7) {
            stage[i].enable=0;
            stage[i].RST();
        }

    }
}



void genarate_enemy_rand(enemy stage[],int enemy_size,int t_ms[])
{
    for(int i=0; i<enemy_size; i++) {
        stage[i].x=0;
        stage[i].y=rand()%6 +1;
        for(int j=0; j< enemy_size && i!=j; j++) {
            if(stage[i].y==stage[j].y)stage[i].x++;
            stage[i].enable=1;
        }
        stage[i].level=rand()%2 +1;
        stage[i].enable=1;
        stage[i].t_delay=t_ms[rand()%4 +1];
        if(stage[i].y==0 || stage[i].y==7) {
            stage[i].enable=0;
            stage[i].RST();
        }

    }
}

void newSetting(){
    screen_off();
    createWall();
    rgb_point(player_location,7,0,50,0);
    }

void enemyUpdate(enemy temp[],int enemy_size)
{
    uint8_t status=0;
    for(int i=0; i<enemy_size; i++) {
        if(temp[i].enable==1) {
            temp[i].display();
            if(timer1.read_ms()%temp[i].t_delay==0) {
                rgb_point(temp[i].y,temp[i].x,0,0,0);
                temp[i].x++;
                if(temp[i].x>7) { //Game Over
                    newSetting();
                    createWall2(255,10,255);
                    
                    temp[i].RST();
                   // screen_color(100,10,10);
                   gameLevel=1;  
                   genarate_enemy(wave1,enemy_size1,t_ms_easy);
                }
            }
            for(int j =0; j<10; j++) {
                if(temp[i].x==(6-mybullet[j].x) && temp[i].y==mybullet[j].y) {
                    mybullet[j].RST();
                    if(temp[i].level==2)temp[i].level=1;
                    else
                        temp[i].RST();
                }
            }
        } else status++;
    }
    if(status>=enemy_size) {
    wait_ms(500);
        gameLevel++;
        newSetting();
        if(gameLevel==2){
            genarate_enemy(wave2,enemy_size2,t_ms_normal);
            }
    if(gameLevel==3)genarate_enemy(wave3,enemy_size2,t_ms_hard);
    if(gameLevel==4){
        genarate_enemy_rand(wave4,enemy_size1,t_ms_easy);
        flag=0;
        UpdateScreen.detach();
        TCK_player.detach();
        SetH=99;
        SetM=99;
        screen_off();
        createWall();
        }
    if(gameLevel==5)genarate_enemy_rand(wave5,enemy_size2,t_ms_normal);
    if(gameLevel==6){
        genarate_enemy_rand(wave5,enemy_size3,t_ms_normal);
        createWall2(0,30,255);
        }
    }

}

void TomaTosetting(){
    timer1.start();
    char wb[3]= {128,128,128};
    INITRGB(wb);
    /***************Genarate Enemy*********************/
    genarate_enemy(wave1,enemy_size1,t_ms_easy);
    
    /***************Setting Button*******************/
    BTN_Down.rise(&playerMoveDown);
    BTN_Down.mode(PullUp);
    BTN_Up.rise(&playerMoveUp);
    BTN_Up.mode(PullUp);
    BTN_Shoot.rise(&shooting);
    BTN_Shoot.mode(PullUp);

    /************************************/
//gameSetting
    newSetting();
    /***********************************/
    
    }
void TomaToloop(){
    
        displayRGB();
        bulletUpdate();
        displayRGB();
        //displayRGB();
        if(gameLevel==1)enemyUpdate(wave1,enemy_size1);
        if(gameLevel==2)enemyUpdate(wave2,enemy_size2);
        if(gameLevel==3)enemyUpdate(wave3,enemy_size3);
        if(gameLevel==4)enemyUpdate(wave4,enemy_size1);
        if(gameLevel==5)enemyUpdate(wave5,enemy_size2);
        if(gameLevel==6)enemyUpdate(wave5,enemy_size3);//6
        displayRGB();
    
    }