Change to hh:mm:ss dd:mm:yy counting (adds colon and extra small digits)
authorNick Downing <nick@ndcode.org>
Thu, 24 Mar 2022 12:43:34 +0000 (23:43 +1100)
committerNick Downing <nick@ndcode.org>
Thu, 24 Mar 2022 12:43:34 +0000 (23:43 +1100)
examples/board_clock_7seg/atmega168_clock_7seg.c
examples/board_clock_7seg/clock_7seg.c

index 1a9a6f4..52551a0 100644 (file)
@@ -201,7 +201,12 @@ uint8_t dayMax(uint8_t month, uint8_t year) {
 
 void decimalInc()
 {
-  for (uint8_t in = 0; in < D_MAX; in++) {
+#if 0 // for testing day/month/year increments
+  for (uint8_t in = D_DAY; in < D_MAX; in++)
+#else
+  for (uint8_t in = 0; in < D_MAX; in++)
+#endif
+  {
     ++decimal[in];
     decimalChanged |= (1 << in);
     if (
@@ -264,8 +269,8 @@ const uint8_t digits2led[10] = {
 
 struct {
   uint8_t b[N_DIGITS * BYTES_PER_DIGIT];
-  uint8_t in : 4;
-  uint8_t out : 4;  
+  uint8_t in;
+  uint8_t out;  
 } spi;
 
 void spi_init()
@@ -403,8 +408,10 @@ void updateTimer()
   }       
   cli();
   // interupts are stopped here, so there is no race condition
-  int restart = spi.out == spi.in;
-#if 1
+  //int restart = spi.out == spi.in;
+  spi.in = 0;
+  spi.out = 0;
+#if 0
  digits[0] = 1;
  digits[1] = 2;
  digits[2] = 4;
@@ -422,7 +429,7 @@ void updateTimer()
 #else
     spi.b[spi.out++] = digits[bi];
 #endif
-  if (restart)
+  //if (restart)
     spi_start();
   sei();
 }
@@ -432,7 +439,7 @@ void updateTimerDisplay()
   do {
     switch (state & ~state_IncrementTime) {
       case state_ShowTime: {
-        if (decimalChanged & (1 << D_HOUR)) {
+        if (decimalChanged & ((1 << D_DAY) | (1 << D_MONTH) | (1 << D_YEAR))) {
           startShowHours(4 * TICK_SECOND);
           break;
         }
@@ -452,6 +459,10 @@ void updateTimerDisplay()
         }
       }  break;
       case state_ShowHour: {
+#if 0 // for testing day/month/year increments
+ if (decimalChanged & ((1 << D_DAY) | (1 << D_MONTH) | (1 << D_YEAR)))
+  startShowHours(4 * TICK_SECOND);
+#endif 
         if (tick_timer_fired(delay_DisplayChange)) {
           decimalChanged = 1;
           startShowTime();
@@ -459,16 +470,14 @@ void updateTimerDisplay()
         }
         decimalChanged = 0;
 
-        uint8_t day = decimal[D_DAY] + 1;
-        uint8_t month = decimal[D_MONTH] + 1;
-        uint16_t year = decimal[D_YEAR]; //+ 2000;
-
-        digits[0] = digits2led[year % 10];
-        digits[1] = digits2led[year / 10];
-        digits[2] = digits2led[month % 10] | SEG_DP;
-        digits[3] = digits2led[month / 10];
-        digits[4] = digits2led[day % 10] | SEG_DP;
-        digits[5] = digits2led[day / 10];
+        digits[0] = digits2led[decimal[D_YEAR] % 10];
+        digits[1] = digits2led[decimal[D_YEAR] / 10];
+        uint8_t temp = decimal[D_MONTH] + 1;
+        digits[2] = digits2led[temp % 10] | SEG_DP;
+        digits[3] = digits2led[temp / 10];
+        /*uint8_t*/ temp = decimal[D_DAY] + 1;
+        digits[4] = digits2led[temp % 10] | SEG_DP;
+        digits[5] = digits2led[temp / 10];
       }  break;
   //    case state_Sleep: {
         /* nothing to do */
index 391703c..8b475ba 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <math.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <libgen.h>
 #define DIGIT_WIDTH 320.f
 #define COLON_WIDTH 110.f
 #define LINE_HEIGHT 450.f
-#define COLON_X (ORIGIN_X + 2 * DIGIT_WIDTH)
+#define COLON_X (ORIGIN_X + 2.f * DIGIT_WIDTH)
 #define COLON_Y ORIGIN_Y
-#define WINDOW_X (ORIGIN_X + 5 * DIGIT_WIDTH + 2 * COLON_WIDTH)
+#define WINDOW_X (ORIGIN_X + 5.f * DIGIT_WIDTH + 1.5f * COLON_WIDTH)
 #define WINDOW_Y (ORIGIN_Y + LINE_HEIGHT)
 
 #define USE_17SEG 1
 #if USE_17SEG
 #define BYTES_PER_DIGIT 3
+#define SEGMENTS_PER_DIGIT 17
 #define SEG_DP 0x10000
 #else
 #define BYTES_PER_DIGIT 1
+#define SEGMENTS_PER_DIGIT 8
 #define SEG_DP 0x80
 #endif
 
@@ -73,12 +76,12 @@ avr_vcd_t vcd_file;
 hc595_t shifters[N_SHIFTERS];
 
 const float digit_pos[N_DIGITS][3] = {
-  {ORIGIN_X + 0.f * DIGIT_WIDTH + 0.f * COLON_WIDTH, ORIGIN_Y, 1.f},
-  {ORIGIN_X + 1.f * DIGIT_WIDTH + 0.f * COLON_WIDTH, ORIGIN_Y, 1.f},
-  {ORIGIN_X + 2.f * DIGIT_WIDTH + 1.f * COLON_WIDTH, ORIGIN_Y, 1.f},
-  {ORIGIN_X + 3.f * DIGIT_WIDTH + 1.f * COLON_WIDTH, ORIGIN_Y, 1.f},
-  {ORIGIN_X + 4.f * DIGIT_WIDTH + 2.f * COLON_WIDTH, ORIGIN_Y, .5f},
-  {ORIGIN_X + 4.5f * DIGIT_WIDTH + 2.f * COLON_WIDTH, ORIGIN_Y, .5f},
+  {ORIGIN_X, ORIGIN_Y, 1.f},
+  {ORIGIN_X + DIGIT_WIDTH, ORIGIN_Y, 1.f},
+  {ORIGIN_X + 2.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y, 1.f},
+  {ORIGIN_X + 3.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y, 1.f},
+  {ORIGIN_X + 4.f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y, .5f},
+  {ORIGIN_X + 4.5f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y, .5f},
 };
 
 int display_flag = 0;
@@ -149,13 +152,11 @@ void displayCB(void)    /* function called whenever redisplay needed */
     float y = digit_pos[di][1];
     float scale = digit_pos[di][2];
 
-#if USE_17SEG
-    int end = di == 3 ? 16 : 17; // last digit DP mapped to colon instead
-#else
-    int end = di == 3 ? 7 : 8; // last digit DP mapped to colon instead
-#endif
-    for (int i = 0; i < end; i++) {
-      glColor3f(0.f, bits & (1 << i) ? color_on : color_off, 0.f);
+    for (int i = 0; i < SEGMENTS_PER_DIGIT; i++) {
+      bool segment = (bits & (1 << i)) != 0;
+      if (di == N_DIGITS - 1 && i == SEGMENTS_PER_DIGIT - 1)
+        segment = false; // mapped to colon instead (but still shown dark)
+      glColor3f(0.f, segment ? color_on : color_off, 0.f);
       glBegin(GL_POLYGON); //GL_LINE_STRIP);
 #if USE_17SEG
       int end = led_17seg_ptr[i + 1];
@@ -244,7 +245,7 @@ static void * avr_run_thread(void * ignore)
 int main(int argc, char *argv[])
 {
   elf_firmware_t f;
-  const char * fname =  "atmega168_clock_7seg.axf";
+  const char * fname = "atmega168_clock_7seg.axf";
   //char path[256];
 
 //  sprintf(path, "%s/%s", dirname(argv[0]), fname);