Exemplo n.º 1
1
uint8_t ProgramData::printVoltageString() const
{
    if(battery.type == Unknown) {
        lcdPrintVoltage(getVoltage(), 7);
        return 7;
    } else {
        uint8_t r = 5+2+1;
        lcdPrintVoltage(getVoltage(), 5);
        lcdPrintChar('/');
        lcdPrintUInt(battery.cells);
        lcdPrintChar('C');
        return r;
    }
}
Exemplo n.º 2
0
void lcdPrintEValue(uint16_t x, int8_t dig, bool dot)
{
    const char prefix = ' ';
    if(dig<=0)
        return;

    int8_t xdig = digits(x/1000);
    xdig+=1+3; // m or .

    for(;xdig<dig;dig--)
        lcdPrintChar(prefix);

    if(dig >= xdig && !dot) {
        xdig = digits(x);
        dig--; //m
        for(;xdig<dig;dig--)
            lcdPrintChar(prefix);
        lcdPrintUInt(x);
        lcdPrintChar('m');
    } else if(dig < xdig - 4) {
        lcdPrintInf(dig);
    } else {
        lcdPrintUInt(x/1000);
        x%=1000;
        dig -= xdig - 4;
        if(dig-- >0) lcdPrintChar('.');
        if(dig-- >0) lcdPrintDigit(x/100);
        x%=100;
        if(dig-- >0) lcdPrintDigit(x/10);
        x%=10;
        if(dig-- >0) lcdPrintDigit(x);
    }
}
Exemplo n.º 3
0
void ProgramData::printProgramData(uint8_t index)
{
    loadProgramData(index);
    if(battery.type != None) {
        Screen::StartInfo::printBatteryString();
        lcdPrintSpace1();
    }

    switch(battery.type) {
    case None:
        lcdPrintUInt(index+1);
        lcdPrintChar(':');
        break;
    case Unknown:
        Screen::StartInfo::printVoltageString(9);
        break;
    case LED:
        lcdPrintCurrent(battery.Ic,5);
        lcdPrintSpace1();
        Screen::StartInfo::printVoltageString(4);
        break;
    default:
        lcdPrintCharge(battery.capacity, 7);
        lcdPrintChar('/');
        lcdPrintUInt(battery.cells);
        break;
    }
}
Exemplo n.º 4
0
void SettingsMenu::printUARTSpeed() const
{
    //TODO: add printULong
    uint32_t s = p_.getUARTspeed();
    s/=100;
    lcdPrintUnsigned(s,5);
    lcdPrintChar('0');
    lcdPrintChar('0');
}
Exemplo n.º 5
0
void Screen::displayAnimation()
{
    for (uint8_t i=0; i<16; i++) {
        lcdSetCursor(15-i,1);
        lcdPrintChar(255);
        lcdSetCursor(i,0);
        lcdPrintChar(255);
        Time::delayDoIdle(10);
    }
}
Exemplo n.º 6
0
void lcdPrintPercentage(AnalogInputs::ValueType p, int8_t dig)
{
    if(dig > 0) {
        lcdPrintUnsigned(p,--dig);
        lcdPrintChar('%');
    }
}
Exemplo n.º 7
0
void lcdPrintTemperature(AnalogInputs::ValueType t, int8_t dig)
{
    if(dig > 0) {
        lcdPrintTemperature_(t,--dig);
        lcdPrintChar('C');
    }
}
Exemplo n.º 8
0
void SettingsMenu::printDeltaT(AnalogInputs::ValueType dt)
{
    lcdPrintUnsigned(dt/100, 3);
    lcdPrintChar('.');
    lcdPrintDigit((dt%100)/10);
    lcdPrint_P(PSTR("C/m"));
}
Exemplo n.º 9
0
void Screen::printChar_Time() {
    char c = 'N';
    if(smps.isPowerOn()) {
        c = 'C';
    } else if(discharger.isPowerOn()) {
        c = 'D';
        if(smps.isPowerOn()) c = 'E';
    } else if(balancer.isWorking()) {
        c = 'B';
    }

    lcdPrintChar(c);
    lcdPrintChar(' ');
    lcdPrintTime(getTimeSec());
    lcdPrintChar(' ');
}
Exemplo n.º 10
0
void Screen::Cycle::displayCycles()
{
    uint8_t c, time = Blink::blinkTime_/8;
    uint8_t all_scr = ProgramDCcycle::currentCycle/2 + 1;
    c = time % all_scr;
    lcdSetCursor0_0();
    lcdPrintUnsigned(c+1, 1);
    lcdPrintChar(SCREEN_EMPTY_CELL_CHAR);
    lcdPrintTime(cyclesHistoryTime[c*2], 6);
    lcdPrintSpace1();
    lcdPrintChar(SCREEN_FULL_CELL_CHAR);
    lcdPrintTime(cyclesHistoryTime[c*2+1], 6);
    lcdPrintSpaces();

    lcdSetCursor0_1();
    lcdPrintCharge(cyclesHistoryCapacity[c*2],8);
    lcdPrintCharge(cyclesHistoryCapacity[c*2+1],8);
    lcdPrintSpaces();
}
Exemplo n.º 11
0
void lcdPrintUnsigned_sign(uint16_t x, int8_t dig, const char prefix, bool minus)
{
    if(dig<=0)
        return;

    if(minus)
        dig--;

    uint8_t xdig = digits(x);

    for(;xdig<dig;dig--)
        lcdPrintChar(prefix);

    if(minus) lcdPrintChar('-');
    if(dig < xdig) {
        lcdPrintInf(dig);
    } else {
        lcdPrintUInt(x);
    }
}
Exemplo n.º 12
0
    void printBalancer(uint8_t cell, AnalogInputs::Type type) {
        if(cell < MAX_BALANCE_CELLS) {
            lcdPrintDigit(cell+1);
            lcdPrintChar(':');

            if(AnalogInputs::isConnected(AnalogInputs::Name(AnalogInputs::Vb1+cell))) {
                lcdPrintAnalog(getBalanceValue(cell, type), 6, type);
            } else {
                lcdPrint_P(PSTR("  --  "));
            }
        }
    }
Exemplo n.º 13
0
void Menu::display() {
    uint8_t lines = LCD_LINES;
    for(uint8_t i = 0; i < lines; i++) {
        lcdSetCursor(0, i);
        lcdPrintChar(i == pos_ ? '>' : ' ');
        if(i + begin_ < size_) {
            printItem(i + begin_);
        }
        lcdPrintSpaces();
    }
    debug();
    render_ = false;
}
Exemplo n.º 14
0
void Screen::displayScreenCIVlimits()
{
    lcdSetCursor0_0();
    lcdPrintCharge(ProgramData::currentProgramData.getCapacityLimit(), 8);
    lcdPrintChar(' ');
    lcdPrintCurrent(ProgramData::currentProgramData.battery.Ic, 7);
    lcdPrintSpaces();

    lcdSetCursor0_1();
    lcdPrint_P(PSTR("Limits: "));
    lcdPrintVoltage(ProgramData::currentProgramData.getVoltage(ProgramData::VCharge), 7);
    lcdPrintSpaces();
}
Exemplo n.º 15
0
void Screen::displayStartInfo()
{
    lcdSetCursor0_0();
    ProgramData::currentProgramData.printBatteryString(4);
    lcdPrintChar(' ');
    ProgramData::currentProgramData.printVoltageString();
    lcdPrintChar(' ');
    printProgram2chars(Program::programType_);

    lcdSetCursor0_1();
    uint16_t procent = getChargeProcent();
    if(procent == 100) {
        if(getBlinkOff())
            lcdPrintSpaces(4);
        else
            lcdPrint_P(PSTR("FUL "));
    } else {
        lcdPrintUnsigned(procent, 2);
        lcdPrint_P(PSTR("% "));
    }

    int bindex = getBlinkIndex();
    if(bindex & 1) analogInputs.printRealValue(AnalogInputs::Vout, 5);
    else lcdPrintSpaces(5);

    lcdPrintChar(' ');
    if(ProgramData::currentProgramData.isLiXX()) {
        //display balance port
        if(bindex & 2) analogInputs.printRealValue(AnalogInputs::Vbalancer, 5);
        else lcdPrintSpaces(5);

        if(bindex & 4) lcdPrintDigit(analogInputs.getConnectedBalancePorts());
        else lcdPrintChar(' ');
    } else {

        lcdPrintCharge(ProgramData::currentProgramData.battery.C, 6);
        lcdPrintSpaces();
    }
}
Exemplo n.º 16
0
void Screen::displayDebugRthVth()
{
    lcdSetCursor0_0();

    lcdPrint_P(PSTR("V="));
    //lcdPrintResistance(Rth_, 8);
    lcdPrintSigned(theveninMethod.tVout_.Rth_V_);
    lcdPrint_P(PSTR(" I="));
    //lcdPrintResistance(Rth_, 8);
    lcdPrintSigned(theveninMethod.tVout_.Rth_I_);
    lcdPrintSpaces();

    lcdSetCursor0_1();
    lcdPrintSigned(theveninMethod.tVout_.Vth_);
    lcdPrintChar(' ');
    lcdPrintSigned(theveninMethod.valueTh_, 4);
    lcdPrintChar(' ');
    uint16_t v;
    if(smps.isPowerOn())    v = smps.getValue();
    else                    v = discharger.getValue();
    lcdPrintSigned(v,4);
    lcdPrintSpaces();
}
Exemplo n.º 17
0
void lcdPrintAnalog(AnalogInputs::ValueType x, AnalogInputs::Type type, int8_t dig)
{
    if(dig <= 0)
        return;
    bool dot = true;
    char unit = 'U';
    dig--;
    switch (type) {
    case AnalogInputs::Current:
        dot = false;
        unit ='A';
        break;
    case AnalogInputs::Voltage:
        unit ='V';
        break;
    case AnalogInputs::Temperature:
        return lcdPrintTemperature(x, dig+1);
    case AnalogInputs::Resistance:
        dot = false;
        //TODO: ??Ohm
        unit ='!'-45;
        break;
    case AnalogInputs::Unknown:
        lcdPrintSigned(x, dig);
        lcdPrintChar(unit);
        return;
    case AnalogInputs::Charge:
        dot = false;
        dig--;
        unit ='A';
        break;
    }
    lcdPrintEValue(x, (int8_t) dig, dot);
    lcdPrintChar(unit);

    if(type == AnalogInputs::Charge)     lcdPrintChar('h');
}
Exemplo n.º 18
0
void lcdPrintTemperature_(AnalogInputs::ValueType x, int8_t dig)
{
    const char prefix = ' ';
    if(dig<=0)
        return;

    int8_t xdig = digits(x/100);
    xdig+=1+2; // .

    for(;xdig<dig;dig--)
        lcdPrintChar(prefix);

    if(dig < xdig - 3) {
        lcdPrintInf(dig);
    } else {
        lcdPrintUInt(x/100);
        x%=100;
        dig -= xdig - 3;
        if(dig-- >0) lcdPrintChar('.');
        if(dig-- >0) lcdPrintDigit(x/10);
        x%=10;
        if(dig-- >0) lcdPrintDigit(x);
    }
}
Exemplo n.º 19
0
void run() {

    uint32_t t;
    int j = 0;
    int dir = 1;
    do {
        t = Time::getMiliseconds();
        Utils::delayMicroseconds(50000);
        t = Time::getMiliseconds() - t;
        lcdSetCursor(0,0);
        lcdPrintUInt(t);
        lcdPrintSpaces();
        lcdSetCursor(0,1);
        for(int i=0;i<16;i++) {
            lcdPrintChar(' '+i+j);
        }
        j+=dir;
        if(j>128-16 - ' ' || j < 1) dir *= -1;

    } while(true);
}
Exemplo n.º 20
0
    void displayBalanceInfo(uint8_t from, AnalogInputs::Type type)
    {
        lcdSetCursor0_0();

#ifdef ENABLE_SCREEN_KNIGHTRIDEREFFECT
        knightRiderCounter += knightRiderDir;
        if (knightRiderCounter==0 || knightRiderCounter>4) knightRiderDir=-knightRiderDir;
#endif
        char c = ' ';
        if(!::Balancer::isWorking()) {
            if(!::Balancer::isStable())
                c = 'm';
        } else {
            if(::Balancer::savedVon)
                c = 'B';
            else
                c = 'b';
        }

        if (::Balancer::balance == 0) {
            lcdPrintChar(c);
#ifdef ENABLE_SCREEN_KNIGHTRIDEREFFECT
            char knightRiderArrow;
            if (knightRiderDir > 0) knightRiderArrow='>'; else knightRiderArrow='<';
            if ((c == 'm') || (c == ' ')) {
                for (uint8_t i=0; i<6; i++ ) {
                    if (knightRiderCounter==i) lcdPrintChar(knightRiderArrow);
                    else lcdPrintChar(' ');
                }
                lcdPrintChar(' ');
            } else {
                lcdPrintSpaces(7);
            }
#else
        lcdPrintSpaces(7);
#endif
        } else {
            uint16_t cell = 1;
            for(uint8_t i = 0; i < MAX_BALANCE_CELLS; i++) {
                if(AnalogInputs::connectedBalancePortCells & cell) {
                    if(i == ::Balancer::minCell) {
                        c = SCREEN_EMPTY_CELL_CHAR; //lowest cell
                    } else {
                        if(::Balancer::balance & cell) {
                            if (Blink::blinkTime_ & 1) {
                                c = SCREEN_FULL_CELL_CHAR; //flash full/empty cells
                            } else {
                                c = SCREEN_EMPTY_CELL_CHAR; //flash full/empty cells
                            }
                        } else {
                         c = SCREEN_AVR_CELL_CHAR; //average cells
                        }
                    }
                } else {
                    c = ' ';
                }
                lcdPrintChar(c);
                cell <<= 1;
            }
            lcdPrintSpaces(8 - MAX_BALANCE_CELLS);
        }
        printBalancer(from++, type);
        lcdPrintSpaces();

        lcdSetCursor0_1();
        printBalancer(from++, type);
        printBalancer(from++, type);
        lcdPrintSpaces();
    }
Exemplo n.º 21
0
void Screen::printCharge() {
    getCharge(charge_);
    lcdPrintCharge(charge_, 8);
    lcdPrintChar(' ');
}
Exemplo n.º 22
0
/** Write a nul terminated string
 *
 * Display a string of ASCII characters at the position described by the row
 * and column parameters. Note that the row indicates an 8 pixel high character
 * row while the column represents individual pixels. This code uses a built
 * in character set where each character is 6 pixels wide.
 *
 * This function does not perform any word wrapping or other text layout
 * functions. If the string exceeds the size of the display it will simply
 * be clipped.
 *
 * @param row the row number (0 to 5) to display the character.
 * @param col the column position (0 to 83) for the start of the left side of
 *            the character.
 * @param str the string to display. If a character in the string is out of
 *            range it will be replaced with the '?' character.
 */
void lcdPrint(uint8_t row, uint8_t col, const char *str, uint8_t size) {
  for(;(*str!='\0')&&(col<LCD_COL);col+=CHAR_WIDTH*size,str++) {
    lcdPrintChar(row, col, *str, size);
  }
}
Exemplo n.º 23
0
void SettingsMenu::printTemp(AnalogInputs::ValueType t) {
    lcdPrintUnsigned(t/100, 3);
    lcdPrintChar('C');
}
Exemplo n.º 24
0
void SettingsMenu::printVolt(AnalogInputs::ValueType v) {
    lcdPrintUnsigned(v/1000, 3);
    lcdPrintChar('V');
}
Exemplo n.º 25
0
void lcdPrintDigit(uint8_t d)
{
    d%=10;
    lcdPrintChar('0'+ d);
}
Exemplo n.º 26
0
void lcdPrintTime(uint16_t timeSec)
{
    lcdPrintUnsigned(timeSec/60, 3, '0');
    lcdPrintChar(':');
    lcdPrintUnsigned(timeSec%60, 2, '0');
}
Exemplo n.º 27
0
uint8_t lcdPrintSpaces(uint8_t n)
{
    for(uint8_t i=0;i<n;i++)
        lcdPrintChar(' ');
    return n;
}