Demo for MAXREFDES99

Dependencies:   MAX7219 mbed

Revision:
2:9fdd01cf0f88
Parent:
0:6b0161c3e440
Child:
3:41bdbc9b3cec
--- a/maxrefdes99.cpp	Tue Jan 26 02:39:36 2016 +0000
+++ b/maxrefdes99.cpp	Thu Mar 24 23:35:56 2016 +0000
@@ -149,8 +149,10 @@
 static uint8_t display_buff[256];
 static uint8_t temp_buff[256];
 
-static const uint8_t DISPLAY_BUFF_START = 112;
-static const uint8_t DISPLAY_BUFF_END = 143;
+static const uint8_t DISPLAY_BUFF_START = 0;
+static const uint8_t DISPLAY_BUFF_END = 31;
+
+static uint8_t buff_end = 0;
 
 static const uint32_t MAX_STRING_LENGTH = 32;
 static char str[MAX_STRING_LENGTH];
@@ -178,77 +180,82 @@
 
 
 //*********************************************************************
-void print_char(Max7219 *p_display, uint8_t position, char c)
+void print_char(Max7219 *p_display, uint8_t position99, char c)
 {
     uint8_t idx;
+    uint8_t char_buff[6];
+    uint8_t device;
     uint8_t wrap_device;
     uint8_t wrap_idx;
-    uint8_t char_buff[6];
-    uint8_t device;
-    uint8_t display_buff_idx = 0;
+    uint8_t buff_start = position99;
     
     get_5x7_character(c, char_buff);
-    
-    //get device and device_position
-    if(position > 8)
+
+    if(position99 < 33)
     {
-        if(position%8)
-        {
-            device = ((position/8) + 1);
-            position = position%8;
-        }
-        else
-        {
-            device = position/8;
-            position = 8;
-        }
+      //get device and device_position
+      if(position99 > 8)
+      {
+          if(position99%8)
+          {
+              device = ((position99/8) + 1);
+              position99 = position99%8;
+          }
+          else
+          {
+              device = position99/8;
+              position99 = 8;
+          }
+      }
+      else
+      {
+          device = 1;
+      }
+
+      //check for dispaly wrap around 
+      //(moving to next 8x8 grid cause character doesn't fit on current one)
+      if(position99 > 3)
+      {
+          wrap_idx = (9 - position99);
+          if(device < 4)
+          {
+              wrap_device = (device + 1);
+          }
+          else
+          {
+              wrap_device = 1;
+          }
+      }
+      else
+      {
+          wrap_idx = 6; //make bigger than idx, not used
+          wrap_device = 0; //not used
+      }
+
+      //print character to position
+      for(idx = 0; idx < 6; idx++)
+      {
+          //check for wrap
+          if((idx >= wrap_idx)  && (device != 4))
+          {
+              p_display->write_digit(wrap_device, ((idx - wrap_idx) + 1), char_buff[idx]);
+          }
+          else
+          {
+              p_display->write_digit(device, (position99 + idx), char_buff[idx]);
+          }
+
+          buff_end = ((buff_start - 1) + idx);
+          display_buff[buff_end] = char_buff[idx];
+      }
     }
     else
     {
-        device = 1;
-    }
-    
-    //check for dispaly wrap around 
-    //(moving to next 8x8 grid cause character doesn't fit on current one)
-    if(position > 3)
-    {
-        wrap_idx = (9 - position);
-        if(device < 4)
-        {
-            wrap_device = (device + 1);
-        }
-        else
-        {
-            wrap_device = 1;
-        }
-    }
-    else
-    {
-        wrap_idx = 6; //make bigger than idx, not used
-        wrap_device = 0; //not used
-    }
-    
-    //print character to position
-    for(idx = 0; idx < 6; idx++)
-    {
-        //check for wrap
-        if(idx >= wrap_idx)
-        {
-            p_display->write_digit(wrap_device, ((idx - wrap_idx) + 1), char_buff[idx]);
-        }
-        else
-        {
-            p_display->write_digit(device, (position + idx), char_buff[idx]);
-        }
-        
-        //get index for display buffer, keeps image of display for shifting
-        display_buff_idx = (((device - 1) * 8) + (position - 1) + idx + DISPLAY_BUFF_START);
-        //wrap buff back around 
-        if(display_buff_idx > 255)
-        {
-            display_buff_idx = display_buff_idx - 256;
-        }
-        display_buff[display_buff_idx] = char_buff[idx];
+      for(idx = 0; idx < 6; idx++)
+      {
+        buff_end = ((buff_start - 1) + idx);
+        display_buff[buff_end] = char_buff[idx];
+      }
     }
 }
 
@@ -267,16 +274,16 @@
 
 
 //*********************************************************************
-void shift_display_right(Max7219 *p_display, uint8_t count, uint8_t delay)
+void shift_display_right(Max7219 *p_display, uint8_t count, uint8_t ms_delay)
 {
     uint16_t idx, idy;
-    uint8_t position;
+    uint8_t position99;
     
     for(idx = 0; idx < count; idx++)
     {
-        for(idy = 0; idy < 256; idy++)
+        for(idy = 0; idy < (buff_end + 1); idy++)
         {
-            if(idy == 255)
+            if(idy == buff_end)
             {
                 temp_buff[0] = display_buff[idy];
             }
@@ -286,74 +293,75 @@
             }
         }
         
-        for(idy = 0; idy < 256; idy++)
+        for(idy = 0; idy < (buff_end + 1); idy++)
         {
             //save shifted display in buffer
             display_buff[idy] = temp_buff[idy];
             
-            if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END))
+            if(idy <= DISPLAY_BUFF_END)
             {
-                position = ((idy - DISPLAY_BUFF_START) + 1);
-                if(position > 24)
+                position99 = ((idy - DISPLAY_BUFF_START) + 1);
+                if(position99 > 24)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(4, position, display_buff[idy]);
+                    p_display->write_digit(4, position99, display_buff[idy]);
                 }
-                else if(position > 16)
+                else if(position99 > 16)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(3, position, display_buff[idy]);
+                    p_display->write_digit(3, position99, display_buff[idy]);
                 }
-                else if(position > 8)
+                else if(position99 > 8)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(2, position, display_buff[idy]);
+                    p_display->write_digit(2, position99, display_buff[idy]);
                 }
                 else
                 {
-                    p_display->write_digit(1, position, display_buff[idy]);
+                    p_display->write_digit(1, position99, display_buff[idy]);
                 }
             }
         }
-        
-        wait_ms(delay);
+
+        wait_ms(ms_delay);
     }
 }
 
 
-void shift_display_left(Max7219 *p_display, uint8_t count, uint8_t delay)
+//*********************************************************************
+void shift_display_left(Max7219 *p_display, uint8_t count, uint8_t ms_delay)
 {
     uint16_t idx, idy;
-    uint8_t position;
+    uint8_t position99;
     
     for(idx = 0; idx < count; idx++)
     {
-        for(idy = 0; idy < 256; idy++)
+        for(idy = 0; idy < (buff_end + 1); idy++)
         {
             if(idy == 0)
             {
-                temp_buff[255] = display_buff[idy];
+                temp_buff[buff_end] = display_buff[idy];
             }
             else
             {
@@ -361,58 +369,58 @@
             }
         }
         
-        for(idy = 0; idy < 256; idy++)
+        for(idy = 0; idy < (buff_end + 1); idy++)
         {
             //save shifted display in buffer
             display_buff[idy] = temp_buff[idy];
             
-            if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END))
+            if(idy <= DISPLAY_BUFF_END)
             {
-                position = ((idy - DISPLAY_BUFF_START) + 1);
-                if(position > 24)
+                position99 = ((idy - DISPLAY_BUFF_START) + 1);
+                if(position99 > 24)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(4, position, display_buff[idy]);
+                    p_display->write_digit(4, position99, display_buff[idy]);
                 }
-                else if(position > 16)
+                else if(position99 > 16)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(3, position, display_buff[idy]);
+                    p_display->write_digit(3, position99, display_buff[idy]);
                 }
-                else if(position > 8)
+                else if(position99 > 8)
                 {
-                    if(position % 8)
+                    if(position99 % 8)
                     {
-                        position = position  % 8;
+                        position99 = position99  % 8;
                     }
                     else
                     {
-                         position = 8;
+                         position99 = 8;
                     }
-                    p_display->write_digit(2, position, display_buff[idy]);
+                    p_display->write_digit(2, position99, display_buff[idy]);
                 }
                 else
                 {
-                    p_display->write_digit(1, position, display_buff[idy]);
+                    p_display->write_digit(1, position99, display_buff[idy]);
                 }
             }
         }
-        
-        wait_ms(delay);
+
+        wait_ms(ms_delay);
     }
 }
 
@@ -434,6 +442,11 @@
             display_buff[idx + DISPLAY_BUFF_START] = 0xFF;
         }
     }
+
+    if(buff_end < (quad * 8))
+    {
+      buff_end = (quad * 8);
+    }
     
     p_display->device_all_on(quad);
 }
@@ -456,6 +469,13 @@
             display_buff[idx + DISPLAY_BUFF_START] = 0;
         }
     }
+
+    //is buff_end in the quad?
+    if((((quad - 1) * 8) < buff_end) && ((quad * 8) > buff_end))
+    {
+      buff_end = ((quad - 1) * 8);
+    }
+    //leave it alone otherwise
     
     p_display->device_all_off(quad);
 }
@@ -464,10 +484,15 @@
 //*********************************************************************
 void all_on(Max7219 *p_display)
 {
-    for(uint16_t idx = 0; idx < 256; idx++)
+    for(uint16_t idx = 0; idx < 32; idx++)
     {
         display_buff[idx] = 0xFF;
     }
+
+    if(buff_end < 32)
+    {
+      buff_end = 32;
+    }
     
     p_display->display_all_on();
 }
@@ -476,10 +501,15 @@
 //*********************************************************************
 void all_off(Max7219 *p_display)
 {
-    for(uint16_t idx = 0; idx < 256; idx++)
+    for(uint16_t idx = 0; idx < 32; idx++)
     {
         display_buff[idx] = 0;
     }
+
+    if(buff_end < 32)
+    {
+      buff_end = 0;
+    }
     
     p_display->display_all_off();
 }
@@ -633,7 +663,7 @@
         printf(msg);
         
         //get user input
-        fgets(str, 2, stdin);
+        fgets(str, 4, stdin);
         
         //Remove trailing newline and CR, if there.
         if((strlen(str) > 0 ) && (str[strlen(str) - 1] == 0x0A) && (str[strlen(str) - 2] == 0x0D))