summaryrefslogtreecommitdiffstats
path: root/src/ss5/display_status.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ss5/display_status.c')
-rw-r--r--src/ss5/display_status.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/ss5/display_status.c b/src/ss5/display_status.c
new file mode 100644
index 0000000..70201c4
--- /dev/null
+++ b/src/ss5/display_status.c
@@ -0,0 +1,169 @@
+/* display status functions
+ *
+ * (C) 2020 by Andreas Eversberg <jolly@eversberg.eu>
+ * All Rights Reserved
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <sys/types.h>
+#include "../libdebug/debug.h"
+#include "ss5.h"
+#include "display.h"
+
+static int status_on = 0;
+static int line_count = 0;
+static int lines_total = 0;
+static char screen[MAX_HEIGHT_STATUS][MAX_DISPLAY_WIDTH];
+static char screen_color[MAX_HEIGHT_STATUS][MAX_DISPLAY_WIDTH];
+
+static void print_status(int on)
+{
+ int i, j;
+ int w, h;
+ char color, last_color = -1;
+
+ get_win_size(&w, &h);
+ if (w > MAX_DISPLAY_WIDTH - 1)
+ w = MAX_DISPLAY_WIDTH - 1;
+
+ if (w > MAX_DISPLAY_WIDTH)
+ w = MAX_DISPLAY_WIDTH;
+ h--;
+ if (h > lines_total)
+ h = lines_total;
+
+ printf("\0337\033[H");
+ for (i = 0; i < h; i++) {
+ j = 0;
+ if (on) {
+ for (j = 0; j < w; j++) {
+ color = screen_color[i][j];
+ if (screen[i][j] > ' ' && last_color != color) {
+ printf("\033[%d;3%dm", color / 10, color % 10);
+ last_color = color;
+ }
+ putchar(screen[i][j]);
+ }
+ } else {
+ for (j = 0; j < w; j++)
+ putchar(' ');
+ }
+ putchar('\n');
+ }
+ printf("\033[0;39m\0338"); fflush(stdout);
+}
+
+void display_status_on(int on)
+{
+ if (status_on)
+ print_status(0);
+
+ if (on < 0)
+ status_on = 1 - status_on;
+ else
+ status_on = on;
+
+ if (status_on)
+ print_status(1);
+
+ if (status_on)
+ debug_limit_scroll = lines_total;
+ else
+ debug_limit_scroll = 0;
+}
+
+/* start status display */
+void display_status_start(void)
+{
+ memset(screen, ' ', sizeof(screen));
+ memset(screen_color, 7, sizeof(screen_color));
+ memset(screen[0], '-', sizeof(screen[0]));
+ memcpy(screen[0] + 4, "Call Status", 11);
+ line_count = 1;
+}
+
+void display_status_line(const char *if_name, int link_count, const char *from_id, const char *to_id, enum ss5_state state)
+{
+ char line[MAX_DISPLAY_WIDTH + 4096];
+ char color[MAX_DISPLAY_WIDTH + 4096];
+ int index, from_len, to_len;
+
+ memset(color, 7, sizeof(color)); // make valgrind happy
+
+ if (line_count == MAX_HEIGHT_STATUS)
+ return;
+
+ /* at first interface or when it changes */
+ if (!link_count)
+ line_count++;
+
+ /* check line count again */
+ if (line_count == MAX_HEIGHT_STATUS)
+ return;
+
+ if (!link_count) {
+ /* interface */
+ strcpy(line, if_name);
+ memset(color, 3, strlen(if_name));
+ } else {
+ memset(line, ' ', strlen(if_name));
+ }
+ index = strlen(if_name);
+
+ if (from_id && to_id) {
+ /* '<id>' */
+ sprintf(line + index, " \'%s\' -> \'%s\' ", from_id, to_id);
+ from_len = strlen(from_id);
+ to_len = strlen(to_id);
+ memset(color + index, 1, 4 + from_len);
+ memset(color + index + 4 + from_len, 7, 2);
+ memset(color + index + 4 + from_len + 2, 2, 4 + to_len);
+ index += 4 + from_len + 2 + 4 + to_len;
+ line[index] = '\0';
+
+ strcpy(line + index, ss5_state_names[state]);
+ memset(color + index, 7, strlen(ss5_state_names[state]));
+ }
+
+ /* store line without CR, but not more than MAX_DISPLAY_WIDTH - 1 */
+ line[MAX_DISPLAY_WIDTH - 1] = '\0';
+ memcpy(screen[line_count], line, strlen(line));
+ memcpy(screen_color[line_count], color, strlen(line));
+ line_count++;
+}
+
+void display_status_end(void)
+{
+ if (line_count < MAX_HEIGHT_STATUS)
+ line_count++;
+
+ if (line_count < MAX_HEIGHT_STATUS) {
+ memset(screen[line_count], '-', sizeof(screen[line_count]));
+ line_count++;
+ }
+ /* if last total lines exceed current line count, keep it, so removed lines are overwritten with spaces */
+ if (line_count > lines_total)
+ lines_total = line_count;
+ if (status_on)
+ print_status(1);
+ /* set new total lines */
+ lines_total = line_count;
+ if (status_on)
+ debug_limit_scroll = lines_total;
+}
+