diff --git a/src/drawing.c b/src/drawing.c index e7c9822..4a02d29 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -215,7 +215,7 @@ void drawBoard1(int edge){ for (int i = SPy + 3 * edge + 2 * t; i #include #include +#include +#include #include "perifs_handle.h" #include "drawing.h" @@ -18,91 +20,185 @@ union rgb WHITE={.r=255,.g=255,.b=255}; union rgb BLACK={.r=0,.g=0,.b=0}; //union rgb YLW={.r=255,.g=255,.b=0}; +#define MAX_OPTIONS 2 + extern struct rotation_t knobs; -void renderMenu(void){ - lcdReset(); +void renderMenu(uint8_t selected){ + if(selected>MAX_OPTIONS) return; + //lcdReset(); printString("APONGO",180,50,BLACK,3); printString("Navigate using green knob",40,220,BLACK,2); - drawRectangleWithText("Play",30,150,RED,2,0); - drawRectangleWithText("Settings",160,150,GREEN,2,1); - drawRectangleWithText("Quit",360,150,BLUE,2,0); + (selected==0)? drawRectangleWithText("Play",30,150,RED,2,1) : drawRectangleWithText("Play",30,150,RED,2,0); + (selected==1)? drawRectangleWithText("Settings",160,150,GREEN,2,1) : drawRectangleWithText("Settings",160,150,GREEN,2,0); + (selected==2)? drawRectangleWithText("Quit",360,150,BLUE,2,1) : drawRectangleWithText("Quit",360,150,BLUE,2,0); + + lcdRefresh(); } -static uint8_t renderSettingsMenu(void){ - lcdReset(); - printString("APONGO",180,-300,BLACK,3); - printString("Settings",60,-220,BLACK,2); - drawRectangleWithText("Difficulty",30,-150,RED,2,0); - drawRectangleWithText("Font",150,-150,GREEN,2,0); - drawRectangleWithText("Back",350,-150,BLUE,2,0); +static void renderSettingsMenu(uint8_t selected){ + if(selected>MAX_OPTIONS) return; + //lcdReset(); + printString("APONGO",180,50,BLACK,3); + printString("Settings",180,220,BLACK,2); + (selected==0)? drawRectangleWithText("Difficulty",30,150,RED,2,1) : drawRectangleWithText("Difficulty",30,150,RED,2,0); + (selected==1)? drawRectangleWithText("Font",230,150,GREEN,2,1) : drawRectangleWithText("Font",230,150,GREEN,2,0); + (selected==2)? drawRectangleWithText("Back",350,150,BLUE,2,1) : drawRectangleWithText("Back",350,150,BLUE,2,0); lcdRefresh(); - //wait for knob press - return 0; } -static void renderDiffMenu(void){ - lcdReset(); - printString("APONGO",180,-300,BLACK,3); - printString("Choose your difficulty",60,-220,BLACK,2); - drawRectangleWithText("Potato",30,-150,RED,2,0); - drawRectangleWithText("Nightmare",150,-150,GREEN,2,0); - drawRectangleWithText("Hell",350,-150,BLUE,2,0); +static void renderDiffMenu(uint8_t selected){ + if(selected>MAX_OPTIONS) return; + //lcdReset(); + printString("APONGO",180,50,BLACK,3); + printString("Choose your difficulty",80,220,BLACK,2); + (selected==0)? drawRectangleWithText("Potato",30,150,RED,2,1) : drawRectangleWithText("Potato",30,150,RED,2,0); + (selected==1)? drawRectangleWithText("Nightmare",170,150,GREEN,2,1) : drawRectangleWithText("Nightmare",170,150,GREEN,2,0); + (selected==2)? drawRectangleWithText("Hell",350,150,BLUE,2,1) : drawRectangleWithText("Hell",350,150,BLUE,2,0); lcdRefresh(); - //wait for knob press } -static uint8_t renderFontMenu(void){ - lcdReset(); - printString("APONGO",180,-300,BLACK,3); - printString("Change font properties",60,-220,BLACK,2); - drawRectangleWithText("Scaling",30,-150,RED,2,0); - drawRectangleWithText("Type",150,-150,GREEN,2,0); - drawRectangleWithText("Back",350,-150,BLUE,2,0); +static void renderFontMenu(uint8_t selected){ + if(selected>MAX_OPTIONS) return; + //lcdReset(); + printString("APONGO",180,50,BLACK,3); + printString("Font options",100,220,BLACK,2); + (selected==0)? drawRectangleWithText("Scale 1",30,150,RED,2,1) : drawRectangleWithText("Scale 1",30,150,RED,2,0); + (selected==1)? drawRectangleWithText("Scale 2",200,150,GREEN,2,1) : drawRectangleWithText("Scale 2",200,150,GREEN,2,0); + (selected==2)? drawRectangleWithText("Back",350,150,BLUE,2,1) : drawRectangleWithText("Back",350,150,BLUE,2,0); lcdRefresh(); - //wait for knob press - return 0; } -void menuReaction(_Bool red, _Bool green, _Bool blue){ +void menuReaction(void){ //reacts on knob presses _Bool quit=0; - //_Bool start=0; - renderMenu(); - /* + renderMenu(0); + int8_t rendered=0; + int8_t selected=0; + int8_t move; + int8_t prev_move; + + while(! quit){ - switch(reaction){ - case 0: break; //nothing is pressed, no reaction - case 1: - //start the game with set difficulty and font - break; - case 2: - reaction=renderSettingsMenu(); - break; - case 3: - //quit the program - break; - case 11: - renderDiffMenu(); - reaction=renderMenu(); - break; - case 12: - reaction=renderFontMenu(); - case 13: - reaction=renderMenu(); - break; - case 21: - break; - case 22: - break; - case 23: - break; + prev_move=move; + knobs=updateKnobValues(); + + + move=knobs.g_knob_data*(-1); //!ON OUR BOARD + printf("move %d\n",move); + if(prev_move!=move || move!=0){ + selected+= move; + if(selected>MAX_OPTIONS) + selected=MAX_OPTIONS; + else if(selected<0) + selected=0; + + printf("selected%d\n",selected); + switch(rendered){ + case 0: + renderMenu(selected); + break; + case 1: + renderSettingsMenu(selected); + break; + case 2: + renderDiffMenu(selected); + break; + case 3: + renderFontMenu(selected); + break; + } + + } + + + //knobs=updateKnobValues(); + _Bool pressed=knobs.is_g_pressed; + printf("pressed%d\n",pressed); + int8_t new_selected=0; + if(pressed){ + new_selected=0; + if(rendered==0){ //main menu + switch(selected){ + case 0: + //start the game + lcdReset(); + drawBoard1(40); //!EXAMPLE + quit=1; + break; + case 1: + //render settings menu + lcdReset(); + renderSettingsMenu(new_selected); + rendered=1; + break; + case 2: + //quit the program + quit=1; + break; + } + }else if(rendered==1){ //settings menu + switch(selected){ + case 0: + //render diff menu + lcdReset(); + renderDiffMenu(new_selected); + rendered=2; + break; + case 1: + //render font menu + lcdReset(); + renderFontMenu(new_selected); + rendered=3; + break; + case 2: + //back to main menu + lcdReset(); + renderMenu(new_selected); + rendered=0; + break; + } + }else if(rendered==2){ //difficulty menu + switch(selected){ + case 0: + //set difficulty to Potato + break; + case 1: + //set difficulty to Nightmare + break; + case 2: + //set difficulty to Hell + break; + } + lcdReset(); + renderMenu(selected); //return to main menu + rendered=0; + }else if(rendered==3){ //font menu + switch(selected){ + case 0: + //printString("Font options",100,220,BLACK,2); + //drawFullRowBox(BLACK,30,150); + //printString("Scaling level 1 set.",60,220,BLACK,2); + break; + case 1: + //set scaling of all text to 2 + break; + case 2: + //back to main menu + lcdReset(); + renderSettingsMenu(new_selected); + rendered=1; + break; + } + } + selected=new_selected; } + sleep(0.5); } - */ + } diff --git a/src/menu_handle.h b/src/menu_handle.h index 07ae011..8a0de6b 100644 --- a/src/menu_handle.h +++ b/src/menu_handle.h @@ -8,8 +8,8 @@ extern "C" { #endif -void renderMenu(void); -void menuReaction(_Bool red, _Bool green, _Bool blue); +void renderMenu(uint8_t selected); +void menuReaction(void); #ifdef __cplusplus } /* extern "C"*/ diff --git a/src/perifs_handle.c b/src/perifs_handle.c index 3a13d5d..f22d8f9 100644 --- a/src/perifs_handle.c +++ b/src/perifs_handle.c @@ -33,7 +33,7 @@ void lcdRefresh(void){ for (unsigned short j=0; j> 0) & 0xFF; //Clicks of knobs. - result.is_r_pressed = (knobs_val >> 16 & 0x1) == 1; - result.is_g_pressed = (knobs_val >> 8 & 0x1) == 1; - result.is_b_pressed = (knobs_val >> 0 & 0x1) == 1; + result.is_r_pressed = (knobs_val >> 26 & 0x1) == 1; + result.is_g_pressed = (knobs_val >> 25 & 0x1) == 1; + result.is_b_pressed = (knobs_val >> 24 & 0x1) == 1; //Red knob if ((knob.r_cur - 3) > knob.r_prev) { @@ -145,7 +145,7 @@ struct rotation_t updateKnobValues(void){ } else { result.b_knob_data = 0; } - printf("r %d g %d b %d\n",result.r_knob_data,result.g_knob_data,result.b_knob_data); + //printf("r %d g %d b %d\n",result.r_knob_data,result.g_knob_data,result.b_knob_data); return result; } diff --git a/src/text_display.c b/src/text_display.c index f03e848..4f53576 100644 --- a/src/text_display.c +++ b/src/text_display.c @@ -13,15 +13,19 @@ #include "colors.h" union rgb PRP={.r=255,.g=0,.b=255}; +union rgb WHT={.r=255,.g=255,.b=255}; //union rgb BLACK={.r=255,.g=255,.b=255}; /*draws a character 'c' onto a framebuffer 'fb' at position (x, y), with a scaling factor*/ void printChar(char c, int x, int y, union rgb color,unsigned char scale){ + //printf("%d %d\n",x,y); + /* if(x<0 || x>=LCD_WIDTH || y<0 || y>LCD_HEIGHT){ fprintf(stderr,"ERROR: OUT OF LCD RANGE\n"); return; } + */ //int color=0xffff; //Check if the character 'c' is within the range of characters defined by the font set 'font_rom8x16' if (c= (font_rom8x16.size+font_rom8x16.firstchar)) @@ -66,12 +70,14 @@ void printString(char *word, int x, int y,union rgb color, unsigned char scale){ void drawRectangleWithText(char *str, int x, int y, union rgb color,unsigned char scale, _Bool selected){ size_t cChars=strlen(str); - int x_off=x+12; - int y_off=y+4; + int x_off=x+10; + int y_off=y+3; printString(str,x_off,y_off,color,scale); drawRectangle(color,y,x,scale*font_rom8x16.height,scale*font_rom8x16.maxwidth*(cChars+1)); // if(selected) drawRectangle(PRP,y-5,x-5,scale*font_rom8x16.height+10,scale*font_rom8x16.maxwidth*(cChars+1)+10); + else + drawRectangle(WHT,y-5,x-5,scale*font_rom8x16.height+10,scale*font_rom8x16.maxwidth*(cChars+1)+10); lcdRefresh(); } diff --git a/src/ubongo.c b/src/ubongo.c index 54336db..fd06198 100644 --- a/src/ubongo.c +++ b/src/ubongo.c @@ -44,26 +44,35 @@ int main(void){ initMemory(); lcdReset(); knobInit(); + //_Bool quit = 0; + menuReaction(); /* LCD SECTION */ + //printf("Hello world\n"); + //fontString("World Hello", 0, -200, 1); + //drawSquare(-200, 200); + //lcd_frame(); + // union rgb blue = {.r=0, .g=0, .b=255}; + //drawRectangle(blue,-100, 50, 200, 30); + // drawBoard1(40); - //drawBoard1(40); + //drawBoard4(40); - drawBoard4(40); + //drawBoard4(40); lcdRefresh(); - renderMenu(); + //renderMenu(); /* KNOBS SECTION */ /* fprintf(stderr,"red%hhd blue%hhd green%hhd\n",knobs.is_r_pressed,knobs.is_g_pressed,knobs.is_b_pressed); - rgb1((union rgb){.b=255}); + rgb1((union rgb){.g=255}); sleep(4); while(1){ knobs=updateKnobValues(); - printf("r %d, g %d, b %d\n", knobs.r_knob_data,knobs.g_knob_data,knobs.b_knob_data); + printf("r %d, g %d, b %d\n", knobs.is_r_pressed,knobs.is_g_pressed,knobs.is_b_pressed); //rgb1((union rgb){.d=r_knob_data}); sleep(1); }