Files
SensorDisplay/CL56.cpp
uvos 9be9ccf044 renable display at hour mark
break out of cal loop
2023-10-12 16:02:32 +02:00

195 lines
3.0 KiB
C++

#include "CL56.h"
#include <avr/interrupt.h>
DualCl56::DualCl56(ShiftReg<16>* shiftReg):
_shiftReg(shiftReg)
{
}
void DualCl56::tick()
{
++_currentLit;
if(_currentLit > 7)
_currentLit = 0;
unsigned char bits[2] = {static_cast<unsigned char>(0b10000000 >> _currentLit),
static_cast<unsigned char>(~(_segments[_currentLit]))
};
if(!_blank)
_shiftReg->write(reinterpret_cast<unsigned char*>(&bits));
}
void DualCl56::setString(const char string[], const uint8_t dp)
{
uint_fast8_t i = 0;
for(; i < 8 && string[i] != '\0'; i++)
{
switch (string[i])
{
case '\0':
case '\n':
case ' ':
_segments[i] = 0;
break;
case '0':
_segments[i] = ZERO;
break;
case '1':
_segments[i] = ONE;
break;
case '2':
_segments[i] = TOW;
break;
case '3':
_segments[i] = THREE;
break;
case '4':
_segments[i] = FOUR;
break;
case '5':
_segments[i] = FIVE;
break;
case '6':
_segments[i] = SIX;
break;
case '7':
_segments[i] = SEVEN;
break;
case '8':
_segments[i] = EIGT;
break;
case '9':
_segments[i] = NINE;
break;
case 'a':
case 'A':
_segments[i] = SIGA;
break;
case 'b':
case 'B':
_segments[i] = SIGB;
break;
case 'c':
_segments[i] = SIGc;
break;
case 'C':
_segments[i] = SIGC;
break;
case 'd':
case 'D':
_segments[i] = SIGD;
break;
case 'e':
case 'E':
_segments[i] = SIGE;
break;
case 'f':
case 'F':
_segments[i] = SIGF;
break;
case 'g':
case 'G':
_segments[i] = SIGG;
break;
case 'h':
_segments[i] = SIGh;
break;
case 'H':
_segments[i] = SIGH;
break;
case 'i':
case 'I':
_segments[i] = SIGI;
break;
case 'j':
case 'J':
_segments[i] = SIGJ;
break;
case 'l':
_segments[i] = SIGl;
break;
case 'L':
_segments[i] = SIGL;
break;
case 'n':
case 'N':
_segments[i] = SIGN;
break;
case 'o':
_segments[i] = SIGo;
break;
case 'O':
_segments[i] = SIGO;
break;
case 'p':
case 'P':
_segments[i] = SIGP;
break;
case 'r':
case 'R':
_segments[i] = SIGR;
break;
case 's':
case 'S':
_segments[i] = SIGS;
break;
case 't':
case 'T':
_segments[i] = SIGT;
break;
case 'u':
case 'U':
_segments[i] = SIGU;
break;
case 'v':
case 'V':
_segments[i] = SIGV;
break;
case 'x':
case 'X':
_segments[i] = SIGX;
break;
case 'y':
case 'Y':
_segments[i] = SIGY;
break;
case '-':
_segments[i] = MINUS;
break;
default:
_segments[i] = INVLD;
break;
}
if( (1 << i) & dp ) _segments[i] |= 1;
else _segments[i] &= ~1;
}
if(string[i] == '\0') for(; i < 8; i++) _segments[i]&=SEG_DP;
}
void DualCl56::setSegments(const uint8_t segments, const uint8_t place)
{
_segments[place] = segments;
}
void DualCl56::setBlank(bool blankIn)
{
_blank = blankIn;
if(_blank)
{
cli();
_shiftReg->clear();
_shiftReg->clear();
sei();
}
}
bool DualCl56::getBlank()
{
return _blank;
}