summaryrefslogtreecommitdiffstats
path: root/src/user/clui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/clui.c')
-rw-r--r--src/user/clui.c471
1 files changed, 471 insertions, 0 deletions
diff --git a/src/user/clui.c b/src/user/clui.c
new file mode 100644
index 0000000..8c3c7ec
--- /dev/null
+++ b/src/user/clui.c
@@ -0,0 +1,471 @@
+/******************************************************************************
+ * Copyright (C) 2018 Alejandro Colomar Andrés *
+ * SPDX-License-Identifier: GPL-2.0-only *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+#include "vision-artificial/user/clui.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "libalx/base/stddef/size.h"
+#include "libalx/base/stdio/get.h"
+#include "libalx/base/stdio/wait.h"
+
+#include "vision-artificial/image/iface.h"
+#include "vision-artificial/user/iface.h"
+
+
+/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+#define BUFF_SIZE (0xFFF)
+
+
+/******************************************************************************
+ ******* enums ****************************************************************
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* structs / unions *****************************************************
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+/* Global --------------------------------------------------------------------*/
+/* Static --------------------------------------------------------------------*/
+
+
+/******************************************************************************
+ ******* static functions (prototypes) ****************************************
+ ******************************************************************************/
+static void log_loop (void);
+static int usr_input (void);
+static void show_help (void);
+
+
+/******************************************************************************
+ ******* global functions *****************************************************
+ ******************************************************************************/
+int user_clui (const char *restrict title,
+ const char *restrict subtitle)
+{
+
+ show_help();
+ user_clui_show_log(title, subtitle);
+ return usr_input();
+}
+
+void user_clui_fname (const char *restrict fpath,
+ char *restrict fname)
+{
+
+ alx_get_fname(fpath, fname, false, "File name:", "Valid extensions: .bmp .dib .jpeg .png .pbm .pgm .ppm .tiff",
+ 2);
+}
+
+void user_clui_show_log (const char *restrict title,
+ const char *restrict subtitle)
+{
+
+ printf("________________________________________________________________________________\n");
+ log_loop();
+ printf("%s - %s\n", subtitle, title);
+ printf("--------------------------------------------------------------------------------\n");
+
+}
+
+void user_clui_show_ocr (void)
+{
+
+ printf("%s", img_ocr_text);
+ alx_wait4enter();
+}
+
+
+/******************************************************************************
+ ******* static functions (definitions) ***************************************
+ ******************************************************************************/
+static void log_loop (void)
+{
+ const char *txt;
+
+ putchar('\n');
+ for (;;) {
+ txt = user_iface_log_read();
+ if (!txt)
+ break;
+ for (int i = 0; i < user_iface_log.lvl[user_iface_log.pos]; i++)
+ printf("\t");
+ printf("%s\n", txt);
+ }
+ printf("\n");
+}
+
+static int usr_input (void)
+{
+ char buff[BUFF_SIZE];
+ char ch [10];
+
+ memset(ch, 0, ARRAY_SIZE(ch));
+ buff[0] = '\0';
+
+ if (!fgets(buff, BUFF_SIZE, stdin))
+ goto err_fgets;
+ if (sscanf(buff, " %5c", ch) <= 0)
+ goto err_sscanf;
+
+ switch (ch[0]) {
+ case '+':
+ return USER_IFACE_ACT_APPLY;
+ case '-':
+ return USER_IFACE_ACT_DISCARD;
+ case 'e':
+ /* Exercises from class */
+ switch (ch[1]) {
+ case '1':
+ /* Label */
+ switch (ch[2]) {
+ case '1':
+ return USER_IFACE_ACT_PROC_LABEL_SERIES;
+ }
+ break;
+ case '2':
+ /* Objects */
+ switch (ch[2]) {
+ case '0':
+ return USER_IFACE_ACT_PROC_OBJECTS_CALIB;
+ case '1':
+ return USER_IFACE_ACT_PROC_OBJECTS_SERIES;
+ }
+ break;
+ case '3':
+ /* Coins */
+ switch (ch[2]) {
+ case '1':
+ return USER_IFACE_ACT_PROC_COINS_SERIES;
+ }
+ break;
+ case '4':
+ /* Resistor */
+ switch (ch[2]) {
+ case '1':
+ return USER_IFACE_ACT_PROC_RESISTOR_SERIES;
+ }
+ break;
+ case '5':
+ /* Lighters */
+ switch (ch[2]) {
+ case '1':
+ return USER_IFACE_ACT_PROC_LIGHTERS_SERIES;
+ }
+ break;
+ }
+ break;
+
+ case 'f':
+ /* Use simple funtions */
+ switch (ch[1]) {
+ case '0':
+ /* img_alx */
+ switch (ch[2]) {
+ case '0':
+ /* Distance transform postprocessing */
+ switch (ch[3]) {
+ case '0':
+ return USER_IFACE_ACT_LOCAL_MAX;
+ case '1':
+ return USER_IFACE_ACT_SKELETON;
+ }
+ break;
+ case '1':
+ /* Lines */
+ switch (ch[3]) {
+ case '0':
+ return USER_IFACE_ACT_LINES_HORIZONTAL;
+ case '1':
+ return USER_IFACE_ACT_LINES_VERTICAL;
+ }
+ break;
+ case '2':
+ /* Smooth */
+ switch (ch[3]) {
+ case '0':
+ return USER_IFACE_ACT_MEAN_HORIZONTAL;
+ case '1':
+ return USER_IFACE_ACT_MEAN_VERTICAL;
+ case '2':
+ return USER_IFACE_ACT_MEDIAN_HORIZONTAL;
+ case '3':
+ return USER_IFACE_ACT_MEDIAN_VERTICAL;
+ }
+ break;
+ }
+ break;
+ case '1':
+ /* img_cv */
+ switch (ch[2]) {
+ case '0':
+ /* Core: The core functionality */
+ switch (ch[3]) {
+ case '0':
+ /* Pixel */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_PIXEL_GET;
+ case '1':
+ return USER_IFACE_ACT_PIXEL_SET;
+ }
+ break;
+ case '1':
+ /* ROI */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_SET_ROI;
+ case '1':
+ return USER_IFACE_ACT_SET_ROI_2RECT;
+ }
+ break;
+ case '2':
+ /* Operations on Arrays */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_AND_2REF;
+ case '1':
+ return USER_IFACE_ACT_NOT;
+ case '2':
+ return USER_IFACE_ACT_OR_2REF;
+ case '3':
+ return USER_IFACE_ACT_COMPONENT;
+ }
+ break;
+ }
+ break;
+ case '1':
+ /* Imgproc: Image processing */
+ switch (ch[3]) {
+ case '0':
+ /* Image filtering */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_DILATE;
+ case '1':
+ return USER_IFACE_ACT_ERODE;
+ case '2':
+ return USER_IFACE_ACT_DILATE_ERODE;
+ case '3':
+ return USER_IFACE_ACT_ERODE_DILATE;
+ case '4':
+ return USER_IFACE_ACT_SMOOTH;
+ case '5':
+ return USER_IFACE_ACT_SOBEL;
+ case '6':
+ return USER_IFACE_ACT_BORDER;
+ }
+ break;
+ case '1':
+ /* Geometric image transformations */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_MIRROR;
+ case '1':
+ return USER_IFACE_ACT_ROTATE_ORTO;
+ case '2':
+ return USER_IFACE_ACT_ROTATE;
+ case '3':
+ return USER_IFACE_ACT_ROTATE_2RECT;
+ }
+ break;
+ case '2':
+ /* Miscellaneous image transformations */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_ADAPTIVE_THRESHOLD;
+ case '1':
+ return USER_IFACE_ACT_CVT_COLOR;
+ case '2':
+ return USER_IFACE_ACT_DISTANCE_TRANSFORM;
+ case '3':
+ return USER_IFACE_ACT_THRESHOLD;
+ }
+ break;
+ case '3':
+ /* Histograms */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_HISTOGRAM;
+ case '1':
+ return USER_IFACE_ACT_HISTOGRAM_C3;
+ }
+ break;
+ case '4':
+ /* Structural analysis and shape descriptors */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_CONTOURS;
+ case '1':
+ return USER_IFACE_ACT_CONTOURS_SIZE;
+ case '2':
+ return USER_IFACE_ACT_BOUNDING_RECT;
+ case '3':
+ return USER_IFACE_ACT_FIT_ELLIPSE;
+ case '4':
+ return USER_IFACE_ACT_MIN_AREA_RECT;
+ }
+ break;
+ case '5':
+ /* Feature detection */
+ switch (ch[4]) {
+ case '0':
+ return USER_IFACE_ACT_HOUGH_CIRCLES;
+ }
+ break;
+ }
+ break;
+ }
+ break;
+ case '2':
+ /* img_orb */
+ switch (ch[2]) {
+ case '0':
+ return USER_IFACE_ACT_ALIGN;
+ }
+ break;
+ case '3':
+ /* img_calib3d */
+ switch (ch[2]) {
+ case '0':
+ return USER_IFACE_ACT_CALIBRATE;
+ case '1':
+ return USER_IFACE_ACT_UNDISTORT;
+ }
+ break;
+ case '4':
+ /* img_zbar */
+ switch (ch[2]) {
+ case '0':
+ return USER_IFACE_ACT_DECODE;
+ }
+ break;
+ case '5':
+ /* img_ocr */
+ switch (ch[2]) {
+ case '0':
+ return USER_IFACE_ACT_READ;
+ }
+ break;
+ }
+ break;
+ case 'l':
+ return USER_IFACE_ACT_LOAD_MEM;
+ case 'm':
+ return USER_IFACE_ACT_SAVE_MEM;
+ case 'q':
+ return USER_IFACE_ACT_QUIT;
+ case 'r':
+ return USER_IFACE_ACT_SAVE_REF;
+ case 's':
+ return USER_IFACE_ACT_SAVE_FILE;
+ case 'u':
+ /* User iface actions */
+ switch (ch[1]) {
+ case '1':
+ return USER_IFACE_ACT_SHOW_OCR;
+ }
+ break;
+ case 'x':
+ /* Special sequence "xyzzy" */
+ if (ch[1] == 'y') {
+ if (ch[2] == 'z') {
+ if (ch[3] == 'z') {
+ if (ch[4] == 'y') {
+ return USER_IFACE_ACT_FOO;
+ }
+ }
+ }
+ }
+ break;
+ }
+
+err_fgets:
+err_sscanf:
+ return USER_IFACE_ACT_FOO;
+}
+
+static void show_help (void)
+{
+
+ printf("Apply: %s\n", "Space");
+ printf("Discard: %s\n", "Backspace");
+ printf("Save to mem: %c\n", 'm');
+ printf("Load from mem: %c\n", 'l');
+ printf("Save to ref: %c\n", 'r');
+ printf("Save to file: %c\n", 's');
+ printf("Functions:\n");
+ printf(" - Local maxima: %s\n", "f000");
+ printf(" - Skeleton: %s\n", "f001");
+ printf(" - Horizontal lines: %s\n", "f010");
+ printf(" - Vertical lines: %s\n", "f011");
+ printf(" - Horizontal mean: %s\n", "f020");
+ printf(" - Vertical mean: %s\n", "f021");
+ printf(" - Horizontal median: %s\n", "f022");
+ printf(" - Vertical median: %s\n", "f023");
+ printf(" - Pixel get: %s\n", "f1000");
+ printf(" - Pixel set: %s\n", "f1001");
+ printf(" - Set ROI: %s\n", "f1010");
+ printf(" - Set ROI 2rect: %s\n", "f1011");
+ printf(" - Bitwise AND 2ref: %s\n", "f1020");
+ printf(" - Bitwise NOT: %s\n", "f1021");
+ printf(" - Bitwise OR 2ref: %s\n", "f1022");
+ printf(" - Component: %s\n", "f1023");
+ printf(" - Dilate: %s\n", "f1100");
+ printf(" - Erode: %s\n", "f1101");
+ printf(" - D-E: %s\n", "f1102");
+ printf(" - E-D: %s\n", "f1103");
+ printf(" - Smooth: %s\n", "f1104");
+ printf(" - Sobel: %s\n", "f1105");
+ printf(" - Border: %s\n", "f1106");
+ printf(" - Mirror: %s\n", "f1110");
+ printf(" - Rotate ortogonally: %s\n", "f1111");
+ printf(" - Rotate: %s\n", "f1112");
+ printf(" - Rotate 2rect_rot: %s\n", "f1113");
+ printf(" - Adaptive threshold: %s\n", "f1120");
+ printf(" - Cvt color: %s\n", "f1121");
+ printf(" - Distance transform: %s\n", "f1122");
+ printf(" - Threshold: %s\n", "f1123");
+ printf(" - Histogram: %s\n", "f1130");
+ printf(" - Histogram (3 chan): %s\n", "f1131");
+ printf(" - Contours: %s\n", "f1140");
+ printf(" - Contours size: %s\n", "f1141");
+ printf(" - Bounding rectangle: %s\n", "f1142");
+ printf(" - Fit ellipse: %s\n", "f1143");
+ printf(" - Min. area rectangle: %s\n", "f1144");
+ printf(" - Hough circles: %s\n", "f1150");
+ printf(" - Align 2ref (ORB): %s\n", "f20");
+ printf(" - Calibrate (Calib3d): %s\n", "f30");
+ printf(" - Undistort (Calib3d): %s\n", "f31");
+ printf(" - Scan codes (ZBAR): %s\n", "f40");
+ printf(" - Scan text (OCR): %s\n", "f50");
+ printf("Exercises:\n");
+ printf(" - Label: %s\n", "e11");
+ printf(" - Objects (calib): %s\n", "e20");
+ printf(" - Objects: %s\n", "e21");
+ printf(" - Coins: %s\n", "e31");
+ printf(" - Resistor: %s\n", "e41");
+ printf(" - Lighters: %s\n", "e51");
+ printf("Other:\n");
+ printf(" - Show OCR text: %s\n", "u1");
+ printf("Quit: %c\n", 'q');
+}
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/