![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
epaper test with encoder
Dependencies: mRotaryEncoder epd1in54
Revision 0:86a20b448fa5, committed 2019-03-05
- Comitter:
- RogerJKelly
- Date:
- Tue Mar 05 21:45:12 2019 +0000
- Commit message:
- test
Changed in this revision
diff -r 000000000000 -r 86a20b448fa5 epd1in54.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/epd1in54.lib Tue Mar 05 21:45:12 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/ROM-Comm/code/epd1in54/#75b1993d74b1
diff -r 000000000000 -r 86a20b448fa5 mRotaryEncoder.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mRotaryEncoder.lib Tue Mar 05 21:45:12 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/charly/code/mRotaryEncoder/#2502b829d452
diff -r 000000000000 -r 86a20b448fa5 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 05 21:45:12 2019 +0000 @@ -0,0 +1,336 @@ +#include "mbed.h" +#include "epd1in54.h" +#include "imagedata.h" + +#include "mRotaryEncoder.h" + +#include "menu.h" + +#define HEATER_OFF 0 +#define HEATER_ON 1 + +//#include "m41t62_rtc.h" +// Control +//PinName rst; +//PinName dc; +//PinName busy; +// SPI communication +//PinName mosi; +//PinName miso; +//PinName sclk; +//PinName cs; + +PinName mosi = PA_12; //D2 p5; +PinName miso = PA_11; //D10 p6; +PinName sclk = PA_1; //A0 p7; +PinName cs = PB_0; //D3 p8; +PinName rst = PB_7; //D4 p9; +PinName dc = PB_6; //D5 p10; +PinName busy = PB_1; //D6 p11; + +Epd epd = Epd(mosi, miso, sclk, cs, dc, rst, busy); + +//RPG rpg1(PA_3,PA_4,PA_7); //Set up RPG +mRotaryEncoder enc(PA_3,PA_4,PA_7,PullUp); + +DigitalOut myled(LED1); + +//DigitalIn B_UP(PB_13); +//DigitalIn B_OK(PB_14); +//DigitalIn B_DOWN(PB_15); +//DigitalIn B_ENTER(PA_7, PullUp); + +struct sDays menu_days[7]; + + +unsigned char frame_black[EPD_HEIGHT*EPD_WIDTH/8]; + +int menu_ptr=0; // which component are we changing? +int menu_sel=0; // which component are we changing? + +// Library calls here when you go clockwise +void cw() +{ +// modify the menu pointer + menu_ptr += 1; + if ( menu_ptr > MENU_MAX ) menu_ptr = MENU_MIN; + //setleds(); +} + +// Library calls here when you go anticlockwise +void ccw() +{ +// modify the menu pointer + menu_ptr -= 1; + if ( menu_ptr < MENU_MIN ) menu_ptr = MENU_MAX; + //setleds(); +} + +// Library calls here when you push in on the encoder shaft +void btn() +{ + // change selected component (0, 1, 2) + //if (++sel>2) sel=0; + menu_sel = true; +} + + + +void draw_window( char *buf, int x, int y, int width, int height, int rot, int colored ); +//void draw_menu_window( int mptr, int start, int colored ); +void draw_menu_window( int mptr, int start, int runtime, enum cal_selected, int colored ); + +int main() +{ + /********************* + mosi = PA_12; //D2 p5; + miso = PA_11; //D10 p6; + sclk = PA_1; //A0 p7; + cs = PB_0; //D3 p8; + rst = PB_7; //D4 p9; + dc = PB_6; //D5 p10; + busy = PB_1; //D6 p11; + ***********************/ + + // Set up encoder callbacks + enc.attachROTCW(cw); + enc.attachROTCCW(ccw); + enc.attachSW(btn); + + int heater_status = HEATER_OFF; + int x_ptr = MENU_MIN; + + memset(frame_black, 0xFF, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8); + + //Epd epd = Epd(mosi, miso, sclk, cs, dc, rst, busy); + if (epd.Init(lut_full_update) != 0){ + return -1; + } + + // clear the frame to white + epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height); + epd.DisplayFrame(); + epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height); + epd.DisplayFrame(); + + + + /* Display the frame_buffer */ + //epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height); + //epd.DisplayFrame(); + + wait(2.0); + + if (epd.Init(lut_partial_update) != 0) + { + //Serial.print("e-Paper init failed"); + return -1; + } + + //epd.Sleep(); + + // load frame onto both pages of display memory + //epd.SetFrameMemory(IMAGE_DATA, 0, 0, epd.width, epd.height); + //epd.DisplayFrame(); + //epd.SetFrameMemory(IMAGE_DATA, 0, 0, epd.width, epd.height); + //epd.DisplayFrame(); + + // load rom RHC1 frame onto both pages of display memory + epd.SetFrameMemory(IMAGE_RHC4, 0, 0, epd.width, epd.height); + epd.DisplayFrame(); + epd.SetFrameMemory(IMAGE_RHC4, 0, 0, epd.width, epd.height); + epd.DisplayFrame(); + + for ( x_ptr = MENU_MIN; x_ptr <= MENU_MAX; x_ptr++ ) + { + if ( x_ptr == 0 || x_ptr == 6 ) + menu_days[x_ptr].start_hour = START_HOUR_OFF; + else + menu_days[x_ptr].start_hour = START_HOUR_DEFAULT; + + menu_days[x_ptr].runtime = RUN_TIME_DEFAULT; + menu_days[x_ptr].selected = NotSel; + draw_menu_window( x_ptr, menu_days[x_ptr].start_hour, menu_days[x_ptr].runtime, menu_days[x_ptr].selected, COLORED ); + } + epd.DisplayFrame(); + + //epd.Sleep(); + + //memset(frame_black, 0xEE, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8); + + char txtbuf[16]; + bool button_pressed = false; + + set_time(1494267665); // Set RTC time to 8 May 2017 18:21:05 UTC + + int selected = 0; + + while(1) + { + myled = 1; + wait(0.1); + myled = 0; + //wait(0.5); + //------try to update a time stamp window------- + time_t seconds = time(NULL); + char buffer[16]; + //strftime(buffer, 16, "%I:%M:%S", localtime(&seconds)); + strftime(buffer, 16, "%I:%M:%S", localtime(&seconds)); + + //dirt = rpg1.dir(); //Get Dir + //pulses = pulses + dirt; //Add Dir to count + //if (rpg1.pb()) + //{ + // pulses = 5555; //Reset count if PB pressed + //} + //printf("count: %i \r", pulses); //Print out Count + //sprintf(buffer,"%i",pulses); + //draw_window( buffer, 80, 72, 32, 126, ROTATE_270, COLORED ); + + // draw heater status --- now in image + //sprintf( txtbuf, "%s", "Status" ); + //draw_window( txtbuf, 70, 90, 32, 108, ROTATE_270, COLORED ); + for ( x_ptr = MENU_MIN; x_ptr <= MENU_MAX; x_ptr++ ) + { + //if ( menu_ptr == selected ) + // draw_menu_window( menu_ptr, menu_days[menu_ptr].start_hour, menu_days[menu_ptr].runtime, menu_days[menu_ptr].selected, UNCOLORED ); + //else + //draw_menu_window( menu_ptr, menu_days[menu_ptr].start_hour, menu_days[menu_ptr].runtime, menu_days[menu_ptr].selected, COLORED ); + draw_menu_window( x_ptr, menu_days[x_ptr].start_hour, menu_days[x_ptr].runtime, menu_days[x_ptr].selected, COLORED ); + } + // cycle through the menus + if ( menu_ptr != selected ) + { + menu_days[selected].selected = NotSel; + //selected++; + //if ( selected > MENU_MAX ) selected = MENU_MIN; + selected = menu_ptr; + menu_days[selected].selected = DoW; + } + + if( menu_sel == true ) //&& button_pressed == false) //B_ENTER == 0 ) + { + if ( button_pressed == false ) + { + if ( heater_status == HEATER_OFF ) heater_status = HEATER_ON; + else heater_status = HEATER_OFF; + button_pressed = true; + set_time(0); + time_t seconds = time(NULL); + strftime(buffer, 16, "%I:%M:%S", localtime(&seconds)); + } + if ( heater_status == HEATER_ON ) + { + sprintf( txtbuf, "%s", " ON " ); + } + else + { + sprintf( txtbuf, "%s", " OFF" ); + sprintf( buffer, "%s", "--:--:--"); + } + + draw_window( txtbuf, 10, 10, 32, 80, ROTATE_270, UNCOLORED ); // status On Off, was at x=70 + //draw_window( buffer, 160, 22, 32, 146, ROTATE_270, UNCOLORED ); // clock window + } + else + { + if ( heater_status == HEATER_OFF ) + { + sprintf( txtbuf, "%s", " OFF" ); + sprintf( buffer, "%s", "--:--:--"); + //draw_window( buffer, 160, 22, 32, 146, ROTATE_270, UNCOLORED ); // clock window + } + else + { + sprintf( txtbuf, "%s", " ON " ); + //draw_window( buffer, 160, 22, 32, 146, ROTATE_270, COLORED ); // clock window + } + + draw_window( txtbuf, 10, 10, 32, 80, ROTATE_270, COLORED ); // status On Off, was at x=70 + } + //if( rpg1.pb() ) //B_ENTER == 0 ) + //{ + // draw_window( buffer, 100, 72, 32, 126, ROTATE_270, UNCOLORED ); + //} + //else + //{ + // draw_window( buffer, 100, 72, 32, 126, ROTATE_270, COLORED ); + //} + /************************************************************************ + epd.SetWidth(32); + epd.SetHeight(126); + epd.SetRotate(ROTATE_270); + //memset(frame_black, 0xEE, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8); + //epd.SetFrameMemory(frame_black, 80, 72, epd.GetWidth(), epd.GetHeight()); + + epd.Clear(frame_black, UNCOLORED); + epd.DrawStringAt(frame_black, 4, 4, buffer, &Font24, COLORED); + epd.DrawRectangle(frame_black, 2, 2, 120, 30, COLORED); + + epd.SetFrameMemory(frame_black, 80, 72, epd.GetWidth(), epd.GetHeight()); + *************************************************************************/ + epd.DisplayFrame(); + + //if( rpg1.pb() == false ) //B_ENTER == 1 ) + if ( menu_sel == true ) + { + button_pressed = false; + menu_sel = false; + } + } +} + + +void draw_window( char *buf, int x, int y, int width, int height, int rot, int colored ) +{ + int uncolored = UNCOLORED; + epd.SetWidth(width); + epd.SetHeight(height); + epd.SetRotate(rot); + if ( colored == UNCOLORED ){ uncolored = COLORED; } + epd.Clear(frame_black, uncolored); + epd.DrawStringAt(frame_black, 4, 4, buf, &Font24, colored); + //epd.DrawRectangle(frame_black, 2, 2, 120, 30, COLORED); + epd.DrawRectangle(frame_black, 2, 2, height - 2, width - 2, colored); + epd.SetFrameMemory(frame_black, x, y, width, height); // copies buffer into screen frame memory +} + +char dow[][5] = {"Sun ", "Mon ", "Tue ", "Wed ", "Thur", "Fri ", "Sat " }; + + +void draw_menu_window( int mptr, int start, int runtime, enum cal_selected sel, int colored ) +{ + int uncolored = UNCOLORED; + int x,y; + char txtbuf[32]; + //int hours = 0; + //int width, height; + //x = menu_days[mptr].x; + //y = menu_days[mptr].y; + x = mptr * SMALL_MENU_WINDOW_WIDTH + SMALL_MENU_WINDOW_X_OFFSET; + //y = mptr * SMALL_MENU_WINDOW_HEIGHT + SMALL_MENU_WINDOW_Y_OFFSET; + y = SMALL_MENU_WINDOW_Y_OFFSET; + + epd.SetWidth(SMALL_MENU_WINDOW_WIDTH); + epd.SetHeight(SMALL_MENU_WINDOW_HEIGHT); + epd.SetRotate(ROTATE_270); + if ( runtime > 60 ) + runtime = runtime/60; + + if ( start > START_HOUR_MIN ) + { + sprintf( txtbuf, "%s %02d:00 %2d", dow[mptr], start, runtime); + } + else + { + sprintf( txtbuf, "%s %s", dow[mptr], " OFF " ); + } + + //if ( colored == UNCOLORED ){ uncolored = COLORED; } + if ( sel != NotSel ) { uncolored = COLORED; colored = UNCOLORED;} + epd.Clear(frame_black, uncolored); + epd.DrawStringAt(frame_black, 4, 4, txtbuf, &Font16, colored); + //epd.DrawRectangle(frame_black, 2, 2, 120, 30, COLORED); + //epd.DrawRectangle(frame_black, 2, 2, height - 2, width - 2, colored); + epd.SetFrameMemory(frame_black, x, y, SMALL_MENU_WINDOW_WIDTH, SMALL_MENU_WINDOW_HEIGHT); // copies buffer into screen frame memory +} \ No newline at end of file
diff -r 000000000000 -r 86a20b448fa5 mbed-os.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Tue Mar 05 21:45:12 2019 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#ed7fe215002a9c50452acfecda633ce47e00c614
diff -r 000000000000 -r 86a20b448fa5 menu.cpp
diff -r 000000000000 -r 86a20b448fa5 menu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menu.h Tue Mar 05 21:45:12 2019 +0000 @@ -0,0 +1,32 @@ + + + +#define MENU_MAX 6 +#define MENU_MIN 0 + +#define START_HOUR_MIN -1 +#define START_HOUR_OFF -1 +#define START_HOUR_MAX 24 +#define START_HOUR_INC 1 +#define START_HOUR_DEFAULT 7 + +#define RUNTIME_MIN 15 +#define RUNTIME_MAX 360 +#define RUN_TIME_INC 15 +#define RUN_TIME_DEFAULT 120 + +#define SMALL_MENU_WINDOW_WIDTH 16 +#define SMALL_MENU_WINDOW_HEIGHT 160 // should be multiples of 8??? +#define SMALL_MENU_WINDOW_X_OFFSET 72 +#define SMALL_MENU_WINDOW_Y_OFFSET 36 //96 + +enum cal_selected { NotSel, DoW, StartHr, StartMin, RunTime }; + + +struct sDays +{ + int start_hour; + int runtime; + enum cal_selected selected; +}; +