commit
0cb6b56cc9
21 changed files with 329 additions and 197 deletions
6
Makefile
6
Makefile
|
@ -14,9 +14,13 @@ lib/libssd1306.a:
|
||||||
@mkdir -p lib
|
@mkdir -p lib
|
||||||
@cp deps/ssd1306/bld/libssd1306.a lib/libssd1306.a
|
@cp deps/ssd1306/bld/libssd1306.a lib/libssd1306.a
|
||||||
|
|
||||||
flash:
|
flash: avr
|
||||||
@make -f avr.Makefile flash
|
@make -f avr.Makefile flash
|
||||||
|
|
||||||
|
run: linux
|
||||||
|
@make -f linux.Makefile run
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -r build
|
@rm -r build
|
||||||
@echo clean all
|
@echo clean all
|
||||||
|
|
2
OBJECTS
2
OBJECTS
|
@ -1,5 +1,5 @@
|
||||||
TARGET = main
|
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
|
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
|
|
@ -17,7 +17,7 @@ public:
|
||||||
|
|
||||||
class fooValue : public value {
|
class fooValue : public value {
|
||||||
public:
|
public:
|
||||||
fooValue(const char* str, int val) : value(str, val, 64, 96) {
|
fooValue(const char* str, int val) : value(str, val, 32, 48) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(canvas &c);
|
void render(canvas &c);
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
//
|
|
||||||
// Created by jedi on 11/2/18.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MGL_DMXMENU_BUFFER_8_H
|
|
||||||
#define MGL_DMXMENU_BUFFER_8_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //MGL_DMXMENU_BUFFER_8_H
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include "gfx/font.h"
|
#include "gfx/font.h"
|
||||||
#include "fonts/basic_5x4.h"
|
#include "fonts/basic_5x4.h"
|
||||||
#include "gfx/buffer.h"
|
#include "gfx/buffer.h"
|
||||||
#include "gfx/buffer_32.h"
|
|
||||||
|
|
||||||
class screen;
|
class screen;
|
||||||
|
|
||||||
|
|
|
@ -11,18 +11,19 @@
|
||||||
class layout {
|
class layout {
|
||||||
class Slot {
|
class Slot {
|
||||||
private:
|
private:
|
||||||
int pos_;
|
int pos_ = 0;
|
||||||
int size_;
|
int size_ = 0;
|
||||||
canvas *canvas_ = 0;
|
canvas *canvas_ = nullptr;
|
||||||
public:
|
public:
|
||||||
node *content;
|
node *content = nullptr;
|
||||||
friend layout;
|
friend layout;
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const int maxwidth_;
|
const int maxwidth_;
|
||||||
|
const int maxheight_;
|
||||||
int allocated_;
|
int allocated_;
|
||||||
screen screen_;
|
screen& screen_;
|
||||||
|
|
||||||
int allocate_(node *, int);
|
int allocate_(node *, int);
|
||||||
|
|
||||||
|
@ -34,8 +35,9 @@ private:
|
||||||
public:
|
public:
|
||||||
static const int maxslots = 10;
|
static const int maxslots = 10;
|
||||||
Slot slots[maxslots];
|
Slot slots[maxslots];
|
||||||
|
node *cursor;
|
||||||
|
|
||||||
layout(int width) : maxwidth_(width), screen_(width, 32) {
|
layout(screen& s) : maxwidth_(s.getWidth()), maxheight_(s.getHeight()), screen_(s) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,28 +14,19 @@ private:
|
||||||
const int height_;
|
const int height_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
screen(int w, int h) : width_(w), height_(h) {
|
screen(int w, int h);
|
||||||
|
|
||||||
}
|
void draw(int x, int y);
|
||||||
|
|
||||||
void draw(int x, int y) {
|
void draw(int x, int y, canvas &c);
|
||||||
hal_draw(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw(int x, int y, canvas &c) {
|
void print(int x, int y, const char *str, font & = basic_5x4);
|
||||||
for (int x_ = 0; x_ < 128; x_++)
|
|
||||||
for (int y_ = 0; y_ < 32; y_++)
|
|
||||||
if (c.buffer_.get(x_ * 32 + y_))
|
|
||||||
hal_draw(x + x_, y + y_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void print(int x, int y, const char *str, font & = basic_5x4){
|
void print(int x, int y, char *str, font & = basic_5x4);
|
||||||
|
|
||||||
}
|
int getWidth();
|
||||||
|
|
||||||
void print(int x, int y, char *str, font & = basic_5x4){
|
int getHeight();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,21 +2,14 @@
|
||||||
#ifndef _HAL_H_
|
#ifndef _HAL_H_
|
||||||
#define _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 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_draw(int x, int y);
|
||||||
void hal_print(int x, int y, const char* str);
|
|
||||||
void hal_render();
|
void hal_render();
|
||||||
void render();
|
void render();
|
||||||
void quit();
|
|
||||||
|
|
||||||
extern bool input[4];
|
|
||||||
|
|
||||||
#ifndef LINUX
|
#ifndef LINUX
|
||||||
|
|
||||||
|
@ -25,7 +18,4 @@ void operator delete(void * ptr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const int SCREEN_WIDTH;
|
|
||||||
extern const int SCREEN_HEIGHT;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
33
inc/node.h
33
inc/node.h
|
@ -9,9 +9,10 @@
|
||||||
|
|
||||||
class node {
|
class node {
|
||||||
private:
|
private:
|
||||||
node *parent_ = 0;
|
node *parent_ = nullptr;
|
||||||
node *child_ = 0;
|
node *child_ = nullptr;
|
||||||
node *next_ = 0;
|
node *cursor_ = nullptr;
|
||||||
|
node *next_ = nullptr;
|
||||||
|
|
||||||
void addNodes(bool b) {
|
void addNodes(bool b) {
|
||||||
}
|
}
|
||||||
|
@ -30,17 +31,19 @@ public:
|
||||||
|
|
||||||
virtual void render(canvas &c) = 0;
|
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),
|
explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), next_(nullptr),
|
||||||
child_(nullptr),
|
child_(nullptr),
|
||||||
parent_(nullptr) {
|
parent_(nullptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ... Args>
|
template<typename ... Args>
|
||||||
node(const char *t, node *n, Args ... ns) : title_(t), minsize(24), maxsize(48) {
|
node(const char *t, node *n, Args ... ns) : title_(t), minsize(24), maxsize(48) {
|
||||||
child_ = n;
|
child_ = n;
|
||||||
|
cursor_ = n;
|
||||||
n->parent_ = this;
|
n->parent_ = this;
|
||||||
child_->addNodes(true, ns...);
|
child_->addNodes(true, ns...);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +51,22 @@ public:
|
||||||
node *getChild() {
|
node *getChild() {
|
||||||
return child_;
|
return child_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node *getNext() {
|
||||||
|
return next_;
|
||||||
|
}
|
||||||
|
|
||||||
|
node *getCursor() {
|
||||||
|
return cursor_;
|
||||||
|
}
|
||||||
|
|
||||||
|
node *getParent() {
|
||||||
|
return parent_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCursor(node *c) {
|
||||||
|
cursor_ = c;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,3 +42,7 @@ $(OBJDIR):
|
||||||
clean:
|
clean:
|
||||||
@$(REMOVEDIR) "$(OBJDIR)"
|
@$(REMOVEDIR) "$(OBJDIR)"
|
||||||
@echo clean $(OBJDIR)
|
@echo clean $(OBJDIR)
|
||||||
|
|
||||||
|
run: $(OBJDIR)/$(TARGET)
|
||||||
|
@echo run $(OBJDIR)/$(TARGET)
|
||||||
|
@$(OBJDIR)/$(TARGET)
|
||||||
|
|
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 "example.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/canvas.h"
|
||||||
|
@ -9,15 +10,15 @@ int j = 0;
|
||||||
|
|
||||||
void fooValue::render(canvas& c){
|
void fooValue::render(canvas& c){
|
||||||
|
|
||||||
for(int i = 0; i<32; i++)
|
for(int i = 0; i<c.getHeight(); i++)
|
||||||
c.draw(0,i);
|
c.draw(0,i);
|
||||||
|
|
||||||
|
|
||||||
c.print(5 , 10, title_);
|
c.print(10 , 10, title_);
|
||||||
peng[0] = input[0] ? 'L' : ' ';
|
peng[0] = input.raw[0] ? 'L' : ' ';
|
||||||
peng[1] = input[1] ? 'R' : ' ';
|
peng[1] = input.raw[1] ? 'R' : ' ';
|
||||||
peng[2] = input[2] ? 'U' : ' ';
|
peng[2] = input.raw[2] ? 'U' : ' ';
|
||||||
peng[3] = input[3] ? 'D' : ' ';
|
peng[3] = input.raw[3] ? 'D' : ' ';
|
||||||
j++;
|
j++;
|
||||||
j %= 10;
|
j %= 10;
|
||||||
peng[4] = 'A' + j;
|
peng[4] = 'A' + j;
|
||||||
|
@ -25,16 +26,22 @@ void fooValue::render(canvas& c){
|
||||||
}
|
}
|
||||||
|
|
||||||
void blubValue::render(canvas& c){
|
void blubValue::render(canvas& c){
|
||||||
for(int i = 0; i<32;i++)
|
for(int i = 0; i<c.getHeight();i++)
|
||||||
c.draw(0,i);
|
c.draw(0,i);
|
||||||
|
|
||||||
c.print(5 , 10, title_);
|
c.print(3 , 15, title_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu::render(canvas& c){
|
void menu::render(canvas& c){
|
||||||
|
|
||||||
for(int i = 0; i<32;i++)
|
for(int i = 0; i<c.getHeight();i++)
|
||||||
c.draw(0,i);
|
c.draw(0,i);
|
||||||
|
|
||||||
c.print(5, 10, title_);
|
int r = 0;
|
||||||
|
node* ptr = getChild();
|
||||||
|
while(ptr){
|
||||||
|
c.print(3,6*r+2, ptr->title_);
|
||||||
|
ptr = ptr->getNext();
|
||||||
|
r++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
//
|
|
||||||
// Created by jedi on 11/2/18.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "gfx/buffer_32.h"
|
|
|
@ -15,7 +15,8 @@ void canvas::clear() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::draw(int x, int y) {
|
void canvas::draw(int x, int y) {
|
||||||
buffer_.set(x * height_ + y, true);
|
if (y < height_ && x < width_)
|
||||||
|
buffer_.set(x * height_ + y, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::print(int x, int y, const char *str, font& f) {
|
void canvas::print(int x, int y, const char *str, font& f) {
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "gfx/layout.h"
|
#include "gfx/layout.h"
|
||||||
|
|
||||||
|
|
||||||
void layout::render() {
|
void layout::render() {
|
||||||
for (int j = 0; j < allocated_; j++) {
|
for (int j = 0; j < allocated_; j++) {
|
||||||
node *node_ptr;
|
node *node_ptr;
|
||||||
|
@ -19,8 +18,10 @@ void layout::render() {
|
||||||
|
|
||||||
int layout::apply(node* node) {
|
int layout::apply(node* node) {
|
||||||
int rootslot = allocate_(node, maxslots);
|
int rootslot = allocate_(node, maxslots);
|
||||||
int minsize = pack_(rootslot);
|
int minsize = pack_(rootslot + 1);
|
||||||
expand_(minsize);
|
expand_(minsize);
|
||||||
|
if (cursor == nullptr)
|
||||||
|
cursor = slots[rootslot].content->getCursor();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,14 +46,16 @@ int layout::expand_(int packedsize) {
|
||||||
if (size > slots[i].content->maxsize)
|
if (size > slots[i].content->maxsize)
|
||||||
size = slots[i].content->maxsize;
|
size = slots[i].content->maxsize;
|
||||||
slots[i].size_ = size;
|
slots[i].size_ = size;
|
||||||
slots[i].canvas_ = new canvas(size, 32);
|
if(slots[i].canvas_)
|
||||||
|
delete slots[i].canvas_;
|
||||||
|
slots[i].canvas_ = new canvas(size, maxheight_);
|
||||||
pos += size;
|
pos += size;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int layout::allocate_(node* current, int depth) {
|
int layout::allocate_(node* current, int depth) {
|
||||||
if (node* next = current->getChild()) {
|
if (node* next = current->getCursor()) {
|
||||||
int i = allocate_(next, depth) + 1;
|
int i = allocate_(next, depth) + 1;
|
||||||
slots[i].content = current;
|
slots[i].content = current;
|
||||||
return i;
|
return i;
|
||||||
|
|
|
@ -3,3 +3,34 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "gfx/screen.h"
|
#include "gfx/screen.h"
|
||||||
|
|
||||||
|
screen::screen(int w, int h) : width_(w), height_(h) {
|
||||||
|
hal_init_screen(w,h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen::draw(int x, int y) {
|
||||||
|
hal_draw(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen::draw(int x, int y, canvas &c) {
|
||||||
|
for (int x_ = 0; x_ < width_; x_++)
|
||||||
|
for (int y_ = 0; y_ < height_; y_++)
|
||||||
|
if (c.buffer_.get(x_ * height_ + y_))
|
||||||
|
hal_draw(x + x_, y + y_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen::print(int x, int y, const char *str, font& f) {
|
||||||
|
//f.print(x, y, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen::print(int x, int y, char *str, font& f) {
|
||||||
|
//f.print(x, y, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
int screen::getWidth(){
|
||||||
|
return width_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int screen::getHeight(){
|
||||||
|
return height_;
|
||||||
|
}
|
|
@ -1,9 +1,5 @@
|
||||||
#include "hal/hal.h"
|
#include "hal/hal.h"
|
||||||
|
|
||||||
const int SCREEN_WIDTH = 128;
|
|
||||||
const int SCREEN_HEIGHT = 32;
|
|
||||||
|
|
||||||
bool input[4];
|
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
#include "hal/linux.cpp"
|
#include "hal/linux.cpp"
|
||||||
|
|
|
@ -4,35 +4,39 @@
|
||||||
|
|
||||||
#include "ssd1306.h"
|
#include "ssd1306.h"
|
||||||
#include "nano_gfx.h"
|
#include "nano_gfx.h"
|
||||||
|
#include "buttons.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <hal/hal.h>
|
||||||
|
|
||||||
uint8_t canvasData[SCREEN_WIDTH*(SCREEN_HEIGHT/8)];
|
uint8_t canvasData[128 * (32 / 8)];
|
||||||
NanoCanvas canvas(SCREEN_WIDTH, SCREEN_HEIGHT, canvasData);
|
NanoCanvas canvas(128, 32, canvasData);
|
||||||
|
|
||||||
void hal_init(){
|
void hal_init_screen(int w, int h) {
|
||||||
ssd1306_128x32_i2c_init();
|
ssd1306_128x32_i2c_init();
|
||||||
ssd1306_fillScreen( 0x00 );
|
|
||||||
canvas.clear();
|
DDRD = 0;
|
||||||
|
PORTD |= (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_draw(int x, int y){
|
void hal_draw(int x, int y){
|
||||||
canvas.putPixel(x, 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() {
|
void hal_render() {
|
||||||
|
while (true) {
|
||||||
DDRD = 0;
|
ssd1306_fillScreen( 0x00 );
|
||||||
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);
|
|
||||||
|
|
||||||
canvas.clear();
|
|
||||||
render();
|
render();
|
||||||
canvas.blt(0, 0);
|
canvas.blt(0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,88 +7,45 @@
|
||||||
//Using SDL and standard IO
|
//Using SDL and standard IO
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <buttons.h>
|
||||||
|
|
||||||
SDL_Window *window = nullptr;
|
SDL_Window *window = nullptr;
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
SDL_Renderer *renderer;
|
SDL_Renderer *renderer;
|
||||||
|
|
||||||
void hal_init() {
|
|
||||||
|
void hal_init_screen(int width, int height){
|
||||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||||
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
|
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Create window
|
||||||
|
window = SDL_CreateWindow("SDL Tutorial", 0, 0, width, height,
|
||||||
|
SDL_WINDOW_SHOWN); //|SDL_WINDOW_BORDERLESS
|
||||||
|
if (window == nullptr) {
|
||||||
|
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* //Create window
|
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
|
||||||
window = SDL_CreateWindow( "SDL Tutorial", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS );
|
if (renderer == nullptr) {
|
||||||
if( window == NULL ) {
|
printf("Renderer could not be created! SDL_Error: %s\n", SDL_GetError());
|
||||||
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
|
exit(1);
|
||||||
exit(1);
|
}
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
SDL_CreateWindowAndRenderer(SCREEN_WIDTH, SCREEN_HEIGHT, 0, &window, &renderer);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_draw(int x, int y){
|
void hal_draw(int x, int y){
|
||||||
SDL_RenderDrawPoint(renderer, x, y);
|
SDL_RenderDrawPoint(renderer, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_print(int x, int y, const char* str){
|
|
||||||
//TODO delete
|
bool quit = false;
|
||||||
}
|
|
||||||
|
|
||||||
void hal_render() {
|
void hal_render() {
|
||||||
|
|
||||||
bool quit = false;
|
|
||||||
|
|
||||||
while (!quit) {
|
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;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_QUIT:
|
|
||||||
quit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SDL_Delay(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
||||||
SDL_RenderClear(renderer);
|
SDL_RenderClear(renderer);
|
||||||
|
@ -103,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){
|
void debug(const char* str){
|
||||||
std::cout << str << std::flush;
|
std::cout << str << std::flush;
|
||||||
|
|
112
src/main.cpp
112
src/main.cpp
|
@ -8,10 +8,12 @@
|
||||||
|
|
||||||
#include "gfx/screen.h"
|
#include "gfx/screen.h"
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/canvas.h"
|
||||||
|
#include "buttons.h"
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
extern SDL_Window* window;
|
extern SDL_Window* window;
|
||||||
|
@ -20,47 +22,89 @@ extern SDL_Renderer *renderer;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
layout* lp;
|
|
||||||
|
screen s(128,32);
|
||||||
|
layout l(s);
|
||||||
|
menu* root;
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
|
root = new menu("",
|
||||||
|
new menu("foo",
|
||||||
//build tree
|
new menu("baz",
|
||||||
menu root(nullptr,
|
new fooValue("I", 5),
|
||||||
new menu("foo1",
|
new fooValue("II", 5),
|
||||||
new menu("foo2",
|
new fooValue("III", 5),
|
||||||
new menu("foo3", new fooValue("FOO4",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("a",
|
||||||
new menu("foo", new fooValue("BAZ",5))
|
new blubValue("a a", 5),
|
||||||
),
|
new blubValue("aa", 5),
|
||||||
new menu("blub", new blubValue("BLUB",5)),
|
new blubValue("aaa", 5)
|
||||||
new menu("blub", new blubValue("BLUB",5)),
|
),
|
||||||
new menu("blub", new blubValue("BLUB",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)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
///root.p(0);
|
hal_render();
|
||||||
|
return 0;
|
||||||
|
|
||||||
//walk tree + allocate slots
|
|
||||||
//position slots
|
|
||||||
// 128 x 32
|
|
||||||
screen s(128, 32);//<128, 32> s;
|
|
||||||
|
|
||||||
layout l(128);
|
|
||||||
l.apply(&root);
|
|
||||||
lp=&l;
|
|
||||||
|
|
||||||
|
|
||||||
//render
|
|
||||||
hal_init();
|
|
||||||
hal_render();
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(){
|
void render(){
|
||||||
lp->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_UP:
|
||||||
|
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