videohubctrl can be used to control Blackmagic Design Videohub SDI router device over the network.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

display.c 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /*
  2. * === Display functions ===
  3. *
  4. * Blackmagic Design Videohub control application
  5. * Copyright (C) 2014 Unix Solutions Ltd.
  6. * Written by Georgi Chorbadzhiyski
  7. *
  8. * Released under MIT license.
  9. * See LICENSE-MIT.txt for license terms.
  10. *
  11. */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include "data.h"
  15. #include "cmd.h"
  16. #include "util.h"
  17. #include "display.h"
  18. static void printf_line(int len) {
  19. int i;
  20. printf(" ");
  21. for (i = 0; i < len; i++)
  22. printf("-");
  23. printf("\n");
  24. }
  25. static char format_status(enum port_status status) {
  26. switch (status) {
  27. case S_UNKNOWN: return ' ';
  28. case S_BNC : return 'B';
  29. case S_OPTICAL: return 'o';
  30. case S_NONE : return 'x';
  31. case S_RS422 : return '4'; // For serial ports
  32. }
  33. return '?';
  34. }
  35. void print_device_info(struct videohub_data *d) {
  36. int len = 59;
  37. printf("Device info\n");
  38. printf_line(len);
  39. printf(" | %-26s | %-26s |\n", "Device address", d->dev_host);
  40. printf(" | %-26s | %-26s |\n", "Device port", d->dev_port);
  41. printf(" | %-26s | %-26s |\n", "Model name", d->device.model_name);
  42. printf(" | %-26s | %-26s |\n", "Unique ID", d->device.unique_id);
  43. printf(" | %-26s | %-26s |\n", "Protocol", d->device.protocol_ver);
  44. printf(" | %-26s | %-26u |\n", "Video inputs", d->inputs.num);
  45. printf(" | %-26s | %-26u |\n", "Video outputs", d->outputs.num);
  46. if (d->serial.num)
  47. printf(" | %-26s | %-26u |\n", "Serial ports", d->serial.num);
  48. if (d->device.num_video_processing_units)
  49. printf(" | %-26s | %-26u |\n", "Video processing units", d->device.num_video_processing_units);
  50. if (d->mon_outputs.num)
  51. printf(" | %-26s | %-26u |\n", "Video monitoring outputs", d->mon_outputs.num);
  52. printf_line(len);
  53. printf("\n");
  54. }
  55. void print_device_video_inputs(struct videohub_data *d) {
  56. unsigned int i, r, len = 68;
  57. if (!d->inputs.num)
  58. return;
  59. printf("Video inputs\n");
  60. printf_line(len);
  61. printf(" | ## | %-24s | n | %-24s | s |\n", "Video input name", "Routed to output");
  62. printf_line(len);
  63. for(i = 0; i < d->inputs.num; i++) {
  64. unsigned int num_outputs = 0, routed_to = 0;
  65. for(r = 0; r < d->outputs.num; r++) {
  66. if (d->outputs.port[r].routed_to == i) {
  67. num_outputs++;
  68. if (num_outputs == 1)
  69. routed_to = r; // The first output
  70. }
  71. }
  72. printf(" | %2d | %-24s | %d | ", i + 1, d->inputs.port[i].name,
  73. num_outputs);
  74. if (num_outputs == 0) {
  75. printf("%-24s | %c |\n", "-", format_status(d->inputs.port[i].status));
  76. } else {
  77. printf("%-24s | %c |\n", d->outputs.port[routed_to].name, format_status(d->inputs.port[i].status));
  78. bool first_skipped = false;
  79. for(r = 0; r < d->outputs.num; r++) {
  80. if (d->outputs.port[r].routed_to == i) {
  81. if (!first_skipped) {
  82. first_skipped = true;
  83. continue;
  84. }
  85. printf(" | %2s | %-24s | %s | %-24s | %c |\n",
  86. " ", " ", " ", d->outputs.port[r].name, ' ');
  87. }
  88. }
  89. }
  90. }
  91. printf_line(len);
  92. printf("\n");
  93. }
  94. static char port_lock_symbol(enum port_lock p) {
  95. switch(p) {
  96. case PORT_UNLOCKED : return ' ';
  97. case PORT_LOCKED : return 'O';
  98. case PORT_LOCKED_OTHER: return 'L';
  99. }
  100. return '?';
  101. }
  102. void print_device_video_outputs(struct videohub_data *d) {
  103. unsigned int i, len = 68;
  104. if (!d->outputs.num)
  105. return;
  106. printf("Video outputs\n");
  107. printf_line(len);
  108. printf(" | ## | x | %-24s | %-24s | s |\n", "Video output name", "Connected video input");
  109. printf_line(len);
  110. for(i = 0; i < d->outputs.num; i++) {
  111. printf(" | %2d | %c | %-24s | %-24s | %c |\n",
  112. i + 1,
  113. port_lock_symbol(d->outputs.port[i].lock),
  114. d->outputs.port[i].name,
  115. d->inputs.port[d->outputs.port[i].routed_to].name,
  116. format_status(d->outputs.port[i].status)
  117. );
  118. }
  119. printf_line(len);
  120. printf("\n");
  121. }
  122. void print_device_monitoring_outputs(struct videohub_data *d) {
  123. unsigned int i, len = 64;
  124. if (!d->mon_outputs.num)
  125. return;
  126. printf("Monitoring outputs\n");
  127. printf_line(len);
  128. printf(" | ## | x | %-24s | %-24s |\n", "Monitoring output name", "Connected video input");
  129. printf_line(len);
  130. for(i = 0; i < d->mon_outputs.num; i++) {
  131. printf(" | %2d | %c | %-24s | %-24s |\n",
  132. i + 1,
  133. port_lock_symbol(d->mon_outputs.port[i].lock),
  134. d->mon_outputs.port[i].name,
  135. d->inputs.port[d->mon_outputs.port[i].routed_to].name
  136. );
  137. }
  138. printf_line(len);
  139. printf("\n");
  140. }
  141. static char *dir2opt(enum serial_dir dir) {
  142. switch (dir) {
  143. case DIR_CONTROL: return "in";
  144. case DIR_SLAVE : return "out";
  145. case DIR_AUTO : return "auto";
  146. }
  147. return "auto";
  148. }
  149. void print_device_serial_ports(struct videohub_data *d) {
  150. unsigned char port_seen[MAX_PORTS];
  151. unsigned int i, len = 63;
  152. if (!d->serial.num)
  153. return;
  154. memset(port_seen, 0, sizeof(port_seen));
  155. printf("Serial ports\n");
  156. printf_line(len);
  157. printf(" | ## | x | Dir | %-18s | %-18s | s |\n", "Serial port", "Connected serial");
  158. printf_line(len);
  159. for(i = 0; i < d->serial.num; i++) {
  160. printf(" | %2d | %c | %4s | %-18s | %-18s | %c |\n",
  161. i + 1,
  162. port_lock_symbol(d->serial.port[i].lock),
  163. dir2opt(d->serial.port[i].direction),
  164. d->serial.port[i].name,
  165. (d->serial.port[i].routed_to_set && !port_seen[d->serial.port[i].routed_to]
  166. ? d->serial.port[d->serial.port[i].routed_to].name
  167. : ""),
  168. format_status(d->serial.port[i].status)
  169. );
  170. port_seen[d->serial.port[i].routed_to]++;
  171. }
  172. printf_line(len);
  173. printf("\n");
  174. }
  175. static void __print_opt(struct videohub_data *d, enum vcmd vcmd) {
  176. unsigned int i, last = 0;
  177. struct videohub_commands *v = &videohub_commands[vcmd];
  178. struct port_set *s_port = !v->ports1 ? NULL : (void *)d + v->ports1;
  179. const char *p = v->opt_prefix;
  180. for(i = 0; i < s_port->num; i++) {
  181. switch (v->type) {
  182. case PARSE_LABEL:
  183. printf(" --%s-name %2d \"%s\" \\\n", p, i + 1, s_port->port[i].name);
  184. break;
  185. case PARSE_ROUTE:
  186. if (v->cmd == CMD_SERIAL_PORT_ROUTING && !s_port->port[i].routed_to_set)
  187. continue;
  188. printf(" --%s-input %2d %2d \\\n", p, i + 1, s_port->port[i].routed_to + 1);
  189. break;
  190. case PARSE_LOCK:
  191. last = i + 1 < s_port->num;
  192. if (s_port->port[i].lock != PORT_UNLOCKED) {
  193. printf(" --%s-unlock %2d --%s-lock %2d%s\n",
  194. p, i + 1, p, i + 1, last ? " \\" : "");
  195. } else {
  196. printf(" --%s-unlock %2d%s\n", p, i + 1, last ? " \\" : "");
  197. }
  198. break;
  199. case PARSE_DIR:
  200. printf(" --%s-dir %2d %s \\\n", p, i + 1, dir2opt(s_port->port[i].direction));
  201. break;
  202. default: break;
  203. }
  204. }
  205. }
  206. void print_device_backup(struct videohub_data *d) {
  207. unsigned int i;
  208. printf("videohubctrl \\\n");
  209. for (i = 0; i < NUM_COMMANDS; i++) {
  210. if (videohub_commands[i].type == PARSE_LABEL)
  211. __print_opt(d, videohub_commands[i].cmd);
  212. }
  213. for (i = 0; i < NUM_COMMANDS; i++) {
  214. if (videohub_commands[i].type == PARSE_ROUTE)
  215. __print_opt(d, videohub_commands[i].cmd);
  216. }
  217. for (i = 0; i < NUM_COMMANDS; i++) {
  218. if (videohub_commands[i].type == PARSE_DIR)
  219. __print_opt(d, videohub_commands[i].cmd);
  220. }
  221. for (i = 0; i < NUM_COMMANDS; i++) {
  222. if (videohub_commands[i].type == PARSE_LOCK)
  223. __print_opt(d, videohub_commands[i].cmd);
  224. }
  225. printf("\n");
  226. }