diff --git a/Source/Display.cpp b/Source/Display.cpp index b458339..bd4aaf8 100644 --- a/Source/Display.cpp +++ b/Source/Display.cpp @@ -41,13 +41,27 @@ namespace ElektronischeLast void Display::run(void) { + char *data; switch (this->current_state) { case StateIdle: - if(this->new_data) + if(this->active_line == ActiveLineNone) { - this->new_data = false; - this->current_state = StateWriteData; + if(this->new_data1) + { + this->new_data1 = false; + this->active_line = ActiveLine1; + this->next_state = StateWriteData; + set_cursor(Line1, 0U); + } + else if(this->new_data2) + { + this->new_data2 = false; + this->active_line = ActiveLine2; + this->next_state = StateWriteData; + set_cursor(Line2, 0U); + } + this->pointer = 0U; } break; case StateDelay: @@ -117,10 +131,20 @@ namespace ElektronischeLast this->next_state = StateIdle; break; case StateWriteData: - write_data_4bit((std::uint8_t)this->string[this->pointer++]); - if(this->string[this->pointer] == '\0') + if(this->active_line == ActiveLine1) + { + data = this->line1; + } + else if(this->active_line == ActiveLine2) + { + data = this->line2; + } + + write_data_4bit((std::uint8_t)data[this->pointer++]); + if(data[this->pointer] == '\0') { this->next_state = StateIdle; + this->active_line = ActiveLineNone; } else { @@ -175,11 +199,18 @@ namespace ElektronischeLast } } - void Display::print(const char* const string) + void Display::print(Display::Line_t line, const char* const string) { - strncpy(this->string, string, sizeof(this->string)); - this->pointer = 0U; - this->new_data = true; + if(line == Display::Line1) + { + strncpy(this->line1, string, sizeof(this->line1)); + this->new_data1 = true; + } + else if(line == Display::Line2) + { + strncpy(this->line2, string, sizeof(this->line2)); + this->new_data2 = true; + } } bool Display::ready_for_data(void) diff --git a/Source/Display.hpp b/Source/Display.hpp index a96e2f8..a58f616 100644 --- a/Source/Display.hpp +++ b/Source/Display.hpp @@ -114,16 +114,27 @@ namespace ElektronischeLast void set_backlight(bool on); void set_cursor(Line_t line, std::uint32_t position); void lcd_set_display(eDisplay_t display, eCursor_t cursor, eCursorBlink_t blink); - void print(const char* const string); + void print(Display::Line_t line, const char* const string); bool ready_for_data(void); void lcd_set_user_chars(Display::UserDefinedCharakter_t character, const uint8_t character_data[]); + private: + typedef enum + { + ActiveLineNone, + ActiveLine1, + ActiveLine2, + } ActiveLine_t; + State_t current_state; State_t next_state; std::uint32_t timer; - char string[17]; + char line1[17]; + char line2[17]; std::uint8_t pointer; - bool new_data; + ActiveLine_t active_line; + bool new_data1; + bool new_data2; bool timer_elapsed(void); void start_timer(std::uint32_t timeout); void lcd_cmd(uint8_t cmd); diff --git a/Source/ElektronischeLast.cpp b/Source/ElektronischeLast.cpp index 42c0e91..c5941ff 100644 --- a/Source/ElektronischeLast.cpp +++ b/Source/ElektronischeLast.cpp @@ -133,7 +133,7 @@ int main (void) lcd.run(); } lcd.lcd_set_display(Display::eDispalyOn, Display::eCursorOff, Display::eCursorBlinkOff); - lcd.print("Elektronische Last"); + lcd.print(Display::Line1, "Elektronische Last"); while(1) { @@ -179,25 +179,29 @@ int main (void) char data[17U]; - lcd.set_cursor(Display::Line1, 0U); - int32_t len = snprintf(data, sizeof(data) - 1, "U:%" PRIu32 ".%02" PRIu32 "V", + int32_t len = snprintf(data, sizeof(data) - 1, "%2" PRIu32 ".%02" PRIu32 "V", spannung / 1000U, spannung % 1000U / 10U); std::memset(&data[len], (int)' ', 16U - len); - snprintf(&data[10], sizeof(data) - 10, "T:%" PRIu32 "%cC", temperatur, 0x1); + snprintf(&data[12], sizeof(data) - 12, "%2" PRIu32 "%cC", temperatur, 0x1); data[16] = '\0'; - lcd.print(data); -#if 0 - lcd.set_cursor(Display::Line2, 0U); - len = snprintf(data, sizeof(data) - 1, "I:%" PRIu32 ".%02" PRIu32 "A", - strom / 1000U, strom % 1000U / 10U); + lcd.print(Display::Line1, data); + + if(strom < 1000UL) + { + len = snprintf(data, sizeof(data) - 1, "%3" PRIu32 "mA", strom); + } + else + { + len = snprintf(data, sizeof(data) - 1, "%" PRIu32 ".%02" PRIu32 "A", + strom / 1000U, strom % 1000U / 10U); + } std::memset(&data[len], (int)' ', 16U - len); - snprintf(&data[10], sizeof(data) - 10, "S:%" PRIu32 "W", geschwindigkeit); + snprintf(&data[9], sizeof(data) - 9, "%4" PRIu32 "RPM", geschwindigkeit); data[16] = '\0'; - lcd.print(data); -#endif + lcd.print(Display::Line2, data); } - lcd.run(); } + lcd.run(); break; } serial_cyclic();