|
@@ -28,8 +28,6 @@
|
|
|
|
|
|
#include <avr/pgmspace.h>
|
|
|
|
|
|
-const PROGMEM byte BatteryLevel = B00000010;
|
|
|
-
|
|
|
const PROGMEM byte Digit[10][5] = {
|
|
|
{
|
|
|
B00000111,
|
|
@@ -168,6 +166,33 @@ const PROGMEM byte AcceleratorLevel[10][6] = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+const PROGMEM byte StopSign[8] = {
|
|
|
+ B00011000,
|
|
|
+ B00011000,
|
|
|
+ B00011000,
|
|
|
+ B00011000,
|
|
|
+ B00011000,
|
|
|
+ B00000000,
|
|
|
+ B00011000,
|
|
|
+ B00011000
|
|
|
+};
|
|
|
+
|
|
|
+const PROGMEM byte LampSign[5] = {
|
|
|
+ B00000000,
|
|
|
+ B00000000,
|
|
|
+ B01000000,
|
|
|
+ B11100000,
|
|
|
+ B01000000
|
|
|
+};
|
|
|
+
|
|
|
+const PROGMEM byte EcoSign[5] = {
|
|
|
+ B00000000,
|
|
|
+ B00000000,
|
|
|
+ B00001100,
|
|
|
+ B00001100,
|
|
|
+ B00000100
|
|
|
+};
|
|
|
+
|
|
|
Display::Display() : mLedControl(DisplayDataPin, DisplayClkPin, DisplayCsPin,2)
|
|
|
,mDisplayBuffer{
|
|
|
B00000000,
|
|
@@ -186,9 +211,13 @@ Display::Display() : mLedControl(DisplayDataPin, DisplayClkPin, DisplayCsPin,2)
|
|
|
B00000000,
|
|
|
B00000000,
|
|
|
B00000000}
|
|
|
+ , m_updateRequested(true)
|
|
|
, m_acceleration(0)
|
|
|
, m_battery(0)
|
|
|
, m_speed(0)
|
|
|
+ , m_stop(false)
|
|
|
+ , m_lightOn(false)
|
|
|
+ , m_eco(false)
|
|
|
{
|
|
|
mLedControl.shutdown(0, false);
|
|
|
mLedControl.setIntensity(0, 0);
|
|
@@ -206,14 +235,13 @@ void Display::drawAccelerationLevel()
|
|
|
}
|
|
|
|
|
|
for (byte i = 0; i < 6; ++i) {
|
|
|
- mDisplayBuffer[8 + i] = 0;
|
|
|
+ mDisplayBuffer[5 + i] = 0;
|
|
|
if (m_acceleration > 0) {
|
|
|
- mDisplayBuffer[8 + i] = pgm_read_byte(&(AcceleratorLevel[m_acceleration - 1][i]));
|
|
|
+ mDisplayBuffer[5 + i] = pgm_read_byte(&(AcceleratorLevel[m_acceleration - 1][i]));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
void Display::drawSpeed()
|
|
|
{
|
|
|
if (m_speed > 99) {
|
|
@@ -232,25 +260,63 @@ void Display::drawSpeed()
|
|
|
|
|
|
void Display::drawBatteryLevel()
|
|
|
{
|
|
|
- if (m_battery > 5) {
|
|
|
- m_battery = 5;
|
|
|
+ if (m_battery > 6) {
|
|
|
+ m_battery = 6;
|
|
|
}
|
|
|
|
|
|
- mDisplayBuffer[6] = 0;
|
|
|
- mDisplayBuffer[7] = 0;
|
|
|
+ mDisplayBuffer[15] = 0;
|
|
|
+ for (byte i = 1; i < (m_battery + 1); ++i) {
|
|
|
+ mDisplayBuffer[15] |= 1 << i;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- byte batteryLevelChar = pgm_read_byte(&(BatteryLevel));
|
|
|
- for (byte i = 0; i < m_battery; ++i) {
|
|
|
- mDisplayBuffer[6] |= batteryLevelChar << i;
|
|
|
- mDisplayBuffer[7] |= batteryLevelChar << (i + 1);
|
|
|
+void Display::drawLampSign()
|
|
|
+{
|
|
|
+ for (byte i = 0; i < 5; ++i) {
|
|
|
+ if (m_lightOn) {
|
|
|
+ mDisplayBuffer[9 + i] |= pgm_read_byte(&(LampSign[i]));
|
|
|
+ } else {
|
|
|
+ mDisplayBuffer[9 + i] &= ~pgm_read_byte(&(LampSign[i]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void Display::drawEcoSign()
|
|
|
+{
|
|
|
+ for (byte i = 0; i < 5; ++i) {
|
|
|
+ if (m_eco) {
|
|
|
+ mDisplayBuffer[9 + i] |= pgm_read_byte(&(EcoSign[i]));
|
|
|
+ } else {
|
|
|
+ mDisplayBuffer[9 + i] &= ~pgm_read_byte(&(EcoSign[i]));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Display::drawStopSign()
|
|
|
+{
|
|
|
+ for (byte i = 0; i < 8; ++i) {
|
|
|
+ mDisplayBuffer[6 + i] = pgm_read_byte(&(StopSign[i]));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void Display::updateDisplayBuffer()
|
|
|
{
|
|
|
- drawAccelerationLevel();
|
|
|
+ if (!m_updateRequested) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_updateRequested = false;
|
|
|
+
|
|
|
drawSpeed();
|
|
|
drawBatteryLevel();
|
|
|
+
|
|
|
+ if (!m_stop) {
|
|
|
+ drawAccelerationLevel();
|
|
|
+ drawLampSign();
|
|
|
+ drawEcoSign();
|
|
|
+ } else {
|
|
|
+ drawStopSign();
|
|
|
+ }
|
|
|
+
|
|
|
for(byte i = 0; i < 8; ++i) {
|
|
|
mLedControl.setColumn(1, i, mDisplayBuffer[i]);
|
|
|
mLedControl.setColumn(0, i, mDisplayBuffer[i + 8]);
|