X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fkasse.c;h=54521e68d905c266a6a0a039ec69f62959c676c3;hb=cd0e2209005feaa36e1f98877c2d874161d74c9c;hp=ea2e6635b9d70acf9a5a2044dcaa5f8896131e2f;hpb=14234f8d4e52ad1c33b1bc804d9d08c8abbce30d;p=c128-kasse diff --git a/src/kasse.c b/src/kasse.c index ea2e663..54521e6 100644 --- a/src/kasse.c +++ b/src/kasse.c @@ -25,7 +25,7 @@ // graphic 4,0,10 void print_item(BYTE i) { - char profit[EUR_FORMAT_MINLEN]; + char profit[EUR_FORMAT_MINLEN + 1]; if (format_euro(profit, sizeof(profit), status.status[i].price) == NULL) { cprintf("Preis %ld konnte nicht umgerechnet werden\r\n", status.status[i].price); @@ -41,19 +41,19 @@ void print_item(BYTE i) { /* Hauptbildschirm ausgeben */ static void print_screen(void) { BYTE i = 0; - char *time = get_time(); - char profit[EUR_FORMAT_MINLEN]; + char profit[EUR_FORMAT_MINLEN + 1]; clrscr(); if (format_euro(profit, sizeof(profit), money) == NULL) { cprintf("Einnahme %ld konnte nicht umgerechnet werden\r\n", money); - exit(1); + profit[0] = '\0'; } textcolor(TC_CYAN); - cprintf("C128-Kassenprogramm (phil_fry, sECuRE, sur5r, mxf) " GV "\r\n"); + /* fill whole line with cyan, so color bits are set up for the clock */ + cprintf("%-80s", "C128-Kasse (phil_fry, sECuRE, sur5r, mxf) " GV); textcolor(TC_LIGHT_GRAY); - cprintf("\r\nUhrzeit: %s (wird nicht aktualisiert)\r\n" - "Eingenommen: %s, Verkauft: %ld Dinge, Drucken: %s\r\n", - time, profit, items_sold, (printing == 1 ? "ein" : "aus")); + cprintf("\r\n\r\n\r\n" + "Ertrag: %s (%ld Artikel); Drucken: %s\r\n", + profit, items_sold, (printing == 1 ? "ein" : "aus")); textcolor(TC_LIGHT_GRAY); cprintf(" \xB0" "\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xC0\xB2" @@ -109,43 +109,61 @@ static void print_screen(void) { * Prints a line and logs it to file. Every line can be at max 80 characters. * */ -static void print_log(char *name, int item_price, int einheiten, char *nickname, - char *rest) { +static void print_log(char *name, int32_t item_price, int16_t einheiten, + char *nickname, char *rest) { char *time = get_time(); - char price[EUR_FORMAT_MINLEN]; - /* Format: - Transaction-ID (Anzahl verkaufter Einträge, inklusive des zu druckenden!) - -- 6-stellig - Uhrzeit -- 8-stellig - Eintragname (= Getränk) -- 9-stellig - Preis (in Cents) -- 9-stellig - Anzahl -- 2-stellig - Nickname (falls es vom Guthaben abgezogen wird) -- 10-stellig - restguthaben (9-stellig) - - + 7 leerzeichen - --> 48 zeichen - */ + uint8_t n; + char price[EUR_FORMAT_MINLEN + 1]; if (format_euro(price, sizeof(price), item_price) == NULL) { cprintf("Preis %d konnte nicht umgerechnet werden\r\n", item_price); exit(1); } - sprintf(print_buffer, "%c[%3u] %s - %-" xstr( - MAX_ITEM_NAME_LENGTH) "s - %s - %s - %d - an %s\r", - 17, status.transaction_id, time, name, price, rest, einheiten, - (*nickname != '\0' ? nickname : "Unbekannt")); + /* TODO: teach the EUR sign to the printer. + * Until then, we just overwrite it with "E" */ + price[EUR_FORMAT_MINLEN - 1] = 'E'; + rest[EUR_FORMAT_MINLEN - 1] = 'E'; + + /* clang-format off */ + n = snprintf(print_buffer, sizeof(print_buffer), + /* enable lower case letters -- 1 */ + "%c" + /* Transaction-ID (Anzahl verkaufter Einträge, inklusive des zu druckenden!) + -- 6-stellig */ + "[%3u] " + /* Uhrzeit -- 8-stellig + 3 */ + "%8s - " + /* Eintragname (= Getränk) -- 9-stellig + 3 */ + "%-" xstr(MAX_ITEM_NAME_LENGTH) "s - " + /* Preis (in Cents) -- 8-stellig + 3 */ + "%" xstr(EUR_FORMAT_MINLEN) "s - " + /* restguthaben (8-stellig) + 3 */ + "%" xstr(EUR_FORMAT_MINLEN) "s - " + /* Anzahl -- 2-stellig + 3 */ + "%2d - " + /* Nickname (falls es vom Guthaben abgezogen wird) -- 10-stellig + 4 */ + "an %" xstr(NICKNAME_MAX_LEN)"s\r", + 17, status.transaction_id, time, name, price, rest, einheiten, + (*nickname != '\0' ? nickname : "Unbekannt")); + /* clang-format on */ + if (n > sizeof(print_buffer)) { + cprintf("\r\nprint_log(): print_buffer overflowed!\r\n" + "Wanted to write %d bytes\r\n%s\r\n", + n, print_buffer); + exit(1); + } + status.transaction_id++; print_the_buffer(); } /* dialog which is called for each bought item */ -static signed int buy(char *name, unsigned int price) { +static signed int buy(char *name, int32_t price) { BYTE matches = 0; BYTE c, nickname_len; - int einheiten; + int16_t einheiten; char nickname[NICKNAME_MAX_LEN + 1]; - char rest[EUR_FORMAT_MINLEN]; + char rest[EUR_FORMAT_MINLEN + 1]; struct credits_t *credit; clrscr(); @@ -168,7 +186,7 @@ static signed int buy(char *name, unsigned int price) { * to NULL if no such credit could be found */ credit = find_credit(nickname); if (credit != NULL) { - while ((signed int)credit->credit < ((signed int)price * einheiten)) { + while ((int32_t)credit->credit < (price * einheiten)) { if (format_euro(rest, sizeof(rest), credit->credit) == NULL) { cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit); @@ -251,21 +269,25 @@ void buy_custom(void) { } void set_time_interactive(void) { - BYTE part[3] = {'0', '0', '\0'}; - BYTE tp1, tp2, tp3; + char part[3] = {'\0', '\0', '\0'}; + uint8_t day, tp1, tp2, tp3; char *time_input, *time; - cprintf("Gib die aktuelle Uhrzeit ein (Format HHMMSS):\r\n"); + cprintf("Gib den aktuellen Tag des Events und Uhrzeit ein\r\n" + "Format DHHMMSS, 0-indexiert, z.B. 0174259 für \"erster Tag um " + "17:42:59\":\r\n"); time_input = get_input(); part[0] = time_input[0]; - part[1] = time_input[1]; + day = atoi(part); + part[0] = time_input[1]; + part[1] = time_input[2]; tp1 = atoi(part); - part[0] = time_input[2]; - part[1] = time_input[3]; + part[0] = time_input[3]; + part[1] = time_input[4]; tp2 = atoi(part); - part[0] = time_input[4]; - part[1] = time_input[5]; + part[0] = time_input[5]; + part[1] = time_input[6]; tp3 = atoi(part); - set_time(tp1, tp2, tp3); + set_time(day, tp1, tp2, tp3); time = get_time(); cprintf("\r\nZeit gesetzt: %s\r\n", time); @@ -275,7 +297,10 @@ int main(void) { char *c; char *time; - init_globals(); + printing = 1; + /* initialize daytime global, start the CIA TOD */ + set_time(0, 0, 0, 0); + kasse_menu = MENU_UNDEFINED; videomode(VIDEOMODE_80x25); @@ -292,6 +317,8 @@ int main(void) { clrscr(); + install_daytime_irq(); + /* Allocate logging buffer memory */ init_log(); @@ -326,7 +353,9 @@ int main(void) { while (1) { print_screen(); + kasse_menu = MENU_MAIN; c = get_input(); + kasse_menu = MENU_UNDEFINED; /* ...display dialogs eventually */ if (*c >= PETSCII_0 && *c <= PETSCII_9) { /* if the input starts with a digit, we will interpret it as a number