/*
 * functions about EEPROM
 * Author: HS
 *
 * Created on 2013/09/02 14:24
 */

#include "lonly.h"

int ADR;
unsigned char wt,wtmode;    //wait time
unsigned char redm,grem,blum;   //change mode if 0 decrease,else increase

void initcode();
void setAll();
void runcode(int);
void changeLED(unsigned char);
void setwt(int);
void setRed(int);
void setGreen(int);
void setBlue(int);
void changeRed();
void changeGreen();
void changeBlue();
unsigned char EEP_READ(int);
unsigned char cmd_read(int);

unsigned char EEP_READ(int add){
    return EEPROM_READ(add);
}

unsigned char cmd_read(int add){
    return cmdList[add];
}

//code initialize
void initcode(){
    ADR=0;
    setAll();
}

void setAll(){
    setwt(ADR);
    ADR++;
    setRed(ADR);
    ADR++;
    setGreen(ADR);
    ADR++;
    setBlue(ADR);
}

void setwt(int adr){
    unsigned char code;
    code=cmd_read(adr);

    wtmode=code&0x80;
    wt=code&0x7F;
}

void setRed(int adr){
    unsigned char code;
    code=cmd_read(adr);
    redm=code&0x01;
    RED=code;
}

void setGreen(int adr){
    unsigned char code;
    code=cmd_read(adr);
    grem=code&0x01;
    GRE=code;
}

void setBlue(int adr){
    unsigned char code;
    code=cmd_read(adr);
    blum=code&0x01;
    BLU=code;
}

//changing LED color
void changeLED(unsigned char code){
    if(code&0x04) changeRed();
    if(code&0x02) changeGreen();
    if(code&0x01) changeBlue();
}

void changeRed(){
    if(redm){
        if(REDS&0x30){
            REDS-=0x10;
        }else{
            RED--;
            REDS+=0x30;
        }
    }else{
        if(REDS&0x30==0x30){
            RED++;
            REDS-=0x30;
        }else{
            REDS+=0x10;
        }
    }
}

void changeGreen(){
    if(grem){
        if(GRES&0x30){
            GRES-=0x10;
        }else{
            GRE--;
            GRES+=0x30;
        }
    }else{
        if(GRES&0x30==0x30){
            GRE++;
            GRES-=0x30;
        }else{
            GRES+=0x10;
        }
    }
}

void changeBlue(){
    if(blum){
        if(BLUS&0x30){
            BLUS=BLUS-0x10;
        }else{
            BLU--;
            BLUS+=0x30;
        }
    }else{
        if(BLUS&0x30==0x30){
            BLU++;
            BLUS-=0x30;
        }else{
            BLUS+=0x10;
        }
    }
}

//wait Time
void wait(){
    if(wtmode){
        waitmin(wt);
    }else{
        waitsec(wt);
    }
}

//code program
void runcode(int adress){
    unsigned char code;
    code=cmd_read(adress);
    if(code>>4){
        changeLED(code>>4);
        wait();
        changeLED(code);
        wait();
    }else{
        switch(code){
            case 0x00:ADR++;setAll(ADR);break;
            case 0x01:ADR++;setwt(ADR);break;
            case 0x02:ADR++;setRed(ADR);break;
            case 0x03:ADR++;setGreen(ADR);break;
            case 0x04:ADR++;setBlue(ADR);break;
            case 0x05:redm=redm^1;break;
            case 0x06:blum=blum^1;break;
            case 0x07:grem=grem^1;break;
        }
    }

}
