implement input iteraction
This commit is contained in:
parent
c822a75df0
commit
6af3988056
12 changed files with 229 additions and 110 deletions
2
OBJECTS
2
OBJECTS
|
@ -1,5 +1,5 @@
|
|||
TARGET = main
|
||||
SRC = hal.cpp main.cpp example.cpp
|
||||
SRC = hal.cpp main.cpp example.cpp buttons.cpp
|
||||
|
||||
SRC += gfx/screen.cpp gfx/canvas.cpp gfx/font.cpp gfx/layout.cpp gfx/buffer.cpp
|
||||
|
||||
|
|
28
inc/buttons.h
Normal file
28
inc/buttons.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
//
|
||||
// Created by jedi on 11/6/18.
|
||||
//
|
||||
|
||||
#ifndef MGL_DMXMENU_INPUT_H
|
||||
#define MGL_DMXMENU_INPUT_H
|
||||
|
||||
|
||||
|
||||
#define I_LEFT 0
|
||||
#define I_RIGHT 1
|
||||
#define I_UP 2
|
||||
#define I_DOWN 3
|
||||
|
||||
|
||||
class buttons {
|
||||
private:
|
||||
void onPush(int id, bool state);
|
||||
public:
|
||||
bool raw[4]={false,false, false, false};
|
||||
bool last[4]={false,false, false, false};
|
||||
void poll();
|
||||
};
|
||||
|
||||
|
||||
extern buttons input;
|
||||
|
||||
#endif //MGL_DMXMENU_INPUT_H
|
|
@ -11,11 +11,11 @@
|
|||
class layout {
|
||||
class Slot {
|
||||
private:
|
||||
int pos_;
|
||||
int size_;
|
||||
canvas *canvas_ = 0;
|
||||
int pos_ = 0;
|
||||
int size_ = 0;
|
||||
canvas *canvas_ = nullptr;
|
||||
public:
|
||||
node *content;
|
||||
node *content = nullptr;
|
||||
friend layout;
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,7 @@ private:
|
|||
public:
|
||||
static const int maxslots = 10;
|
||||
Slot slots[maxslots];
|
||||
node *cursor;
|
||||
|
||||
layout(screen& s) : maxwidth_(s.getWidth()), maxheight_(s.getHeight()), screen_(s) {
|
||||
|
||||
|
|
|
@ -2,21 +2,15 @@
|
|||
#ifndef _HAL_H_
|
||||
#define _HAL_H_
|
||||
|
||||
#define I_LEFT 0
|
||||
#define I_RIGHT 1
|
||||
#define I_UP 2
|
||||
#define I_DOWN 3
|
||||
|
||||
|
||||
void debug(const char* str);
|
||||
void hal_init();
|
||||
void hal_init_screen(int w, int h);
|
||||
|
||||
void hal_poll_input(bool *ptr);
|
||||
void hal_draw(int x, int y);
|
||||
void hal_render();
|
||||
void render();
|
||||
|
||||
extern bool input[4];
|
||||
|
||||
#ifndef LINUX
|
||||
|
||||
void * operator new(unsigned int size);
|
||||
|
|
17
inc/node.h
17
inc/node.h
|
@ -31,12 +31,13 @@ public:
|
|||
|
||||
virtual void render(canvas &c) = 0;
|
||||
|
||||
node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min), maxsize(max) {
|
||||
explicit node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min),
|
||||
maxsize(max) {
|
||||
}
|
||||
|
||||
node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), next_(nullptr),
|
||||
child_(nullptr),
|
||||
parent_(nullptr) {
|
||||
explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), next_(nullptr),
|
||||
child_(nullptr),
|
||||
parent_(nullptr) {
|
||||
}
|
||||
|
||||
template<typename ... Args>
|
||||
|
@ -58,6 +59,14 @@ public:
|
|||
node *getCursor() {
|
||||
return cursor_;
|
||||
}
|
||||
|
||||
node *getParent() {
|
||||
return parent_;
|
||||
}
|
||||
|
||||
void setCursor(node *c) {
|
||||
cursor_ = c;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
20
src/buttons.cpp
Normal file
20
src/buttons.cpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
//
|
||||
// Created by jedi on 11/6/18.
|
||||
//
|
||||
|
||||
#include "hal/hal.h"
|
||||
#include "buttons.h"
|
||||
|
||||
|
||||
buttons input;
|
||||
|
||||
void buttons::poll() {
|
||||
hal_poll_input(raw);
|
||||
|
||||
for(int i = 0; i < 4; i++){
|
||||
if(raw[i]!=last[i]){
|
||||
onPush(i, raw[i]);
|
||||
last[i]=raw[i];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
#include "buttons.h"
|
||||
#include "example.h"
|
||||
#include "node.h"
|
||||
#include "gfx/canvas.h"
|
||||
|
@ -14,10 +15,10 @@ void fooValue::render(canvas& c){
|
|||
|
||||
|
||||
c.print(10 , 10, title_);
|
||||
peng[0] = input[0] ? 'L' : ' ';
|
||||
peng[1] = input[1] ? 'R' : ' ';
|
||||
peng[2] = input[2] ? 'U' : ' ';
|
||||
peng[3] = input[3] ? 'D' : ' ';
|
||||
peng[0] = input.raw[0] ? 'L' : ' ';
|
||||
peng[1] = input.raw[1] ? 'R' : ' ';
|
||||
peng[2] = input.raw[2] ? 'U' : ' ';
|
||||
peng[3] = input.raw[3] ? 'D' : ' ';
|
||||
j++;
|
||||
j %= 10;
|
||||
peng[4] = 'A' + j;
|
||||
|
|
|
@ -17,9 +17,11 @@ void layout::render() {
|
|||
}
|
||||
|
||||
int layout::apply(node* node) {
|
||||
int rootslot = allocate_(node, maxslots)+1;
|
||||
int minsize = pack_(rootslot);
|
||||
int rootslot = allocate_(node, maxslots);
|
||||
int minsize = pack_(rootslot + 1);
|
||||
expand_(minsize);
|
||||
if (cursor == nullptr)
|
||||
cursor = slots[rootslot].content->getCursor();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#include "hal/hal.h"
|
||||
|
||||
bool input[4];
|
||||
|
||||
#ifdef LINUX
|
||||
#include "hal/linux.cpp"
|
||||
|
|
|
@ -4,34 +4,43 @@
|
|||
|
||||
#include "ssd1306.h"
|
||||
#include "nano_gfx.h"
|
||||
#include "buttons.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <hal/hal.h>
|
||||
|
||||
uint8_t canvasData[SCREEN_WIDTH*(SCREEN_HEIGHT/8)];
|
||||
NanoCanvas canvas(SCREEN_WIDTH, SCREEN_HEIGHT, canvasData);
|
||||
uint8_t *canvasData;
|
||||
NanoCanvas *canvas;
|
||||
|
||||
void hal_init(){
|
||||
void hal_init_screen(int w, int h) {
|
||||
ssd1306_128x32_i2c_init();
|
||||
ssd1306_fillScreen( 0x00 );
|
||||
canvasData = new uint8_t[w * (h / 8)];
|
||||
canvas = new NanoCanvas(w, h, canvasData);
|
||||
canvas.clear();
|
||||
|
||||
DDRD = 0;
|
||||
PORTD |= (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5);
|
||||
}
|
||||
|
||||
void hal_draw(int x, int y){
|
||||
canvas.putPixel(x, y);
|
||||
}
|
||||
|
||||
|
||||
void hal_poll_input(bool *ptr) {
|
||||
int in = PIND & 0x3c;
|
||||
|
||||
ptr[0] = in & (1 << PC2);
|
||||
ptr[1] = in & (1 << PC3);
|
||||
ptr[2] = in & (1 << PC4);
|
||||
ptr[3] = in & (1 << PC5);
|
||||
|
||||
}
|
||||
|
||||
void hal_render() {
|
||||
|
||||
DDRD = 0;
|
||||
PORTD |= (1 << PC2)|(1 << PC3)|(1 << PC4)|(1 << PC5);
|
||||
|
||||
while (1) {
|
||||
int in = PIND & 0x3c;
|
||||
|
||||
input[0]=in & (1<<PC2);
|
||||
input[1]=in & (1<<PC3);
|
||||
input[2]=in & (1<<PC4);
|
||||
input[3]=in & (1<<PC5);
|
||||
|
||||
while (true) {
|
||||
canvas.clear();
|
||||
render();
|
||||
canvas.blt(0, 0);
|
||||
|
|
|
@ -7,16 +7,12 @@
|
|||
//Using SDL and standard IO
|
||||
#include <SDL2/SDL.h>
|
||||
#include <cstdio>
|
||||
#include <buttons.h>
|
||||
|
||||
SDL_Window *window = nullptr;
|
||||
SDL_Event event;
|
||||
SDL_Renderer *renderer;
|
||||
|
||||
void hal_init() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void hal_init_screen(int width, int height){
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
|
@ -43,62 +39,13 @@ void hal_draw(int x, int y){
|
|||
SDL_RenderDrawPoint(renderer, x, y);
|
||||
}
|
||||
|
||||
|
||||
bool quit = false;
|
||||
|
||||
void hal_render() {
|
||||
|
||||
bool quit = false;
|
||||
|
||||
while (!quit) {
|
||||
if (SDL_PollEvent(&event)) {
|
||||
|
||||
|
||||
switch (event.type) {
|
||||
case SDL_KEYDOWN:
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_LEFT:
|
||||
input[I_LEFT]=true;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
input[I_RIGHT]=true;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
input[I_UP]=true;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
input[I_DOWN]=true;
|
||||
break;
|
||||
case 'q':
|
||||
case 0x1b: //ESC
|
||||
quit = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_KEYUP:
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_LEFT:
|
||||
input[I_LEFT]=false;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
input[I_RIGHT]=false;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
input[I_UP]=false;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
input[I_DOWN]=false;
|
||||
break;
|
||||
default:
|
||||
printf("key %x\n", event.key.keysym.sym);
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
quit = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
SDL_Delay(10);
|
||||
}
|
||||
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
||||
SDL_RenderClear(renderer);
|
||||
|
@ -113,6 +60,58 @@ void hal_render() {
|
|||
|
||||
}
|
||||
|
||||
void hal_poll_input(bool *ptr) {
|
||||
if (SDL_PollEvent(&event)) {
|
||||
|
||||
|
||||
switch (event.type) {
|
||||
case SDL_KEYDOWN:
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_LEFT:
|
||||
ptr[I_LEFT] = true;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
ptr[I_RIGHT] = true;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
ptr[I_UP] = true;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
ptr[I_DOWN] = true;
|
||||
break;
|
||||
case 'q':
|
||||
case 0x1b: //ESC
|
||||
quit = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_KEYUP:
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_LEFT:
|
||||
ptr[I_LEFT] = false;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
ptr[I_RIGHT] = false;
|
||||
break;
|
||||
case SDLK_UP:
|
||||
ptr[I_UP] = false;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
ptr[I_DOWN] = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
quit = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
SDL_Delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void debug(const char* str){
|
||||
std::cout << str << std::flush;
|
||||
|
|
87
src/main.cpp
87
src/main.cpp
|
@ -8,10 +8,12 @@
|
|||
|
||||
#include "gfx/screen.h"
|
||||
#include "gfx/canvas.h"
|
||||
#include "buttons.h"
|
||||
|
||||
#ifdef LINUX
|
||||
#include <SDL2/SDL.h>
|
||||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
extern SDL_Window* window;
|
||||
|
@ -27,27 +29,82 @@ menu* root;
|
|||
|
||||
int main() {
|
||||
|
||||
root = new menu("",
|
||||
new menu("fooa",
|
||||
new menu("foob",
|
||||
new menu("fooc", new fooValue("FOOd",5))
|
||||
root = new menu("",
|
||||
new menu("foo",
|
||||
new menu("bar",
|
||||
new menu("baz",
|
||||
new fooValue("I", 5),
|
||||
new fooValue("II", 5),
|
||||
new fooValue("III", 5),
|
||||
new fooValue("IIII", 5)
|
||||
),
|
||||
new menu("peng",
|
||||
new fooValue("o", 5),
|
||||
new fooValue("oo", 5),
|
||||
new fooValue("o o", 5)
|
||||
)
|
||||
),
|
||||
new menu("x",
|
||||
new fooValue("x x", 5),
|
||||
new fooValue("xxx", 5)
|
||||
),
|
||||
new menu("y",
|
||||
new fooValue("y y", 5),
|
||||
new fooValue("yyy", 5)
|
||||
)
|
||||
),
|
||||
new menu("foo", new fooValue("BAR",5)),
|
||||
new menu("foo", new fooValue("BAZ",5))
|
||||
),
|
||||
new menu("blub", new blubValue("BLUB",5)),
|
||||
new menu("blub", new blubValue("BLUB",5)),
|
||||
new menu("blub", new blubValue("BLUB",5))
|
||||
new menu("a",
|
||||
new blubValue("a a", 5),
|
||||
new blubValue("aa", 5),
|
||||
new blubValue("aaa", 5)
|
||||
),
|
||||
new menu("b",
|
||||
new blubValue("b b", 5),
|
||||
new blubValue("bb", 5),
|
||||
new blubValue("bbb", 5)
|
||||
),
|
||||
new menu("c",
|
||||
new blubValue("c c", 5),
|
||||
new blubValue("cc", 5),
|
||||
new blubValue("ccc", 5)
|
||||
)
|
||||
);
|
||||
|
||||
hal_init();
|
||||
hal_render();
|
||||
|
||||
|
||||
return 0;
|
||||
hal_render();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void render(){
|
||||
l.apply(root);
|
||||
input.poll();
|
||||
l.render();
|
||||
}
|
||||
|
||||
void buttons::onPush(int id, bool state) {
|
||||
if (state) {
|
||||
node *c;
|
||||
node *p;
|
||||
switch (id) {
|
||||
case I_DOWN:
|
||||
c = l.cursor;
|
||||
p = c->getParent();
|
||||
if ((c = c->getNext()) || p && (c = p->getChild())) {
|
||||
p->setCursor(c);
|
||||
l.cursor = c;
|
||||
}
|
||||
break;
|
||||
case I_RIGHT:
|
||||
c = l.cursor;
|
||||
if (c = c->getCursor()) {
|
||||
l.cursor = c;
|
||||
}
|
||||
break;
|
||||
case I_LEFT:
|
||||
c = l.cursor;
|
||||
if (c = c->getParent()) {
|
||||
l.cursor = c;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue