static void print_cmd_by_category(const struct category_description *catdesc) { struct cmdname_help *cmds; int longest = 0; int i, nr = 0; uint32_t mask = 0; for (i = 0; catdesc[i].desc; i++) mask |= catdesc[i].category; extract_cmds(&cmds, mask); for (i = 0; cmds[i].name; i++, nr++) { if (longest < strlen(cmds[i].name)) longest = strlen(cmds[i].name); } QSORT(cmds, nr, cmd_name_cmp); for (i = 0; catdesc[i].desc; i++) { uint32_t mask = catdesc[i].category; const char *desc = catdesc[i].desc; printf("\n%s\n", _(desc)); print_command_list(cmds, mask, longest); } free(cmds); }
int main(void) { char cmd[MAX]; int i; print_command_list(); get_command(cmd, MAX); do { parse_command(cmd); get_command(cmd, MAX); } while ((strcmp(cmd, "q")) != 0); return 0; }
int main(int argc, char** argv) { fd_set rdset; char* tty_dev; struct termios tio; uint8 b = 0; tty_dev = default_tty_dev; if (argc > 1) { printf("using device: %s\n", argv[1]); tty_dev = argv[1]; } printf("command syntax: <command>:<value>\n"); print_command_list(); memset(&tio, 0, sizeof(tio)); tio.c_iflag = 0; tio.c_oflag = 0; tio.c_cflag = CS8 | CREAD | CLOCAL; /* 8n1, see termios.h for more information */ tio.c_lflag = 0; tio.c_cc[VMIN] = 1; tio.c_cc[VTIME] = 5; tty_fd = open(tty_dev, O_RDWR | O_NONBLOCK); cfsetospeed(&tio, B9600); /* baud */ cfsetispeed(&tio, B9600); /* baud */ tcsetattr(tty_fd, TCSANOW, &tio); pthread_create(&cmd_thread, NULL, CmdThreadProc, NULL); pthread_create(&comm_thread, NULL, CommThreadProc, NULL); pthread_create(&intel_thread, NULL, IntelThreadProc, NULL); pthread_create(&bt_thread, NULL, BTThreadProc, NULL); pthread_create(&camera_thread, NULL, CameraThreadProc, NULL); pthread_join(cmd_thread, cmd_thread_status); pthread_join(comm_thread, &comm_thread_status); pthread_join(intel_thread, &intel_thread_status); pthread_join(bt_thread, &bt_thread_status); pthread_join(camera_thread, &camera_thread_status); close(tty_fd); return 0; }
void list_all_cmds_help(void) { struct string_list others = STRING_LIST_INIT_DUP; struct string_list alias_list = STRING_LIST_INIT_DUP; struct cmdname_help *aliases; int i, longest; printf_ln(_("See 'git help <command>' to read about a specific subcommand")); print_cmd_by_category(main_categories, &longest); list_all_other_cmds(&others); if (others.nr) printf("\n%s\n", _("External commands")); for (i = 0; i < others.nr; i++) printf(" %s\n", others.items[i].string); string_list_clear(&others, 0); git_config(get_alias, &alias_list); string_list_sort(&alias_list); for (i = 0; i < alias_list.nr; i++) { size_t len = strlen(alias_list.items[i].string); if (longest < len) longest = len; } if (alias_list.nr) { printf("\n%s\n", _("Command aliases")); ALLOC_ARRAY(aliases, alias_list.nr + 1); for (i = 0; i < alias_list.nr; i++) { aliases[i].name = alias_list.items[i].string; aliases[i].help = alias_list.items[i].util; aliases[i].category = 1; } aliases[alias_list.nr].name = NULL; print_command_list(aliases, 1, longest); free(aliases); } string_list_clear(&alias_list, 1); }
void* CmdThreadProc(void* data) { char* p; uint8 state; uint8 val = 0; uint8 cmd = 0; char* cmd_str; char* val_str; char input[128]; while (1) { printf("cmd: "); scanf("%s", input); p = strchr(input, ':'); val_str = cmd_str = NULL; if (p != NULL) { val_str = p + 1; input[(p - input)] = '\0'; } cmd_str = input; cmd = get_command_id(cmd_str); if (cmd == CMD_UNKNOWN) { printf("unknown command!\n"); continue; } switch (cmd) { case CMD_TEENSY_MODE: state = get_state_id(val_str); if (state == STATE_UNKNOWN) { printf("unknown mode!\n"); continue; } send_command(tty_fd, cmd, state); break; case CMD_CHANGE_STATE: state = get_state_id(val_str); if (state == STATE_UNKNOWN) { printf("unknown state!\n"); continue; } send_command(tty_fd, cmd, state); break; case CMD_HARD_TURN: val = get_turn_id(val_str); if (val == TURN_UNKNOWN) { printf("unknown turn!\n"); continue; } send_command(tty_fd, cmd, val); break; case CMD_SOFT_TURN: val = get_turn_id(val_str); if (val == TURN_UNKNOWN) { printf("unknown turn!\n"); continue; } send_command(tty_fd, cmd, val); break; case CMD_SET_DIRECTION: val = get_move_id(val_str); if (val == MOVE_UNKNOWN) { printf("unknown move direction!\n"); continue; } send_command(tty_fd, cmd, val); break; case CMD_DIST_CENTER: val = get_decimal_value(val_str); send_command(tty_fd, cmd, val); break; case CMD_DIST_LEFT: val = get_decimal_value(val_str); send_command(tty_fd, cmd, val); break; case CMD_DIST_RIGHT: val = get_decimal_value(val_str); send_command(tty_fd, cmd, val); break; case CMD_SPEED: val = get_decimal_value(val_str); send_command(tty_fd, cmd, val); break; case CMD_HELP: val = get_command_id(val_str); if (val == CMD_UNKNOWN) { printf("command syntax: <command>:<value>\n"); print_command_list(); } else { switch (val) { case CMD_CHANGE_STATE: printf("state:<state>, where <state> is one of the following:\n"); printf("nothing, basic, orders, dance.\n"); break; default: printf("command syntax: <command>:<value>\n"); print_command_list(); break; } } break; case CMD_QUIT: exit(0); break; } } pthread_exit(NULL); }
int server(int num_clients, int port) { WicServer server; wic_init_server(&server, port, num_clients); ClientData* clients = malloc(num_clients * sizeof(ClientData)); for(int i = 0; i < num_clients; i++) clients[i].joined = false; Command command; command.created = false; pthread_t command_thread; pthread_create(&command_thread, 0, accept_command, &command); printf("Type commands below...\n"); WicPacket recv; WicPacket send; while(true) { if(command.created == true) { if(strncmp(command.first_arg, "exit", 4) == 0) break; else if(strcmp(command.first_arg, "help") == 0) print_command_list(); else if(strcmp(command.first_arg, "kick") == 0) { ClientData* client = lookup_client(clients, command.second_arg, num_clients); if(client == 0) printf("ERROR: Client %s does not exist\n", command.second_arg); else wic_kick_client(&server, client->client_id); } else if(strcmp(command.first_arg, "ban-client") == 0) { ClientData* client = lookup_client(clients, command.second_arg, num_clients); if(client == 0) printf("ERROR: Client %s does not exist\n", command.second_arg); else wic_ban_client(&server, client->client_id); } else if(strcmp(command.first_arg, "ban-address") == 0) { wic_ban_address(&server, command.second_arg); } else if(strcmp(command.first_arg, "unban-address") == 0) { wic_unban_address(&server, command.second_arg); } else if(strcmp(command.first_arg, "ls-clients") == 0) { print_clients(clients, num_clients); } else printf("%s '%s'. %s", "ERROR: Invalid command", command.first_arg, "Type 'help' for command list\n"); command.created = false; pthread_create(&command_thread, 0, accept_command, &command); } enum WicError error = wic_server_recv_packet(&server, &recv); if(error == WICER_NONE) { unsigned char client_id = recv.client_id; if(recv.type.id == WIC_PACKET_JOIN.id) { clients[client_id].joined = true; clients[client_id].client_id = client_id; init_entity_manager(&clients[client_id].manager); printf("client %u joined\n", client_id); } if(recv.type.id == PACKET_USERNAME_INFO.id) { memcpy(clients[client_id].username, recv.data, PACKET_USERNAME_INFO.size); wic_send_packet_to_other_clients(&server, &recv, client_id); for(unsigned char id = 0; id < num_clients; id++) { if(clients[id].joined && id != client_id) { send.type = PACKET_USERNAME_INFO; send.client_id = id; memcpy(send.data, clients[id].username, sizeof(clients[id].username)); wic_send_packet_to_client(&server, &send, client_id); } } } else if(recv.type.id == WIC_PACKET_LEAVE.id) { clients[client_id].joined = false; free_entity_manager(&clients[client_id].manager); printf("client %u left\n", recv.client_id); } else if(recv.type.id == PACKET_UPDT_ENTITY.id) { Entity entity; memcpy(&entity, recv.data, PACKET_UPDT_ENTITY.size); updt_entity(&clients[client_id].manager, entity); wic_send_packet_to_other_clients(&server, &recv, client_id); } else if(recv.type.id == PACKET_REMV_ENTITY.id) { remove_entity(&clients[client_id].manager, recv.data[0]); wic_send_packet_to_other_clients(&server, &recv, client_id); } } } printf("Exiting server..\n"); wic_free_server(&server); return 0; }