Hendrik Langer
7 years ago
10 changed files with 273 additions and 149 deletions
@ -0,0 +1,161 @@ |
|||
#include "screen.h" |
|||
|
|||
void Screen::next() { Serial.println("unhandled next"); } |
|||
void Screen::previous() { Serial.println("unhandled previous"); } |
|||
uint8_t Screen::select() { Serial.println("unhandled select"); } |
|||
|
|||
SelectionList::SelectionList() {} |
|||
|
|||
SelectionList::SelectionList(const char* title, uint8_t start_pos, const char* string_list) {} |
|||
|
|||
void SelectionList::draw() { |
|||
uint8_t item_x_offset = 15; |
|||
uint8_t header_height = 12; |
|||
uint8_t item_height = 12; |
|||
uint8_t num_active_item = current_pos - top_item; |
|||
|
|||
u8g2.clearBuffer(); |
|||
|
|||
/* draw Title */ |
|||
u8g2.setFont(u8g2_font_guildenstern_nbp_tr); |
|||
u8g2.drawUTF8(2,header_height-2,title); |
|||
u8g2.drawLine(0,header_height,u8g2.getDisplayWidth(),header_height); |
|||
|
|||
/* draw menu items */ |
|||
u8g2.setFont(u8g2_font_9x18B_tr); |
|||
for (int i=0; i<visible; i++) { |
|||
u8g2.drawUTF8(item_x_offset,header_height+2+(i+1)*item_height,string_list[top_item+i].c_str()); |
|||
} |
|||
|
|||
u8g2.drawFrame(0,header_height+1+num_active_item*item_height,u8g2.getDisplayWidth(),item_height+2 ); |
|||
u8g2.sendBuffer(); // transfer internal memory to the display
|
|||
} |
|||
|
|||
void SelectionList::next() { |
|||
if (current_pos < string_list.size()-1) current_pos++; |
|||
if (current_pos > top_item+visible-1) top_item++; |
|||
} |
|||
|
|||
void SelectionList::previous() { |
|||
if (current_pos > 0 ) current_pos--; |
|||
if (current_pos < top_item) top_item--; |
|||
} |
|||
|
|||
uint8_t SelectionList::select() { |
|||
return current_pos; |
|||
} |
|||
|
|||
namespace { |
|||
|
|||
void Drawgauge(int x, byte y, byte r, byte p, int v, int minVal, int maxVal ) { |
|||
int n=(r/100.00)*p; // calculate needle percent lenght
|
|||
|
|||
float gs_rad=-1.572; //-90 degrees in radiant
|
|||
float ge_rad=0; |
|||
float i=((v-minVal)*(ge_rad-gs_rad)/(maxVal-minVal)+gs_rad); |
|||
int xp = x+(sin(i) * n); |
|||
int yp = y-(cos(i) * n); |
|||
u8g2.drawCircle(x,y,r, U8G2_DRAW_UPPER_LEFT ); |
|||
u8g2.drawLine(x,y,xp,yp); |
|||
|
|||
gs_rad=0; |
|||
ge_rad=1.572; //90 degrees in radiant
|
|||
i=((v-minVal)*(ge_rad-gs_rad)/(maxVal-minVal)+gs_rad); |
|||
xp = x+(cos(i) * n); |
|||
yp = y-(sin(i) * n); |
|||
u8g2.drawCircle(x,y,r, U8G2_DRAW_UPPER_RIGHT ); |
|||
u8g2.drawLine(x,y,xp,yp); |
|||
|
|||
gs_rad=-1.572; |
|||
ge_rad=1.572; |
|||
i=((v-minVal)*(ge_rad-gs_rad)/(maxVal-minVal)+gs_rad); |
|||
xp = x+(sin(i) * n); |
|||
yp = y-(cos(i) * n); |
|||
u8g2.drawCircle(x,y,r, U8G2_DRAW_UPPER_LEFT|U8G2_DRAW_UPPER_RIGHT ); |
|||
u8g2.drawLine(x,y,xp,yp); |
|||
|
|||
gs_rad=-3.142; |
|||
ge_rad=1.572; |
|||
i=((v-minVal)*(ge_rad-gs_rad)/(maxVal-minVal)+gs_rad); |
|||
xp = x+(sin(i) * n); |
|||
yp = y-(cos(i) * n); |
|||
u8g2.drawCircle(x,y,r, U8G2_DRAW_UPPER_LEFT|U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT ); |
|||
u8g2.drawLine(x,y,xp,yp); |
|||
|
|||
gs_rad=-1.572; |
|||
ge_rad=3.141; |
|||
i=((v-minVal)*(ge_rad-gs_rad)/(maxVal-minVal)+gs_rad); |
|||
xp = x+(sin(i) * n); |
|||
yp = y-(cos(i) * n); |
|||
u8g2.drawCircle(x,y,r, U8G2_DRAW_UPPER_LEFT|U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_RIGHT ); |
|||
u8g2.drawLine(x,y,xp,yp); |
|||
} |
|||
} |
|||
|
|||
void MainScreen::draw() { |
|||
u8g2.clearBuffer(); // clear the internal memory
|
|||
|
|||
if(millis() - lastVolumeChange <= 1000) { |
|||
//u8g2.drawXBMP(0,0, IMG_1872_width, IMG_1872_height, IMG_1872_bits);
|
|||
u8g2.setFont(u8g2_font_inb19_mf); |
|||
u8g2.drawStr(20, 20, "Volume"); |
|||
|
|||
u8g2.drawRBox(10, 28, 108, 22, 5); |
|||
u8g2.setDrawColor(0); |
|||
u8g2.drawBox(14+volume, 31, 100-volume, 14); |
|||
char volumeStr[6]; |
|||
sprintf(volumeStr, "%d %%", volume); |
|||
u8g2.setFont(u8g2_font_crox3cb_mf); |
|||
u8g2.setFontMode(1); |
|||
u8g2.setDrawColor(2); |
|||
u8g2.drawStr(40, 45, volumeStr); |
|||
u8g2.setFontMode(0); |
|||
u8g2.setDrawColor(1); |
|||
} else { |
|||
|
|||
u8g2.setFont(u8g2_font_inb19_mf); |
|||
u8g2.drawStr(0, 20, timeStr); |
|||
|
|||
char weather[32]; |
|||
u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font
|
|||
sprintf(weather, "%.1f°C %.1f%% %.0fhPa", bme280.readTemperature(), bme280.readHumidity(), bme280.readPressure()); |
|||
u8g2.drawUTF8(0, 30, weather); |
|||
u8g2.setFont(u8g2_font_prospero_bold_nbp_tf); // choose a suitable font
|
|||
|
|||
u8g2_uint_t width = u8g2.getUTF8Width(titleStr); // calculate the pixel width of the text
|
|||
// repeated drawing of the scrolling text...
|
|||
u8g2.drawUTF8(titleStr_offset, 54, titleStr); // draw the scolling text
|
|||
|
|||
titleStr_offset-=4; // scroll by one pixel
|
|||
if ( (u8g2_uint_t)titleStr_offset < (u8g2_uint_t)-width ) |
|||
titleStr_offset = 0; // start over again // u8g2.getDisplayWidth()
|
|||
} |
|||
u8g2.sendBuffer(); |
|||
// bme280.printValues();
|
|||
} |
|||
|
|||
uint8_t MainScreen::select() { |
|||
if(millis() - lastButtonPress >= 1000) { |
|||
Serial.println("Button pressed"); |
|||
lastButtonPress = millis(); |
|||
if (mp3.playing) { |
|||
mp3.stop(); |
|||
} else { |
|||
mp3.start(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void MainScreen::next() { |
|||
if (volume < 100) volume++; |
|||
lastVolumeChange = millis(); |
|||
mp3.setVolume(volume); |
|||
Serial.printf("volume: %d\n", volume); |
|||
} |
|||
|
|||
void MainScreen::previous() { |
|||
if (volume > 0) volume--; |
|||
lastVolumeChange = millis(); |
|||
mp3.setVolume(volume); |
|||
Serial.printf("volume: %d\n", volume); |
|||
} |
@ -0,0 +1,76 @@ |
|||
#ifndef _SCREEN_H |
|||
#define _SCREEN_H |
|||
|
|||
#include <Arduino.h> |
|||
#include <vector> |
|||
#include <string> |
|||
|
|||
#include <U8g2lib.h> |
|||
#ifdef U8X8_HAVE_HW_SPI |
|||
#include <SPI.h> |
|||
#endif |
|||
#ifdef U8X8_HAVE_HW_I2C |
|||
#include <Wire.h> |
|||
#endif |
|||
|
|||
#include "mp3.h" |
|||
#include "BME280.h" |
|||
#include "image.h" |
|||
|
|||
extern U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2; |
|||
extern char timeStr[]; |
|||
extern BME280 bme280; |
|||
extern MP3 mp3; |
|||
|
|||
class Screen { |
|||
public: |
|||
// Screen();
|
|||
virtual void draw(void) = 0; |
|||
virtual void next(void); |
|||
virtual void previous(void); |
|||
virtual uint8_t select(void); |
|||
const char* title = "Test Screen"; |
|||
private: |
|||
}; |
|||
|
|||
class SelectionList : public Screen { |
|||
public: |
|||
SelectionList(); |
|||
SelectionList(const char*, uint8_t, const char*); |
|||
void draw(void) override; |
|||
void next(void) override; |
|||
void previous(void) override; |
|||
uint8_t select(void) override; |
|||
const char* title = "Cloud Types"; |
|||
private: |
|||
std::vector<std::string> string_list = { |
|||
"Altocumulus\n", |
|||
"Altostratus\n", |
|||
"Cirrocumulus\n", |
|||
"Cirrostratus\n", |
|||
"Cirrus\n", |
|||
"Cumulonimbus\n", |
|||
"Cumulus\n", |
|||
"Nimbostratus\n", |
|||
"Stratocumulus\n", |
|||
"Stratus" }; |
|||
uint8_t current_pos = 0; |
|||
uint8_t top_item = 0; |
|||
uint8_t visible = 4; |
|||
}; |
|||
|
|||
class MainScreen : public Screen { |
|||
public: |
|||
void draw(void) override; |
|||
void next(void) override; |
|||
void previous(void) override; |
|||
uint8_t select(void) override; |
|||
const char* title = "Main Screen"; |
|||
private: |
|||
uint32_t lastButtonPress = 0; |
|||
uint32_t lastVolumeChange = 0; |
|||
u8g2_uint_t titleStr_offset = 0; |
|||
uint8_t volume = 20; |
|||
}; |
|||
|
|||
#endif /* _SCREEN_H */ |
@ -1,42 +0,0 @@ |
|||
#include "selectionlist.h" |
|||
|
|||
SelectionList::SelectionList() {} |
|||
|
|||
SelectionList::SelectionList(const char* title, uint8_t start_pos, const char* string_list) {} |
|||
|
|||
void SelectionList::draw() { |
|||
uint8_t item_x_offset = 15; |
|||
uint8_t header_height = 12; |
|||
uint8_t item_height = 12; |
|||
uint8_t num_active_item = current_pos - top_item; |
|||
|
|||
u8g2.clearBuffer(); |
|||
|
|||
/* draw Title */ |
|||
u8g2.setFont(u8g2_font_guildenstern_nbp_tr); |
|||
u8g2.drawUTF8(2,header_height-2,title); |
|||
u8g2.drawLine(0,header_height,u8g2.getDisplayWidth(),header_height); |
|||
|
|||
/* draw menu items */ |
|||
u8g2.setFont(u8g2_font_9x18B_tr); |
|||
for (int i=0; i<visible; i++) { |
|||
u8g2.drawUTF8(item_x_offset,header_height+2+(i+1)*item_height,string_list[top_item+i].c_str()); |
|||
} |
|||
|
|||
u8g2.drawFrame(0,header_height+1+num_active_item*item_height,u8g2.getDisplayWidth(),item_height+2 ); |
|||
u8g2.sendBuffer(); // transfer internal memory to the display
|
|||
} |
|||
|
|||
void SelectionList::next() { |
|||
if (current_pos < string_list.size()-1) current_pos++; |
|||
if (current_pos > top_item+visible-1) top_item++; |
|||
} |
|||
|
|||
void SelectionList::previous() { |
|||
if (current_pos > 0 ) current_pos--; |
|||
if (current_pos < top_item) top_item--; |
|||
} |
|||
|
|||
uint8_t SelectionList::select() { |
|||
return current_pos; |
|||
} |
@ -1,44 +0,0 @@ |
|||
#ifndef _SELECTIONLIST_H |
|||
#define _SELECTIONLIST_H |
|||
|
|||
#include <Arduino.h> |
|||
#include <vector> |
|||
#include <string> |
|||
|
|||
#include <U8g2lib.h> |
|||
#ifdef U8X8_HAVE_HW_SPI |
|||
#include <SPI.h> |
|||
#endif |
|||
#ifdef U8X8_HAVE_HW_I2C |
|||
#include <Wire.h> |
|||
#endif |
|||
|
|||
extern U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2; |
|||
|
|||
class SelectionList { |
|||
public: |
|||
SelectionList(); |
|||
SelectionList(const char*, uint8_t, const char*); |
|||
void draw(void); |
|||
void next(void); |
|||
void previous(void); |
|||
uint8_t select(void); |
|||
private: |
|||
const char* title = "Cloud Types"; |
|||
std::vector<std::string> string_list = { |
|||
"Altocumulus\n", |
|||
"Altostratus\n", |
|||
"Cirrocumulus\n", |
|||
"Cirrostratus\n", |
|||
"Cirrus\n", |
|||
"Cumulonimbus\n", |
|||
"Cumulus\n", |
|||
"Nimbostratus\n", |
|||
"Stratocumulus\n", |
|||
"Stratus" }; |
|||
uint8_t current_pos = 0; |
|||
uint8_t top_item = 0; |
|||
uint8_t visible = 4; |
|||
}; |
|||
|
|||
#endif /* _SELECTIONLIST_H */ |
Loading…
Reference in new issue