Release 1.01

Dependents:   mbed_escm2000

Revision:
4:7226c43320b5
Child:
5:9f4d4f8ffc00
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EditAddressMenu.cpp	Thu Sep 12 11:27:50 2019 +0000
@@ -0,0 +1,314 @@
+#include "mbed.h"
+#include "EditAddressMenu.h"
+#include "TimeUtilities.h"
+#include "ESCMControlApp.h"
+
+#define DEFAULT_DISPLAY 0
+#define SELECT_ADDRESS  1
+#define EDIT_ADDRESS    2
+
+
+string valid_characters = {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 " };
+
+EditAddressMenu::EditAddressMenu(char* id): Menu(id)
+{
+
+    active_selection = 0;
+    active_address   = 0;
+    active_position  = 0;
+
+    row=0;
+    column=0;
+
+
+}
+
+
+
+void EditAddressMenu::init()
+{
+    active_selection = 0;
+    active_address   = 0;
+    active_position  = 0;
+    update_needed    = 1;
+    
+    top = active_address;
+    bottom  = active_address +2;
+}
+
+void EditAddressMenu::display(LCD * lcd) 
+{
+    // paging
+    if (active_address < top )
+    {
+        top    = active_address ;
+        bottom = active_address + 2;
+        update_needed=1;
+    }
+    else if (active_address > bottom)
+    {
+        top    = active_address - 2;
+        bottom = active_address;
+        update_needed=1;
+    } 
+    else
+    {
+        
+    }
+    
+    
+    if (update_needed) {
+        
+        lcd->cls();
+        switch(active_selection) {
+            // -----------------------------------------------------------------
+            //Select Address
+            // -----------------------------------------------------------------
+            case SELECT_ADDRESS:
+                {       
+                    lcd->locate(0,0);
+                    lcd->printf("Select Address :");
+                    lcd->locate(1,0);
+                    
+                    Address *addr = &addressMap.addresses[active_address];
+                    
+                    lcd->printf(" %02d | %-20s", 
+                        addr->address ,  
+                        addr->description );
+                }
+                break;
+                
+            // -----------------------------------------------------------------
+            // Select Char
+            // -----------------------------------------------------------------
+            case EDIT_ADDRESS:
+            
+                {
+                    Address *addr = &addressMap.addresses[active_address];
+                    
+                    lcd->locate(0,0);
+                    lcd->printf("Edit Text (%02d):" ,  addr->address  );
+                    lcd->locate(1,0);
+                    lcd->printf("Current Text : [%-20s]",  addr->description );
+                    lcd->locate(2,0);
+                    lcd->printf("Updated Text : [%-20s]",  tmp_description );
+                    lcd->locate(3,active_position+16);
+                    lcd->printf("^" );
+                }
+                break;
+                
+            // -----------------------------------------------------------------
+            // Display
+            // -----------------------------------------------------------------
+            default:
+#if 1
+                lcd->locate(0,0);
+                lcd->printf("Address Map:");
+#else
+                lcd->locate(0,0);
+                lcd->printf("index=%d, (%d %d)", active_address, top, bottom);
+#endif
+                // update display
+                for(int i=0; i<3; i++) {
+
+                    int index = top + i;
+                    int line  = (1+i);
+
+                    int selected = active_address == index;
+
+                    if(selected) {
+                        lcd->locate(line,0);
+                        lcd->printf(">");
+                    }
+                    
+                    
+                    if (index < MAX_ADDRESSES) 
+                    {
+                        Address *a = &addressMap.addresses[index];
+                        lcd->locate(line,0);
+                        lcd->printf("%s%02d | %-20s",
+                                    ((selected)?">":" "),
+                                    a->address,
+                                    a->description  );
+                    }
+                }
+                
+                if (strlen(addressMap.addresses[active_address].description) > 0)
+                {
+                    escmController.say("%s is open" , 
+                        addressMap.addresses[active_address].description );
+                }
+                else
+                {
+                    escmController.say("Unit %d is open" , 
+                        addressMap.addresses[active_address].address );
+                }
+
+                break;
+        };
+        update_needed=0;
+    }
+    displayCurrentTime(lcd);
+}
+
+void EditAddressMenu::pressMode()
+{
+    // toggle active menu 
+    switch(active_selection) {
+        case SELECT_ADDRESS:
+        
+            // copy the current string to an editable copy
+            strcpy( tmp_description , 
+                addressMap.addresses[active_address].description);
+                
+            active_selection = EDIT_ADDRESS;
+            active_position = 0;
+            
+            break;
+        case EDIT_ADDRESS:
+            active_selection = DEFAULT_DISPLAY;
+            
+            // -------------------------------------------------------
+            // save the editable copy back into address map
+            strcpy(
+                addressMap.addresses[active_address].description
+                , tmp_description);
+            addressMap.save();    
+            // -------------------------------------------------------
+            active_position = 0;
+            break;
+        default:
+            active_selection = SELECT_ADDRESS;
+            break;
+    };
+
+    update_needed = 1;
+}
+
+void EditAddressMenu::pressSet()
+{
+    // set button advances to next character position OR
+    // goes back to normal
+    switch(active_selection) {
+        
+        case DEFAULT_DISPLAY:
+        case SELECT_ADDRESS:
+        
+            
+            // copy the current string to an editable copy
+            strcpy( tmp_description , 
+                addressMap.addresses[active_address].description);
+                
+            active_selection = EDIT_ADDRESS;
+            active_position = 0;
+            
+            break;
+
+        case EDIT_ADDRESS:
+            active_position++;
+            
+            if ( active_position > MAX_ADDR_LENGTH )
+            {
+                
+                // -------------------------------------------------------
+                // save the editable copy back into address map
+                strcpy(
+                    addressMap.addresses[active_address].description
+                    , tmp_description);
+                
+                addressMap.save();    
+                // -------------------------------------------------------
+                active_position = 0;
+            }
+            
+            break;
+
+        default:
+            break;
+    };
+
+    update_needed = 1;
+}
+
+
+void EditAddressMenu:: nextValidChar (char * value , int direction)
+{
+    char c = *value;
+    
+    size_t index = valid_characters.find(c); 
+
+    if ( index ==  string::npos )
+    {
+        index = 0;
+    }
+    else 
+    {
+        index += direction;
+        
+        if (index<0) 
+            index = valid_characters.size()-1;
+        if (index >= valid_characters.size())
+            index = 0;
+        
+    }
+    
+    *value = valid_characters[index]; 
+}
+
+
+void EditAddressMenu::pressUp()
+{
+    // either advances the pointer to current object in list OR
+    // character in array
+    switch(active_selection) {
+        case SELECT_ADDRESS:
+            active_address--;
+            update_needed = 1;
+            break;
+        case EDIT_ADDRESS:
+            nextValidChar (&tmp_description[active_position],1);
+            update_needed = 1;
+            break;
+
+        default:
+            active_address--;
+            update_needed = 1;
+            break;
+
+    }
+    
+    LIMIT(active_address  , 0, MAX_ADDRESSES  - 1);
+    LIMIT(active_position , 0, MAX_ADDR_LENGTH -1);  
+
+}
+
+void EditAddressMenu::pressDown()
+{
+    // either advances the pointer to current object in list OR
+    // character in array
+    switch(active_selection) {
+            
+        case SELECT_ADDRESS:
+            active_address++;
+            update_needed = 1;
+            break;
+
+        case EDIT_ADDRESS:
+            nextValidChar (&tmp_description[active_position],-1);
+            //active_position--;
+            update_needed = 1;
+            break;
+
+        default:
+            active_address++;
+            update_needed = 1;
+            break;
+
+    }
+    
+    
+    
+    LIMIT(active_address  , 0, MAX_ADDRESSES  - 1);
+    LIMIT(active_position , 0, MAX_ADDR_LENGTH -1);
+
+}