epaper test with encoder

Dependencies:   mRotaryEncoder epd1in54

Files at this revision

API Documentation at this revision

Comitter:
RogerJKelly
Date:
Tue Mar 05 21:45:12 2019 +0000
Commit message:
test

Changed in this revision

epd1in54.lib Show annotated file Show diff for this revision Revisions of this file
mRotaryEncoder.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
menu.cpp Show annotated file Show diff for this revision Revisions of this file
menu.h Show annotated file Show diff for this revision Revisions of this file
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;
+};
+