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 (
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()
}
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;
#else
spi.b[spi.out++] = digits[bi];
#endif
- if (restart)
+ //if (restart)
spi_start();
sei();
}
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;
}
}
} 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();
}
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 */
*/
#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
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;
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];
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);