Skip to content

Commit

Permalink
interactive menu implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
knedl1k committed May 27, 2023
1 parent 2da534b commit 4436f8a
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 78 deletions.
9 changes: 7 additions & 2 deletions src/drawing.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ void drawBoard1(int edge){
for (int i = SPy + 3 * edge + 2 * t; i <SPy + 4 * edge + 3*t; i++){ // 4|
color_pixel_black_ver(SPx + 5 * edge + 2 * t, i);
}

lcdRefresh();
}

// BOARD 2
Expand Down Expand Up @@ -245,7 +245,8 @@ void drawBoard2(int edge){
}
for (int i = SPy + 2 * edge + t; i < SPy + 4 * edge + 3*t; i++){ // 4|
color_pixel_black_ver(SPx + 5 * edge + 2 * t, i);
}
}
lcdRefresh();
}

// BOARD 3
Expand Down Expand Up @@ -276,6 +277,7 @@ void drawBoard3(int edge){
for (int i = SPy + 2 * edge + t; i < SPy + 4 * edge + 3*t; i++){ // 4|
color_pixel_black_ver(SPx + 5 * edge + 2 * t, i);
}
lcdRefresh();
}

// BOARD 4
Expand Down Expand Up @@ -318,6 +320,7 @@ void drawBoard4(int edge){
for (int i = SPy + 2 * edge; i < SPy + 5*edge + 2 * t; i++){
color_pixel_black_ver(SPx + 5 * edge+2*t, i);
}
lcdRefresh();
}

// BOARD 5
Expand All @@ -342,6 +345,7 @@ void drawBoard5(int edge){
for (int i = SPy; i <SPy + 4*edge + 3*t; i++){ // 3| USED
color_pixel_black_ver(SPx + 4*edge + 2 * t, i);
}
lcdRefresh();
}

// BOARD 6
Expand Down Expand Up @@ -378,4 +382,5 @@ void drawBoard6(int edge){
for (int i = SPy + 2* edge+2*t; i < SPy + 4*edge+ 2*t; i++){ //
color_pixel_black_ver(SPx + edge, i);
}
lcdRefresh();
}
2 changes: 2 additions & 0 deletions src/drawing.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ void drawBoard4(int edge);
void drawBoard5(int edge);
void drawBoard6(int edge);

void drawFullRowBox(union rgb color, int x, int y);



#ifdef __cplusplus
Expand Down
220 changes: 158 additions & 62 deletions src/menu_handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include "perifs_handle.h"
#include "drawing.h"
Expand All @@ -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);
}
*/


}

4 changes: 2 additions & 2 deletions src/menu_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"*/
Expand Down
10 changes: 5 additions & 5 deletions src/perifs_handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void lcdRefresh(void){
for (unsigned short j=0; j<LCD_WIDTH; ++j)
parlcd_write_data(parlcd_base, fb[j][i].d);

fprintf(stderr,"refreshing LCD\n");
//fprintf(stderr,"refreshing LCD\n");
}

/*
Expand Down Expand Up @@ -79,9 +79,9 @@ struct rotation_t updateKnobValues(void){
knob.b_cur = (knobs_val >> 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) {
Expand Down Expand Up @@ -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;
}

Expand Down
10 changes: 8 additions & 2 deletions src/text_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.firstchar || c >= (font_rom8x16.size+font_rom8x16.firstchar))
Expand Down Expand Up @@ -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();
}
Loading

0 comments on commit 4436f8a

Please sign in to comment.