Lightweight proportional text library for C12832 LCD. Easy to modify, fast, robust and compact. Nice font, good for text driven menus, messages, etc. Fell free to use and modify in any projects.

Dependents:   app-board-lcd128

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lcd128menu.cpp Source File

lcd128menu.cpp

00001 //
00002 // MBED Application Board
00003 // Lightweight Menu-driven Interface
00004 // 2014, Alexander Medvedev, @medvdv
00005 //
00006 
00007 #include "mbed.h"
00008 
00009 #include "lcd128lib.h"
00010 #include "lcd128menu.h"
00011 
00012 /*
00013 #define APPMENU_END      0      // End of menu
00014 #define APPMENU_ACTION   1      // Standart item - action
00015 #define APPMENU_BREAK    2      // Break line "----"
00016 #define APPMENU_SUBMENU  3      // Enter to other menu
00017 #define APPMENU_COMMENT  4      // Text comment, not active    
00018 #define APPMENU_CHECK    5      // Check box
00019 #define APPMENU_RADIO    6      // One of radio buttons
00020 #define APPMENU_NUMBER   7      // Integer number [minimum +step +2step ... maximum]
00021 #define APPMENU_PROGRESS 8      // Float level [0.0 .. 1.0]
00022 */
00023 
00024 #define APPMENU_WIDTH (LCD_X-APPMENU_TAB*2)
00025 
00026 void lcd128draw(lcd128 * lcd, lcd128entry * entry, int row)
00027 {
00028     lcd->XY(APPMENU_TAB, row);
00029     
00030     lcd->Bold(entry->bold);
00031     lcd->Underline(entry->underline);
00032     
00033     switch (entry->type) {
00034         case 0:
00035         default: 
00036             break;
00037         
00038         case 3:
00039             lcd->Character(LCD_PLAY);         
00040         case 1:
00041         case 4:
00042             lcd->String(entry->name); 
00043             break;
00044         
00045         case 2: 
00046             lcd->Write(APPMENU_DELIMITER, entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH ); 
00047             break; 
00048             
00049         case 5: 
00050             lcd->Character( ((bool*)entry->parameter)[0] ? LCD_CHECK_ON : LCD_CHECK_OFF );
00051             lcd->Character(LCD_SHORT_SPACE);
00052             lcd->String(entry->name); 
00053             break;
00054 
00055         case 6: 
00056             lcd->Character( (((int*)entry->parameter)[0] == entry->id) ? LCD_RADIO_ON : LCD_RADIO_OFF );
00057             lcd->Character(LCD_SHORT_SPACE);
00058             lcd->String(entry->name); 
00059             break;
00060             
00061         case 8:
00062             lcd->Bar(entry->bold ? APPMENU_WIDTH/2 : APPMENU_WIDTH, *(float*)entry->parameter);
00063             break;
00064     }
00065 
00066     lcd->Bold(false);
00067     lcd->Underline(false);
00068 }
00069 
00070 int lcd128menu(lcd128 * lcd, lcd128entry * menu, int N, bool LastRow, 
00071                PinName pUp, PinName pDown, PinName pLeft, PinName pRight, PinName pFire)
00072 {
00073     if (N <= 0) return -1;
00074     
00075     BusIn joy(pUp, pDown, pLeft, pRight);
00076     DigitalIn fire(pFire);
00077 
00078     lcd128entry * menuCurrent = menu;
00079     int item = 0;    
00080 
00081     do {
00082             
00083         lcd -> Clear();
00084         
00085         lcd128draw(lcd, menuCurrent + item, 1);
00086                                         
00087         if (item > 0)     lcd128draw(lcd, menuCurrent + item - 1, 0);
00088         if (item < (N-1)) lcd128draw(lcd, menuCurrent + item + 1, 2);
00089         if (item < (N-2)) if (LastRow) lcd128draw(lcd, menuCurrent + item + 2, 3);
00090         
00091         lcd -> InverseRow(1);
00092         lcd -> InverseRow(0, 0x80);
00093         
00094         lcd -> Update();
00095         
00096         wait_ms(100);
00097 
00098         while((joy == 0) && (fire == 0)) wait_ms(100);
00099         
00100         if (joy & 1) if(item > 0) item--; 
00101         if (joy & 2) if(item < (N-1)) item++; 
00102                         
00103     } while(1);
00104 }