static void cmd_alrt (struct htlc_conn *htlc, u_int32_t cid, char *chatbuf) { char *p, *str; u_int32_t uid; u_int16_t style, len; struct htlc_conn *htlcp; int n, i = 1; char errbuf[sizeof(big_chatbuf)]; char nickbuf[sizeof(big_chatbuf)]; if (!htlc->access.can_broadcast) { cmd_denied(htlc, cid, "alert"); return; } p = chatbuf; uid = atou32(p); if (!uid && strncmp(p, "0 ", 2) && nick_to_uid(p, &uid)) { while (*p && *p != ' ') { p++; i++; } snprintf(nickbuf, i, "%s", chatbuf); snprintf(errbuf, MAX_CHAT - 7, "no such user \"%s\"", nickbuf); cmd_err(htlc, cid, "alert", errbuf); return; } htlcp = isclient(uid); if (!htlcp) { snprintf(errbuf, MAX_CHAT - 7, "no such user (uid:%u)", uid); cmd_err(htlc, cid, "alert", errbuf); return; } n = 1; while (*p && *p != ' ') { p++; n++; } if (!strlen(p) > 0) return; style = htons(1); str = &chatbuf[n]; len = strlen(str); if (isclient(htlcp->uid) != 0) { hlwrite(htlcp, HTLS_HDR_MSG, 0, 2, HTLS_DATA_STYLE, 2, &style, HTLS_DATA_MSG, len, str); } }
int8 master_macro_aws(int16 step){ int16 addr; int8 macro_cmd[2]; int16 macro_arg[2]; int8 macro_end; --step; addr = macro_address[0] + (step*6); init_ext_eeprom(); // port macro_cmd[0] = read_ext_eeprom(addr); ++addr; macro_arg[0] = read16_ext_eeprom(addr); ++addr; ++addr; // macro macro_cmd[1] = read_ext_eeprom(addr); ++addr; macro_arg[1] = read16_ext_eeprom(addr); ++addr; ++addr; macro_end = read_ext_eeprom(addr); // check basic structure if (macro_cmd[0] == 'P' && macro_cmd[1] == 'M') { RTC_read(); RTC_display(); fprintf(COM_A, "%c%Lu,%c%Lu\r\n", macro_cmd[0], macro_arg[0], // port macro_cmd[1], macro_arg[1]); // macro if (macro_arg[1] > 0 && macro_arg[1] < 17) { play_macro(macro_arg[1], macro_arg[0]); // [1] casts to int8 / [0] = port } } else { cmd_err(); macro_end = 59; } return (macro_end); }
void check_debug_uart(void) { static uint8_t inputbuf[RX_LINE_SIZE], inputptr = 0; uint8_t i, recv; int16_t ticks; while(uart_available(DEBUG)) { recv = uart_get(DEBUG); if(recv == '\r') { fprintf(&debug, "\r\n"); if(inputptr) { switch(inputbuf[0]) { case '?': // print drive command list fprintf_P(&debug, PSTR("stop() ........................ | p00\r\n")); fprintf_P(&debug, PSTR("fwd_both(speed) ............... | p0300, p0400, p15 u8\r\n")); fprintf_P(&debug, PSTR("rev_both(speed) ............... | p0301, p0401, p15 u8\r\n")); fprintf_P(&debug, PSTR("forward(Lspeed, Rspeed) ....... | p0300, p0400, p11 u8, p12 u8\r\n")); fprintf_P(&debug, PSTR("reverse(Lspeed, Rspeed) ....... | p0301, p0401, p11 u8, p12 u8\r\n")); fprintf_P(&debug, PSTR("turnCCW(Lspeed, Rspeed) ....... | p0301, p0400, p11 u8, p12 u8\r\n")); fprintf_P(&debug, PSTR("turnCW (Lspeed, Rspeed) ....... | p0300, p0401, p11 u8, p12 u8\r\n")); fprintf_P(&debug, PSTR("set_abs_pos(pos) .............. | p1a s16\r\n")); fprintf_P(&debug, PSTR("set_rel_pos(sect, pos) ........ | p1b u8 u8\r\n")); fprintf_P(&debug, PSTR("pos_corr_on() ................. | p1f01\r\n")); fprintf_P(&debug, PSTR("pos_corr_off() ................ | p1f00\r\n")); fprintf_P(&debug, PSTR("nav_abs_pos(speed, pos) ....... | p31 u8 s16\r\n")); fprintf_P(&debug, PSTR("nav_rel_pos(speed, sect, pos) . | p32 u8 u8 u8\r\n")); break; case 'p': // passthrough to DRIVE MCU for(i = 1; i < inputptr; i++) { uart_put(DRIVE, inputbuf[i]); } uart_put(DRIVE, '\r'); break; case 'r': // toggle reverse passthrough from DRIVE MCU rev_passthru ^= 1; break; case 'd': // local dump on/off local_dump ^= 1; break; case 's': // start/stop main thread run_main ^= 1; if(run_main) { fprintf_P(&debug, PSTR("Main thread started!\r\n")); } else { fprintf_P(&debug, PSTR("Main thread stopped!\r\n")); stop(); } break; case 't': // start/stop test thread if(inputptr != 2) { cmd_err(); break; } run_test = htoa(0, inputbuf[1]); if(!run_test) { fprintf_P(&debug, PSTR("All test sequences stopped!\r\n")); stop(); } else { fprintf_P(&debug, PSTR("Started test sequence %u!\r\n"), run_test); } break; case ' ': // stop all motors run_main = 0; run_test = 0; pid_on = 0; stop(); set_speed_3(0); set_speed_4(0); break; case 'u': fprintf_P(&debug, PSTR("%lu\r\n"), uptime()); break; case 'b': #define VBAT_FACTOR 0.0044336 fprintf_P(&debug, PSTR("4 x %1.2fV\r\n"), (float)read_adc(VSENS) * VBAT_FACTOR); break; case 'm': // servo power if(inputptr != 2 || (inputbuf[1] & ~1) != '0') { cmd_err(); break; } inputbuf[1] == '0' ? clr_bit(SPWR) : set_bit(SPWR); break; case '9': // magnets if(inputptr != 2 || (inputbuf[1] & ~1) != '0') { cmd_err(); break; } if(inputbuf[1] == '0') { clr_bit(FET1); clr_bit(FET2); fprintf_P(&debug, PSTR("Magnets off!\r\n")); } else { set_bit(FET1); set_bit(FET2); fprintf_P(&debug, PSTR("Magnets on!\r\n")); } break; case '1': // PID on/off if(inputptr != 2 || (inputbuf[1] & ~1) != '0') { cmd_err(); break; } if(inputbuf[1] == '0') { pid_on = 0; fprintf_P(&debug, PSTR("PID off!\r\n")); } else { pid_on = 1; fprintf_P(&debug, PSTR("PID on!\r\n")); reset_pid(); } break; case '3': // turn motor commands if(!isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } switch(inputbuf[1]) { case '0': // forward (uint8_t speed) if(inputptr != 4) { cmd_err(); break; } motor3_fwd(); set_speed_3(htoa(inputbuf[2], inputbuf[3]) * 40); break; case '1': // reverse (uint8_t speed) if(inputptr != 4) { cmd_err(); break; } motor3_rev(); set_speed_3(htoa(inputbuf[2], inputbuf[3]) * 40); break; case '2': // set reference target (int16_t ticks) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } pid_target[MOTOR3] = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '3': // set reference speed (int16_t ticks) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } pid_speed[MOTOR3] = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '4': // set P (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ENC3_P = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '5': // set I (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ENC3_I = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '6': // set D (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ENC3_D = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '7': // set noise gate (int16_t level) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ENC3_NOISE_GATE = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case 'f': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } ticks = deg2ticks(htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5])); cli(); V_encoder = ticks; sei(); reset_pid(); break; default: cmd_err(); } break; case '4': // lift motor commands if(!isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } switch(inputbuf[1]) { case '0': // up (uint8_t speed) if(inputptr != 4) { cmd_err(); break; } motor4_fwd(); set_speed_4(htoa(inputbuf[2], inputbuf[3]) * 40); break; case '1': // down (uint8_t speed) if(inputptr != 4) { cmd_err(); break; } motor4_rev(); set_speed_4(htoa(inputbuf[2], inputbuf[3]) * 40); break; case '2': // set reference target (int16_t ticks) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } pid_target[MOTOR4] = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '3': // set reference speed (int16_t ticks) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } pid_speed[MOTOR4] = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '4': // set P (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ACTU_P = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '5': // set I (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ACTU_I = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '6': // set D (int16_t factor) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ACTU_D = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '7': // set noise gate (int16_t level) if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } //ACTU_NOISE_GATE = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; default: cmd_err(); } break; case '5': // servo5 commands if(inputptr != 4 || !isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } servo5(htoa(inputbuf[2], inputbuf[3])); //OCR0A = htoa(inputbuf[1], inputbuf[2]); break; case '6': // servo6 commands if(inputptr != 4 || !isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } servo6(htoa(inputbuf[2], inputbuf[3])); //OCR0B = htoa(inputbuf[1], inputbuf[2]); break; case '7': // servo7 commands if(inputptr != 4 || !isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } servo7(htoa(inputbuf[2], inputbuf[3])); //OCR2A = htoa(inputbuf[1], inputbuf[2]); break; case '8': // servo8 commands if(inputptr != 4 || !isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } servo8(htoa(inputbuf[2], inputbuf[3])); //OCR2B = htoa(inputbuf[1], inputbuf[2]); break; case 'x': if(!isHex(inputbuf[2]) || !isHex(inputbuf[3])) { cmd_err(); break; } switch(inputbuf[1]) { case '1': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } param1 = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '2': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } param2 = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '3': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } param3 = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '4': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } param4 = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; case '5': // set reference angle if(inputptr != 6 || !isHex(inputbuf[4]) || !isHex(inputbuf[5])) { cmd_err(); break; } param5 = htoa(inputbuf[2], inputbuf[3]) << 8 | htoa(inputbuf[4], inputbuf[5]); break; } break; default: cmd_err(); } inputptr = 0; } } else if(recv == 0x7f) { if(!inputptr) { uart_put(DEBUG, '\a'); } else { fprintf(&debug, "\b\e[K"); inputptr--; } } else { if(inputptr == RX_LINE_SIZE) { uart_put(DEBUG, '\a'); } else { uart_put(DEBUG, recv); inputbuf[inputptr] = recv; inputptr++; } } }
static void cmd_kick (struct htlc_conn *htlc, u_int32_t cid, char *chatbuf, int ban) { char *p, *str; u_int32_t uid; struct htlc_conn *htlcp; int n, i = 1; char errbuf[sizeof(big_chatbuf)]; char nickbuf[sizeof(big_chatbuf)]; if (!htlc->access.disconnect_users) { if (!ban) cmd_denied(htlc, cid, "kick"); else cmd_denied(htlc, cid, "ban"); return; } p = chatbuf; uid = atou32(p); if (!uid && strncmp(p, "0 ", 2) && nick_to_uid(p, &uid)) { while (*p && *p != ' ') { p++; i++; } snprintf(nickbuf, i, "%s", chatbuf); snprintf(errbuf, MAX_CHAT - 7, "no such user \"%s\"", nickbuf); if (!ban) cmd_err(htlc, cid, "kick", errbuf); else cmd_err(htlc, cid, "ban", errbuf); return; } htlcp = isclient(uid); if (!htlcp) { snprintf(errbuf, MAX_CHAT - 7, "no such user (uid:%u)", uid); cmd_err(htlc, cid, "kick", errbuf); return; } if(ban) ban = hxd_cfg.options.ban_time; n = 1; while (*p && *p != ' ') { p++; n++; } if ((htlcp = isclient(uid))) { if (htlcp->access.cant_be_disconnected) { snprintf(errbuf, MAX_CHAT - 7, "%s cannot be disconnected.", htlcp->name); cmd_err(htlc, cid, "kick", errbuf); return; } str = &chatbuf[n]; if (strlen(p)) user_kick(htlcp, ban, htlc, str); else user_kick(htlcp, ban, htlcp, " "); } }
static void cmd_0wn (struct htlc_conn *htlc, u_int32_t cid, char *chatbuf) { char *p, *str; u_int32_t uid; int x, n, i=0; struct htlc_conn *htlcp; char nickbuf[sizeof(big_chatbuf)]; char errbuf[sizeof(big_chatbuf)]; char abuf[HOSTLEN+1]; if (!htlc->access_extra.user_0wn) { cmd_denied(htlc, cid, "0wn"); return; } p = chatbuf; uid = atou32(p); if (!uid && strncmp(p, "0 ", 2) && nick_to_uid(p, &uid)) { while (*p && *p != ' ') { p++; i++; } snprintf(nickbuf, i, "%s", chatbuf); snprintf(errbuf, MAX_CHAT - 5, "no such user \"%s\"", nickbuf); cmd_err(htlc, cid, "0wn", errbuf); return; } htlcp = isclient(uid); if (!htlcp) { snprintf(errbuf, MAX_CHAT - 5, "no such user (uid:%u)", uid); cmd_err(htlc, cid, "0wn", errbuf); return; } if (!htlcp->access_extra.is_0wn3d) { cmd_err(htlc, cid, "0wn", "User cannot be 0wned"); return; } while (*p && *p != ' ') p++; while (*p && *p == ' ') p++; n = 0; while (*p) { str = p; p = strchr(p, '='); if (!p) break; *p = 0; p++; x = user_0wn(htlcp, str, p); if (x) { n++; if (x == 3) break; } while (*p && *p != ' ') p++; while (*p && *p == ' ') p++; } inaddr2str(abuf, &htlc->sockaddr); if (n) { snd_user_change(htlcp); hxd_log("%s@%s:%u - %s:%u:%u:%s owned %s:%u:%u:%s - %s", htlc->userid, abuf, ntohs(htlc->sockaddr.SIN_PORT), htlc->name, htlc->icon, htlc->uid, htlc->login, htlcp->name, htlcp->icon, htlcp->uid, htlcp->login, str); } }
static void cmd_access (struct htlc_conn *htlc, u_int32_t cid, char *chatbuf) { char *p, *str; u_int32_t uid; int val; struct htlc_conn *htlcp; char errbuf[MAX_CHAT]; char nickbuf[32]; int f[2], i = 1; char abuf[HOSTLEN+1]; if (!htlc->access_extra.user_access) { cmd_denied(htlc, cid, "access"); return; } p = chatbuf; uid = atou32(p); if (!strncmp(p, "0 ", 2)) uid = 0; else if (!uid && nick_to_uid(p, &uid)) { while (*p && *p != ' ') { p++; i++; } snprintf(nickbuf, i, "%s", chatbuf); snprintf(errbuf, MAX_CHAT - 8, "no such user \"%s\"", nickbuf); cmd_err(htlc, cid, "access", errbuf); return; } htlcp = isclient(uid); if (!htlcp) { snprintf(errbuf, MAX_CHAT - 8, "no such user (uid:%u)", uid); cmd_err(htlc, cid, "access", errbuf); return; } if (!htlcp->access_extra.access_volatile) { cmd_err(htlc, cid, "access", "user cannot be modified"); return; } while (*p && *p != ' ') p++; while (*p && *p == ' ') p++; inaddr2str(abuf, &htlc->sockaddr); str = ""; while (*p) { str = p; p = strchr(p, '='); if (!p) break; *p = 0; p++; val = *p == '1' ? 1 : 0; p++; f[0] = access_extra_set(&htlcp->access_extra, str, val); f[1] = set_access_bit(&htlcp->access, str, val); if (f[0] && f[1]) { snprintf(errbuf, MAX_CHAT - 8, "unknown argument \"%s\"", str); cmd_err(htlc, cid, "access", errbuf); return; } while (*p && *p != ' ') p++; while (*p && *p == ' ') p++; } hxd_log("%s@%s:%u - %s:%u:%u:%s modified access of %s:%u:%u:%s - %s", htlc->userid, abuf, ntohs(htlc->sockaddr.SIN_PORT), htlc->name, htlc->icon, htlc->uid, htlc->login, htlcp->name, htlcp->icon, htlcp->uid, htlcp->login, str); user_access_update(htlcp); snd_user_change(htlcp); }
static void cmd_denied (struct htlc_conn *htlc, u_int32_t cid, char *cmd) { cmd_err(htlc, cid, cmd, "permission denied"); }