Пример #1
0
static void shell_cmd_lock(char *args, void *data)
{
    int v;
    
    if (strlen(args) > 0) {
        v = atoi(args);
        switch (v) {
            default:
            case 0:
                home.lock = HOME_RESET;
                break;
            case 1:
                home.lock = HOME_FORCE;
                break;
            case 2:
                home.lock = HOME_WAIT;
                break;
        }
    } else {
        shell_printf("syntax: home lock <value>\n");
        shell_printf("  Valid values:\n");
        shell_printf("     0     restart home locking\n");
        shell_printf("     1     force home to current GPS data\n");
        shell_printf("     2     bypass arming\n");
    }
}
Пример #2
0
static shell_result_t shell_handler(shell_command_t* command) {
	if (command->args_count == 0) return SHELL_RESULT_FAIL;
	
	if (string_eq(command->command, "ht")) {
    if (string_eq(command->args[0], "start")) {
      start();
		} else if (string_eq(command->args[0], "stop")) {
      stop();
		} else if (string_eq(command->args[0], "sv")) {
      uint16_t bytes_written = hum_temp_save();
      shell_printf("%u ->\n", bytes_written);
		} else if (string_eq(command->args[0], "ld")) {
      uint16_t bytes_read = hum_temp_load();
      shell_printf("%u <-\n", bytes_read);
		} else if (string_eq(command->args[0], "av")) {
      hum_temp_print_stats(shell_get_stream());
		} else if (string_eq(command->args[0], "dmp")) {
      hum_temp_print_samples(shell_get_stream());
		} else if (string_eq(command->args[0], "al")) {
      ui_set_alarm_on();
		} else {
			return SHELL_RESULT_FAIL;
		}
	}
	return SHELL_RESULT_SUCCESS;
}
Пример #3
0
static void handle_failure(shell_result result, const char* command) {
	if (result == SHELL_RESULT_FAIL_MATCH) {
    PGM_STR(SHELL_UNKNOWN_COMMAND, unknown_cmd)
  	shell_printf(unknown_cmd, command);		
  } else {
    PGM_STR(SHELL_ERROR, error)
		shell_printf(error);
  }
}
Пример #4
0
static void shell_cmd_route(char *args, void *data)
{
    unsigned char i;
    
    shell_printf("\nMavlink routing table:\n");
    for(i = 0; i < total_routes; i++) {
        shell_printf(" sysid(%3u) compid(%3u) on channel(%u)\n",
                (unsigned) routes[i].sysid, 
                (unsigned) routes[i].compid,
                (unsigned) routes[i].ch);
    }
    
    shell_printf("\ntotal routes=%d max=%d\n", total_routes, MAX_MAVLINK_ROUTES);
}
Пример #5
0
 /*!
 * @brief extract from readline
 */
static int parse_line (char * line, char * argv[])
{
    uint8_t nargs = 0;
    while (nargs < SHELL_MAX_ARGS) 
    {
        /* skip any white space */
        while (isblank(*line))
        {
            ++line;
        }
        if (*line == '\0')
        {	/* end of line, no more args	*/
            argv[nargs] = NULL;
            return nargs;
        }
        argv[nargs++] = line;	/* begin of argument string	*/
        /* find end of string */
        while ((*line) && (!isblank(*line)))
        {
            ++line;
        }
        if (*line == '\0') 
        {	/* end of line, no more args	*/
            argv[nargs] = NULL;
            return nargs;
        }
        *line++ = '\0';		/* terminate current arg	 */
    }
    shell_printf ("** Too many args (max. %d) **\r\n", SHELL_MAX_ARGS);
    return (nargs);
}
Пример #6
0
/* state change of children handled here */
static void sigchld_handler(int sig)
{
	pid_t child_pid;
	jobs **job;
	int status;

	/*
	 * There can be multiple SIGCHLD at once, not necessarily they will all be handled,
	 * so we reap all the children in non-blocking mode that takes care of the pending child
	 * whose SIGCHLD is not attended
	 */

	/* SIGCHLD should be blocked in critical section of modifying joblist */
	/* thy shall NOT pass */
	while ((child_pid = waitpid(-1, &status, WNOHANG|WUNTRACED|WCONTINUED)) > 0) {
		if (WIFEXITED(status)) {
			deljob(child_pid);
		}

		else if (WIFSIGNALED(status)) {
			job = getjob(child_pid, 0);
			if (NOTNULL(job)) {
				shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
						TERMSTR_GREEN("SIGCHLD: ")"[%d] (%d) killed by signal %d\n",
						(*job)->jid, (*job)->pid[0], WTERMSIG(status));
				deljob(child_pid);
			}
		}

		else if (WIFSTOPPED(status)) {
			job = getjob(child_pid, 0);
			if (NOTNULL(job)) {
				(*job)->state = ST;
				shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
						TERMSTR_GREEN("SIGCHLD : ")"[%d] (%d) stopped by signal %d\n",
						(*job)->jid, (*job)->pid[0], WSTOPSIG(status));
			}
		}

		else if (WIFCONTINUED(status)) {
			job = getjob(child_pid, 0);
			if (NOTNULL(job))
				(*job)->state = BG;
		}
	}
	/* thy shall pass */
}
Пример #7
0
static shell_result adc_shell_handler(shell_command* command) {
	if (!string_eq(command->command, "adc")) return SHELL_RESULT_FAIL;
	if (command->args_count == 0) return SHELL_RESULT_FAIL;
	
  if (string_eq(command->args[0], "read")) {
    shell_printf("Channel\tReading\r\n");
  	if (command->args_count == 2) {
  		uint8_t channel = atoi(command->args[1]);
    	shell_printf("%u\t%u\r\n", channel, adc_read(channel));
  	} else {
      for (int i = 0; i < 6; i++) {
      	shell_printf("%u\t%u\r\n", i, adc_read(i));
      }
  	}
  	return SHELL_RESULT_SUCCESS;
	}
	return SHELL_RESULT_FAIL;
}
Пример #8
0
/*
 * the basic wait for foreground used by fg cmd and basic
 * non bg cmd in the shell. Make sure SIGCHLD is blocked
 * to avoid race conditions that make the joblist unreliable.
 * No terminal control or printing if subshell
 * */
void wait_fg(jobs **job)
{
	int status, i;

	/* thy shall NOT pass */

	for (i=0; NOTNULL(job); i++) {
		if (!subshell_flag && tcsetpgrp(TERMFD, (*job)->pid[0]) < 0)
			perror("tcsetpgrp");
		while (waitpid((*job)->pid[i], &status, WUNTRACED) == 0)
			;

		if (WIFEXITED(status)) {
			if (!subshell_flag && tcsetpgrp(TERMFD, getpid()) < 0)
				perror("tcsetpgrp");
			if ((*job)->pid[i+1] == 0) {
				deljob((*job)->pid[0]);
				break;
			}
		}

		else if (WIFSIGNALED(status)) {
			if (!subshell_flag && tcsetpgrp(TERMFD, getpid()) < 0)
				perror("tcsetpgrp");
			shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
					"[%d] (%d) killed by signal %d\n", (*job)->jid, (*job)->pid[0],
					WTERMSIG(status));
			deljob((*job)->pid[0]);
			break;
		}

		else if (WIFSTOPPED(status)) {
			if (!subshell_flag && tcsetpgrp(TERMFD, getpid()) < 0)
				perror("tcsetpgrp");
			shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
					"[%d] (%d) stopped by signal %d\n", (*job)->jid,
					(*job)->pid[0], WSTOPSIG(status));
			(*job)->state = ST;
			break;
		}
	}
	/* thy shall pass */
}
Пример #9
0
/* what >bg and >fg run */
void do_bgfg(char **cmd, int state)
{
	jobs **job;
	sigset_t msk;

	MASK_SIG(SIG_BLOCK, SIGCHLD, msk);

	if (!cmd[1]) {
		job = get_lastjob();
	}
	else if (*cmd[1]=='%' && atoi(cmd[1]+1)) {
		job = getjob(0, atoi(cmd[1]+1));
	}
	else {
		ERRMSG("Invalid argument\n");
		return;
	}

	/* thy shall NOT pass */

	if (NOTNULL(job)) {
		(*job)->state = state;

		if (kill(-(*job)->pid[0], SIGCONT) < 0)
			ERR_EXIT("kill");

		if (state == BG) {
			shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
					"[%d] (%d) %s\n", (*job)->jid, (*job)->pid[0], (*job)->cmdline);
		}
		else {
			shell_printf(SHELLPRINT_CHKSS | SHELLPRINT_CHKTERM,
					"%s\n", (*job)->cmdline);
			wait_fg(job);
		}
	}
	else {
		ERRMSG("Invalid job\n");
	}

	/* thy shall pass */
	MASK_SIG(SIG_UNBLOCK, SIGCHLD, msk);
}
Пример #10
0
static void shell_cmd_load(char *args, void *data)
{
    struct shell_argval argval[SHELL_CMD_LOAD_ARGS+1], *idx, *tab;
    unsigned char t, j;
    
    t = shell_arg_parser(args, argval, SHELL_CMD_LOAD_ARGS);
    
    idx = shell_get_argval(argval, 'i');
    tab = shell_get_argval(argval, 't');
    if ((t != 1) && ((idx == NULL) && (tab == NULL))) {
        shell_printf("load tab: [-i <tab index> | -t <tab number>]\n");
        shell_printf(" -i <tab index>   tab index (0 to %d)\n", tab_list[0]-1);
        shell_printf(" -t <tab id>      tab id\n");
    } else {
        if (idx != NULL) {
            j = atoi(idx->val);
            if (j < tab_list[0]) {
                shell_printf("Loading tab index %d of %d\n", j, tab_list[0]-1);
                load_tab(tab_list[j+1]);
            } else {
                shell_printf("Out of range [0 ... %d]\n", tab_list[0]-1);
            }
        } else {
            j = atoi(tab->val);
            shell_printf("Loading tab id %d\n", j);
            load_tab(j);
        }
    }
}
Пример #11
0
static void on_char_return() {
	fputc('\r', output_stream);
	fputc('\n', output_stream);
	if (curr_index < SHELL_CMD_MAX_LENGTH - 1) {
		shell_invoke(command_buffer);        
  } else {
    PGM_STR(SHELL_CMD_TOO_LONG, failed_msg)
    shell_printf(failed_msg, SHELL_CMD_MAX_LENGTH);
  }

  print_prompt();
	memset(command_buffer, '\0', SHELL_CMD_MAX_LENGTH);
	curr_index = 0;  
}
Пример #12
0
void shell_main_loop(char * prompt)
{
    int8_t len;
    uint8_t argc;
    int8_t result;
    const cmd_tbl_t * cmdtp;
    char * argv[SHELL_MAX_ARGS];	/* NULL terminated	*/
    
    for (;;)
    {
        len = readline(prompt);
        if (len > 0)
        {
            if ((argc = parse_line (console_buffer, argv)) == 0) 
            {
                continue;
            }
            cmdtp = shell_find_command(argv[0]);
            if ((cmdtp != NULL) && (cmdtp->cmd != NULL))
            {
                if (argc > cmdtp->maxargs)
                {
                    result = CMD_RET_USAGE;
                }
                else
                {
                    result = (cmdtp->cmd)(argc, argv);
                }
            }
            else
            {
                shell_printf("Unknown command '%s' - try 'help'\r\n", argv[0]);	
            }
            if (result == CMD_RET_USAGE)
            {
                if (cmdtp->usage != NULL)
                {
                    shell_printf("%s - %s\r\n", cmdtp->name, cmdtp->usage);
                }
                if (cmdtp->help != NULL)
                {
                    shell_printf("Usage:\r\n%s ", cmdtp->name);
                    shell_printf("%s\r\n", cmdtp->help);
                }
                else
                {
                    shell_printf ("- No additional help available.\r\n");
                }
            }
        }
        else if (len == -1)
        {
            shell_printf("<INTERRUPT>\r\n");
        }
    }
}
Пример #13
0
static void shell_cmd_callbacks(char *args, void *data)
{
    unsigned char i, t = 0;
    struct mavlink_callback *c = callbacks;

    shell_printf("\n\nWidget callbacks:\n");
    for (i = 0; i < nr_callbacks; i++) {
        if ((c->cbk != NULL) && (c->type == CALLBACK_WIDGET)) {
            printf(" sysid=%3d msgid=%3d cbk=%p data=%p\n", c->sysid, c->msgid, c->cbk, c->data);
            t++;
        }
        c++;
    }
    shell_printf("\n\nPersistent callbacks:\n");
    c = callbacks;
    for (i = 0; i < nr_callbacks; i++) {
        if ((c->cbk != NULL) && (c->type == CALLBACK_PERSISTENT)) {
            printf(" sysid=%3d msgid=%3d cbk=%p data=%p\n", c->sysid, c->msgid, c->cbk, c->data);
            t++;
        }
        c++;
    }
    shell_printf("\n\ntotal=%d peak=%d max=%d\n", t, nr_callbacks, MAX_MAVLINK_CALLBACKS);
}
Пример #14
0
static void shell_cmd_config(char *args, void *data)
{
    struct ch_switch *cfg = &config.tab_sw;
    struct shell_argval argval[SHELL_CMD_CONFIG_ARGS+1], *p;
    unsigned char t, i;
    unsigned int w;

    t = shell_arg_parser(args, argval, SHELL_CMD_CONFIG_ARGS);
    if (t < 1) {
        shell_printf("Tab switch config:\n");
        shell_printf(" Mode: %d (0:ch percent; 1:flight mode; 2:ch toggle)\n", cfg->mode);
        shell_printf(" Ch:   CH%d\n", cfg->ch + 1);
        shell_printf(" Min:  %d\n", cfg->ch_min);
        shell_printf(" Max:  %d\n", cfg->ch_max);
        shell_printf(" Time: %d00ms\n", cfg->time);
        shell_printf("\noptions: -m <mode> -c <ch> -l <min> -h <max> -t <time>\n");
    } else {
        p = shell_get_argval(argval, 'm');
        if (p != NULL) {
            i = atoi(p->val);
            if (i < SW_MODE_END)
                cfg->mode = i;
        }
        p = shell_get_argval(argval, 'c');
        if (p != NULL) {
            i = atoi(p->val);
            i = TRIM(i, 0, 17);
            cfg->ch = i;
        }
        p = shell_get_argval(argval, 'l');
        if (p != NULL) {
            w = atoi(p->val);
            w = TRIM(w, 900, 2100);
            cfg->ch_min = w;
        }
        p = shell_get_argval(argval, 'h');
        if (p != NULL) {
            w = atoi(p->val);
            w = TRIM(w, 900, 2100);
            cfg->ch_max = w;
        }
        p = shell_get_argval(argval, 't');
        if (p != NULL) {
            w = atoi(p->val);
            w = w / 100;
            cfg->time = w;
        }
    }
}
Пример #15
0
void SPI_ISR(void)
{
    static uint8_t i = 1;
    static uint16_t temp = 0;
    if(i == 7)
    {
        SPI_ITDMAConfig(BOARD_SPI_INSTANCE, kSPI_IT_TCF, false);
        shell_printf("ID:0x%X\r\n", temp);
        return ;
    }
    if(i == 6)
    {
        temp <<= 8;
    }
    temp |= SPI_ReadWriteByte(BOARD_SPI_INSTANCE,HW_CTAR0, W25QXX_READ_ID_TABLE[i], 1, kSPI_PCS_KeepAsserted);
    i++;
}
Пример #16
0
void settings_shell_display()
{
    int ii;
    for (ii = 0;
	 settings_display_list[ii].fmt != NULL;
	 ii++)
    {
	struct settings_display *disp = &settings_display_list[ii];
	if (disp->type == FLOAT)
	{
	    sprintf(update_message, disp->fmt, *((float *)disp->value));
	}
	else if (disp->type == UINT8)
	{
	    sprintf(update_message, disp->fmt, *((uint8_t *)disp->value));
	}
	shell_printf("%s\t%s", disp->name, update_message);
    }
}
Пример #17
0
static void shell_cmd_stats(char *args, void *data)
{
    mavlink_status_t *status;
    unsigned char i;

    for (i = 0; i < MAVLINK_COMM_NUM_BUFFERS; i++) {
        status = mavlink_get_channel_status(i);
        shell_printf("\nMavlink channel %d\n", i);
        shell_printf(" msg_received=%d\n", status->msg_received);
        shell_printf(" packet_rx_drop_count=%d\n", status->packet_rx_drop_count);
        shell_printf(" packet_rx_success_count=%d\n", status->packet_rx_success_count);
    }
    shell_printf("\nActive channel mask=%x\n", active_channel_mask);
    shell_printf("\nUAV last seen %lums ago\n", get_millis() - uav_last_seen);
}
Пример #18
0
static void shell_cmd_stats(char *args, void *data)
{
    switch (home.lock) {
        default:
        case HOME_NONE:
            shell_printf("No home; UAV not armed\n");
            break;
        case HOME_WAIT:
            shell_printf("Requesting WP0 (home)\n");
            break;
        case HOME_LOCKED:
            shell_printf("Home GPS coords: lat=%.6f lon=%.6f\n", priv.home_coord.lat, priv.home_coord.lon);
            shell_printf("Home M.S.L. altitude: %um\n\n", priv.home_altitude);
            shell_printf("Relative altitude to home: %um\n", home.altitude);
            shell_printf("Home direction: %d\n", home.direction);
            shell_printf("Home distance: %.2fm\n", home.distance);
            break;
    }
}
Пример #19
0
void shell_cmd_rates(char *args, void *data)
{
    struct shell_argval argval[SHELL_CMD_MAVRATE_ARGS+1], *p;
    unsigned char t, i, val;
    unsigned char *v;
    
    t = shell_arg_parser(args, argval, SHELL_CMD_MAVRATE_ARGS);
    p = shell_get_argval(argval, 's');

    if ((t < 2) || (p == NULL)) {
        shell_printf("\nMavlink stream rates:\n");
        shell_printf("id - rate stream\n");
        for (i = 0; i < sizeof(mavlink_stream_map)-1; i++) {
            v = (unsigned char*) params_mavlink_rates[i].value;
            shell_printf(" %u - [%2u] %s\n", i+1, *v,
                        params_mavlink_rates[i].name);
        };
        
        shell_printf("\nset rate: [-s <stream_id> -r <rate>]\n");
        shell_printf(" -s <stream_id>  mavlink stream id (0=ALL)\n");
        shell_printf(" -r <rate>       stream rate: 0-10\n");
    } else {
        if (p != NULL) {
            i = atoi(p->val);
            if (i > sizeof(mavlink_stream_map)) {
                shell_printf("\nInvalid stream id\n");
            } else {
                p = shell_get_argval(argval, 'r');
                val = atoi(p->val);
                if (val > 10)
                    val = 0;
                shell_printf("\nSetting stream id %u to %uHz\n", i, val);
                mavlink_request_data_stream(i, val);
            }
        }
    }
}
Пример #20
0
void ICACHE_FLASH_ATTR shell_process_char(char ch)
{
    int8_t i, repeat;

    // handle VT100 escape sequences
    if (!_translate_escape_sequence(&ch))
        return;

    // basic command line editing
    switch (ch)
    {
    case 0x03: // Ctrl-C
        _reset_rx_buffer();
        shell_puts("^C\r\n");
        shell_show_prompt();
        break;
    case 0x08: // backspace ^H
        if (ctx.rx_cursor_pos != 0)  // not at the beginning?
        {
            if (ctx.rx_cursor_pos == ctx.rx_buffer_pos) // Cursor at the end?
            {
                --ctx.rx_buffer_pos;
                --ctx.rx_cursor_pos;
                ctx.rx_buffer[ctx.rx_buffer_pos] = '\0';
                shell_puts("\x08 \x08"); // very tricky way of deleting last character from terminal
            }
            else // Cursor in the middle
            {
                repeat = 0;
                --ctx.rx_cursor_pos;
                shell_puts("\x1B[D"); // move left
                for (i = ctx.rx_cursor_pos; i < ctx.rx_buffer_pos; ++i)
                {
                    ctx.rx_buffer[i] = ctx.rx_buffer[i + 1];
                    if (ctx.rx_buffer[i]) // not NULL
                        shell_putc(ctx.rx_buffer[i]);
                    else
                        shell_putc(' ');
                    ++repeat;
                }
                --ctx.rx_buffer_pos;
                shell_printf("\x1B[%dD", repeat); // move cursor back to original cursor position
            }
        }
        break;
    case 0x04: // ^D
    case 0x7F: // delete ^?
        if (ctx.rx_cursor_pos < ctx.rx_buffer_pos)  // delete does not happen when cursor is at the end
        {
            repeat = 0;
            for (i = ctx.rx_cursor_pos; i < ctx.rx_buffer_pos; ++i)
            {
                ctx.rx_buffer[i] = ctx.rx_buffer[i + 1];
                if (ctx.rx_buffer[i]) // not NULL
                    shell_putc(ctx.rx_buffer[i]);
                else
                    shell_putc(' ');
                ++repeat;
            }
            --ctx.rx_buffer_pos;
            shell_printf("\x1B[%dD", repeat); // move cursor back to original cursor position
        }
        break;
    case 0x02: // left arrow ^B
        if (ctx.rx_cursor_pos != 0) // Not at the beginning
        {
            --ctx.rx_cursor_pos;
            shell_puts("\x1B[D"); // move left
        }
        break;
    case 0x06:  // right arrow ^F
        if (ctx.rx_cursor_pos < ctx.rx_buffer_pos)
        {
            ++ctx.rx_cursor_pos;
            shell_puts("\x1B[C");    // move right
        }
        break;
    case 0x01:  // home ^A
        if (ctx.rx_cursor_pos != 0)
        {
            shell_printf("\x1B[%dD", ctx.rx_cursor_pos); // move left
            ctx.rx_cursor_pos = 0;
        }
        break;
    case 0x05:  // end ^E
        if (ctx.rx_cursor_pos != ctx.rx_buffer_pos)
        {
            shell_printf("\x1B[%dC", ctx.rx_buffer_pos - ctx.rx_cursor_pos); // move right;
            ctx.rx_cursor_pos = ctx.rx_buffer_pos;
        }
        break;
    case '\n':  // LF
    case '\r':  // CR
        // If terminal sends CRLF, we have processed command during CR, LF can be ignored
        if ((ctx.rx_buffer_pos == 0) && (ch == '\n'))
            break;
        shell_puts("\r\n"); // CRLF ending
        if (ctx.rx_buffer_pos == 0) // if empty command
        {
            _reset_rx_buffer();
            shell_show_prompt();
            break;
        }
        if (ctx.busy)
        {
            // A previous command is being processed
            // TODO: Reset if requested
            // ignore other commands
            _reset_rx_buffer();
        }
        else // not busy
        {
            memcpy(ctx.command_line, ctx.rx_buffer, ctx.rx_buffer_pos);
            ctx.command_line[ctx.rx_buffer_pos] = '\0';
            _reset_rx_buffer();
            _execute_command();
        }
        break;
    default:
        if (ctx.rx_buffer_pos == SHELL_RX_BUFFER_SIZE) // overflow
        {
            shell_putc('\x07'); // BELL
            return;
        }
        if ((ch >= 0x20) && (ch < 0x7F)) // visible char
        {
            if (ctx.rx_cursor_pos == ctx.rx_buffer_pos) // append at end
            {
                shell_putc(ch);
                ctx.rx_buffer[ctx.rx_buffer_pos] = ch;
                ++ctx.rx_buffer_pos;
                ++ctx.rx_cursor_pos;
                ctx.rx_buffer[ctx.rx_buffer_pos] = '\0'; // safer?
            }
            else    // insert in the middle
            {
                repeat = ctx.rx_buffer_pos - ctx.rx_cursor_pos;
                shell_printf("\x1B[%dC", repeat);  // move right to end
                i = ctx.rx_buffer_pos;
                while (i != ctx.rx_cursor_pos - 1)
                {
                    ctx.rx_buffer[i + 1] = ctx.rx_buffer[i];
                    if (ctx.rx_buffer[i])
                    {
                        shell_putc(ctx.rx_buffer[i]);
                        shell_puts("\x1B[2D"); // move left twice
                    }
                    --i;
                }
                shell_putc(ch);
                ctx.rx_buffer[ctx.rx_cursor_pos] = ch;
                ++ctx.rx_buffer_pos;
                ++ctx.rx_cursor_pos;
                ctx.rx_buffer[ctx.rx_buffer_pos] = '\0'; // safer?
            }
        }
        else    // unknown/unhandled character
        {
            shell_putc('\x07'); // BELL
        }
    }
}
Пример #21
0
static void KeyTest(void* pdat)
{
	INT32U key = 0;
	
	while (1)
	{
		switch (key = key_msg_get ())
		{
		 	case KEY_1_UP:
				shell_printf ("KEY_1_UP\r\n");
				break;
			case KEY_1_DOWN:
				shell_printf ("KEY_1_DOWN\r\n");
				break;
			case KEY_1_PUSH:
				shell_printf ("KEY_1_PUSH\r\n");
				break;
			case KEY_1_DOUBLE:
				shell_printf ("KEY_1_DOUBLE\r\n");
				break;

		 	case KEY_2_UP:
				shell_printf ("KEY_2_UP\r\n");
				break;
			case KEY_2_DOWN:
				shell_printf ("KEY_2_DOWN\r\n");
				break;
			case KEY_2_PUSH:
				shell_printf ("KEY_2_PUSH\r\n");
				break;
			case KEY_2_DOUBLE:
				shell_printf ("KEY_2_DOUBLE\r\n");
				break;

		 	case KEY_3_UP:
				shell_printf ("KEY_3_UP\r\n");
				break;
			case KEY_3_DOWN:
				shell_printf ("KEY_3_DOWN\r\n");
				break;
			case KEY_3_PUSH:
				shell_printf ("KEY_3_PUSH\r\n");
				break;
			case KEY_3_DOUBLE:
				shell_printf ("KEY_3_DOUBLE\r\n");
				break;

		 	case KEY_4_UP:
				shell_printf ("KEY_4_UP\r\n");
				break;
			case KEY_4_DOWN:
				shell_printf ("KEY_4_DOWN\r\n");
				break;
			case KEY_4_PUSH:
				shell_printf ("KEY_4_PUSH\r\n");
				break;
			case KEY_4_DOUBLE:
				shell_printf ("KEY_4_DOUBLE\r\n");
				break;

		 	case KEY_5_UP:
				shell_printf ("KEY_5_UP\r\n");
				break;
			case KEY_5_DOWN:
				shell_printf ("KEY_5_DOWN\r\n");
				break;
			case KEY_5_PUSH:
				shell_printf ("KEY_5_PUSH\r\n");
				break;
			case KEY_5_DOUBLE:
				shell_printf ("KEY_5_DOUBLE\r\n");
				break;

		 	case KEY_6_UP:
				shell_printf ("KEY_6_UP\r\n");
				break;
			case KEY_6_DOWN:
				shell_printf ("KEY_6_DOWN\r\n");
				break;
			case KEY_6_PUSH:
				shell_printf ("KEY_6_PUSH\r\n");
				break;
			case KEY_6_DOUBLE:
				shell_printf ("KEY_6_DOUBLE\r\n");
				break;

		 	case KEY_7_UP:
				shell_printf ("KEY_7_UP\r\n");
				break;
			case KEY_7_DOWN:
				shell_printf ("KEY_7_DOWN\r\n");
				break;
			case KEY_7_PUSH:
				shell_printf ("KEY_7_PUSH\r\n");
				break;
			case KEY_7_DOUBLE:
				shell_printf ("KEY_7_DOUBLE\r\n");
				break;

		 	case KEY_8_UP:
				shell_printf ("KEY_8_UP\r\n");
				break;
			case KEY_8_DOWN:
				shell_printf ("KEY_8_DOWN\r\n");
				break;
			case KEY_8_PUSH:
				shell_printf ("KEY_8_PUSH\r\n");
				break;
			case KEY_8_DOUBLE:
				shell_printf ("KEY_8_DOUBLE\r\n");
				break;

		 	case KEY_9_UP:
				shell_printf ("KEY_9_UP\r\n");
				break;
			case KEY_9_DOWN:
				shell_printf ("KEY_9_DOWN\r\n");
				break;
			case KEY_9_PUSH:
				shell_printf ("KEY_9_PUSH\r\n");
				break;
			case KEY_9_DOUBLE:
				shell_printf ("KEY_9_DOUBLE\r\n");
				break;

		 	case KEY_10_UP:
				shell_printf ("KEY_10_UP\r\n");
				break;
			case KEY_10_DOWN:
				shell_printf ("KEY_10_DOWN\r\n");
				break;
			case KEY_10_PUSH:
				shell_printf ("KEY_10_PUSH\r\n");
				break;
			case KEY_10_DOUBLE:
				shell_printf ("KEY_10_DOUBLE\r\n");
				break;

		 	case KEY_11_UP:
				shell_printf ("KEY_11_UP\r\n");
				break;
			case KEY_11_DOWN:
				shell_printf ("KEY_11_DOWN\r\n");
				break;
			case KEY_11_PUSH:
				shell_printf ("KEY_11_PUSH\r\n");
				break;
			case KEY_11_DOUBLE:
				shell_printf ("KEY_11_DOUBLE\r\n");
				break;

		 	case KEY_12_UP:
				shell_printf ("KEY_12_UP\r\n");
				break;
			case KEY_12_DOWN:
				shell_printf ("KEY_12_DOWN\r\n");
				break;
			case KEY_12_PUSH:
				shell_printf ("KEY_12_PUSH\r\n");
				break;
			case KEY_12_DOUBLE:
				shell_printf ("KEY_12_DOUBLE\r\n");
				break;

		 	case KEY_13_UP:
				shell_printf ("KEY_13_UP\r\n");
				break;
			case KEY_13_DOWN:
				shell_printf ("KEY_13_DOWN\r\n");
				break;
			case KEY_13_PUSH:
				shell_printf ("KEY_13_PUSH\r\n");
				break;
			case KEY_13_DOUBLE:
				shell_printf ("KEY_13_DOUBLE\r\n");
				break;

		 	case KEY_14_UP:
				shell_printf ("KEY_14_UP\r\n");
				break;
			case KEY_14_DOWN:
				shell_printf ("KEY_14_DOWN\r\n");
				break;
			case KEY_14_PUSH:
				shell_printf ("KEY_14_PUSH\r\n");
				break;
			case KEY_14_DOUBLE:
				shell_printf ("KEY_14_DOUBLE\r\n");
				break;

		 	case KEY_15_UP:
				shell_printf ("KEY_15_UP\r\n");
				break;
			case KEY_15_DOWN:
				shell_printf ("KEY_15_DOWN\r\n");
				break;
			case KEY_15_PUSH:
				shell_printf ("KEY_15_PUSH\r\n");
				break;
			case KEY_15_DOUBLE:
				shell_printf ("KEY_15_DOUBLE\r\n");
				break;

		 	case KEY_16_UP:
				shell_printf ("KEY_16_UP\r\n");
				break;
			case KEY_16_DOWN:
				shell_printf ("KEY_16_DOWN\r\n");
				break;
			case KEY_16_PUSH:
				shell_printf ("KEY_16_PUSH\r\n");
				break;
			case KEY_16_DOUBLE:
				shell_printf ("KEY_16_DOUBLE\r\n");
				break;

		 	case KEY_17_UP:
				shell_printf ("KEY_17_UP\r\n");
				break;
			case KEY_17_DOWN:
				shell_printf ("KEY_17_DOWN\r\n");
				break;
			case KEY_17_PUSH:
				shell_printf ("KEY_17_PUSH\r\n");
				break;
			case KEY_17_DOUBLE:
				shell_printf ("KEY_17_DOUBLE\r\n");
				break;

		 	case KEY_18_UP:
				shell_printf ("KEY_18_UP\r\n");
				break;
			case KEY_18_DOWN:
				shell_printf ("KEY_18_DOWN\r\n");
				break;
			case KEY_18_PUSH:
				shell_printf ("KEY_18_PUSH\r\n");
				break;
			case KEY_18_DOUBLE:
				shell_printf ("KEY_18_DOUBLE\r\n");
				break;

		 	case KEY_19_UP:
				shell_printf ("KEY_19_UP\r\n");
				break;
			case KEY_19_DOWN:
				shell_printf ("KEY_19_DOWN\r\n");
				break;
			case KEY_19_PUSH:
				shell_printf ("KEY_19_PUSH\r\n");
				break;
			case KEY_19_DOUBLE:
				shell_printf ("KEY_19_DOUBLE\r\n");
				break;

		 	case KEY_20_UP:
				shell_printf ("KEY_20_UP\r\n");
				break;
			case KEY_20_DOWN:
				shell_printf ("KEY_20_DOWN\r\n");
				break;
			case KEY_20_PUSH:
				shell_printf ("KEY_20_PUSH\r\n");
				break;
			case KEY_20_DOUBLE:
				shell_printf ("KEY_20_DOUBLE\r\n");
				break;

		 	case KEY_21_UP:
				shell_printf ("KEY_21_UP\r\n");
				break;
			case KEY_21_DOWN:
				shell_printf ("KEY_21_DOWN\r\n");
				break;
			case KEY_21_PUSH:
				shell_printf ("KEY_21_PUSH\r\n");
				break;
			case KEY_21_DOUBLE:
				shell_printf ("KEY_21_DOUBLE\r\n");
				break;

		 	case KEY_22_UP:
				shell_printf ("KEY_22_UP\r\n");
				break;
			case KEY_22_DOWN:
				shell_printf ("KEY_22_DOWN\r\n");
				break;
			case KEY_22_PUSH:
				shell_printf ("KEY_22_PUSH\r\n");
				break;
			case KEY_22_DOUBLE:
				shell_printf ("KEY_22_DOUBLE\r\n");
				break;

		 	case KEY_23_UP:
				shell_printf ("KEY_23_UP\r\n");
				break;
			case KEY_23_DOWN:
				shell_printf ("KEY_23_DOWN\r\n");
				break;
			case KEY_23_PUSH:
				shell_printf ("KEY_23_PUSH\r\n");
				break;
			case KEY_23_DOUBLE:
				shell_printf ("KEY_23_DOUBLE\r\n");
				break;

		 	case KEY_24_UP:
				shell_printf ("KEY_24_UP\r\n");
				break;
			case KEY_24_DOWN:
				shell_printf ("KEY_24_DOWN\r\n");
				break;
			case KEY_24_PUSH:
				shell_printf ("KEY_24_PUSH\r\n");
				break;
			case KEY_24_DOUBLE:
				shell_printf ("KEY_24_DOUBLE\r\n");
				break;

			case 0:
				break;

			default:
				shell_printf ("Undefined key msg %X!\r\n", key);
				break;
		}
	}
}	
Пример #22
0
static void print_prompt() {
  shell_printf(current_shell_state.active_handler->command);    
  shell_printf(">");    
}
Пример #23
0
 /*!
 * @brief read line into buffer
 */
static int cread_line(const char * const prompt, char * buf, uint8_t * len)
{
    uint8_t num = 0;
    uint8_t eol_num = 0;
    uint8_t wlen;
    char ichar = 0;
    uint8_t insert = 1;
    uint8_t esc_len = 0;
    char esc_save[8];
    uint8_t init_len = strlen(buf);
    if (init_len)
    {
        cread_add_str(buf, init_len, 1, &num, &eol_num, buf, *len);
    }
    while (1) 
    {
        do
        {
            ichar = sgetc();
        }while(!ichar);
        if ((ichar == '\n') || (ichar == '\r')) 
        {
            sputc('\r');sputc('\n');
            break;
        }
        /* handle standard linux xterm esc sequences for arrow key, etc.*/
        if (esc_len != 0)
        {
            if (esc_len == 1) 
            {
                if (ichar == '[')
                {
                    esc_save[esc_len] = ichar;
                    esc_len = 2;
                } 
                else
                {
                    cread_add_str(esc_save, esc_len, insert, &num, &eol_num, buf, *len);
                    esc_len = 0;
                }
                continue;
            } 
        switch (ichar) 
        {
            case 'D':	/* <- key */
                ichar = CTL_CH('b');
                esc_len = 0;
                break;
            case 'C':	/* -> key */
                ichar = CTL_CH('f');
                esc_len = 0;
                break;	/* pass off to ^F handler */
            case 'H':	/* Home key */
                ichar = CTL_CH('a');
                esc_len = 0;
                break;	/* pass off to ^A handler */
            case 'A':	/* up arrow */
                ichar = CTL_CH('p');
                esc_len = 0;
                break;	/* pass off to ^P handler */
            case 'B':	/* down arrow */
                ichar = CTL_CH('n');
                esc_len = 0;
                break;	/* pass off to ^N handler */
            default:
                esc_save[esc_len++] = ichar;
                cread_add_str(esc_save, esc_len, insert,
					      &num, &eol_num, buf, *len);
                esc_len = 0;
				continue;
        }
    }
    switch (ichar)
    {
        case 0x1b:
            if (esc_len == 0) 
            {
                esc_save[esc_len] = ichar;
                esc_len = 1;
            }
        else 
            {
                shell_printf("impossible condition #876\n");
                esc_len = 0;
            }
            break;
        case CTL_CH('a'):
            BEGINNING_OF_LINE()
            break;
        case CTL_CH('c'):	/* ^C - break */
            *buf = '\0';	/* discard input */
            return (-1);
            //break; /* have to follow MISRA */
        case CTL_CH('f'):
            if (num < eol_num)
            {
                sputc(buf[num]);
                num++;
            }
            break;
        case CTL_CH('b'):
            if (num)
            {
                sputc(CTL_BACKSPACE);
                num--;
            }
            break;
        case CTL_CH('d'):
            if (num < eol_num)
            {
                wlen = eol_num - num - 1;
                if (wlen)
                {
                    memmove(&buf[num], &buf[num+1], wlen);
                    putnstr(buf + num, wlen);
                }
                sputc(' ');
                do 
                {
                    sputc(CTL_BACKSPACE);
                } while (wlen--);
                eol_num--;
            }
            break;
        case CTL_CH('k'):
            ERASE_TO_EOL()
            break;
        case CTL_CH('e'):
            REFRESH_TO_EOL()
            break;
        case CTL_CH('o'):
            insert = !insert;
            break;
        case CTL_CH('x'):
        case CTL_CH('u'):
            BEGINNING_OF_LINE()
            ERASE_TO_EOL()
            break;
        case DEL:
        case DEL7:
        case 8:
            if (num)
            {
                wlen = eol_num - num;
                num--;
                memmove(&buf[num], &buf[num+1], wlen);
                sputc(CTL_BACKSPACE);
                putnstr(buf + num, wlen);
                sputc(' ');
                do
                {
                    sputc(CTL_BACKSPACE);
                } while (wlen--);
                eol_num--;
            }
            break;

        case CTL_CH('p'):
        case CTL_CH('n'):
#ifdef SHELL_CONFIG_USE_HIST
        {
            char * hline;
            esc_len = 0;
            if (ichar == CTL_CH('p'))
            {
                hline = hist_prev();
            }
            else
            {
                hline = hist_next();
            }
            if (!hline)
            {
                shell_beep();
                continue;
            }
            /* nuke the current line */
            /* first, go home */
            BEGINNING_OF_LINE()
            ERASE_TO_EOL()
            /* copy new line into place and display */
            strcpy(buf, hline);
            eol_num = strlen(buf);
            REFRESH_TO_EOL()
            continue;
            //break; /* have to follow MISRA */
        }
#else
        {
            continue;
        }
        
#endif /* SHELL_CONFIG_USE_HIST */
        case '\t': 
#ifdef SHELL_CONFIG_AUTO_COMPLETE
        {
            uint8_t num2, col;
            /* do not autocomplete when in the middle */
            if (num < eol_num)
            {
                shell_beep();
                break;
            }
            buf[num] = '\0';
            col = strlen(prompt) + eol_num;
            num2 = num;
            if (cmd_auto_complete(prompt, buf, &num2, &col))
            {
                col = num2 - num;
                num += col;
                eol_num += col;
            }
            break;
        }
#else
        {
            continue;
        }
#endif /* SHELL_CONFIG_AUTO_COMPLETE */
        default:
            cread_add_char(ichar, insert, &num, &eol_num, buf, *len);
            break;
        }
    }
    *len = eol_num;
    buf[eol_num] = '\0';	/* lose the newline */
#ifdef SHELL_CONFIG_USE_HIST
    if ((buf[0]) && (buf[0] != CREAD_HIST_CHAR))
    {
        cread_add_to_hist(buf);
    }
    hist_cur = hist_add_idx;
#endif
    return 0;
}