-
Notifications
You must be signed in to change notification settings - Fork 0
/
DisplayIV12.cpp
103 lines (83 loc) · 2.46 KB
/
DisplayIV12.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "DisplayIV12.h"
#include <SPI.h>
#include "constants.h"
bool DisplayIV12::Initialize()
{
Serial.println("Initializing IV-12 Display");
pinMode(GPIO_Data, OUTPUT);
pinMode(GPIO_Clock, OUTPUT);
pinMode(GPIO_Latch, OUTPUT);
SetPinLow(GPIO_Data);
SetPinLow(GPIO_Clock);
SetPinHigh(GPIO_Latch);
SPI.begin();
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16);
if (currentDimmingStep > MaxDimmingSteps)
currentDimmingStep = MaxDimmingSteps;
for(int tubeIndex = 0; tubeIndex < Digits; tubeIndex++)
displayData[tubeIndex] = 0b11111111;
return true;
}
void DisplayIV12::OnTimer()
{
SetPinLow(GPIO_Latch);
if (ticksSinceLastWrite < currentDimmingStep)
{
for(volatile int tubeIndex = 0; tubeIndex < Digits; tubeIndex++)
SPI.transfer(0b00000000);
}
else
{
for(volatile int tubeIndex = 0; tubeIndex < Digits; tubeIndex++)
SPI.transfer(displayData[tubeIndex]);
}
SetPinHigh(GPIO_Latch);
ticksSinceLastWrite++;
if (ticksSinceLastWrite > currentDimmingStep)
ticksSinceLastWrite = 0;
}
void DisplayIV12::ShiftCurrentTime(int hour, int minute, int second, bool displayZeroFirstDigit)
{
hour = constrain(hour, 0, 99);
minute = constrain(minute, 0, 99);
// Minute: 1st and 2nd tube
displayData[0] = TubeDigit[minute % 10];
int firstDigit = minute / 10;
if (firstDigit != 0 or displayZeroFirstDigit)
displayData[1] = TubeDigit[firstDigit];
else
displayData[1] = CharMap[' '];
// Hour: 3rd and 4th tube
displayData[2] = TubeDigit[hour % 10];
firstDigit = hour / 10;
if (firstDigit != 0 or displayZeroFirstDigit)
displayData[3] = TubeDigit[firstDigit];
else
displayData[3] = CharMap[' '];
}
void DisplayIV12::ShiftRaw(byte data[])
{
for (size_t i = 0; i < Digits; i++)
displayData[i] = data[i];
}
void DisplayIV12::ShiftText(String text)
{
ShiftBlank();
for(size_t tubeIndex = 0; tubeIndex < Digits; tubeIndex++)
{
// eg TubeIndex 1: 6 - 1 - 1 = 4;
// eg TubeIndex 5 = 6 - 1 - 5 = 0;
size_t reverse = Digits - 1 - tubeIndex;
// leave blanks for extended ascii table.
if (text[tubeIndex] >= sizeof(CharMap))
continue;
displayData[reverse] = CharMap[text[tubeIndex]];
}
}
void DisplayIV12::ShiftBlank()
{
for (size_t tubeIndex = 0; tubeIndex < Digits; tubeIndex++)
displayData[tubeIndex] = 0b0000000;
}