kosmos/source/firmware/kernel/shell_commands.c
2016-08-11 12:09:55 +02:00

94 lines
2.5 KiB
C

/*
* shell_commands.c
*
* Created on: Aug 11, 2016
* Author: tkl
*/
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include "list.h"
#include "driver.h"
#include "shell_data.h"
#include "shell.h"
#include "version.h"
#include "shell_commands.h"
static void *cmd_kosmos_version_cb(const char *cmd);
static void *cmd_list_all_commands_cb(const char *cmd);
static void *cmd_echo_on_cb(const char *cmd);
static void *cmd_echo_off_cb(const char *cmd);
struct command cmd_kosmos_version = {
.command = "kname",
.description = "Print current kosmos version.",
.command_callback = cmd_kosmos_version_cb
};
struct command cmd_list_all_commands = {
.command = "ls",
.description = "List all installed commands.",
.command_callback = cmd_list_all_commands_cb
};
struct command cmd_echo_on = {
.command = "echo on",
.description = "Switch echo on.",
.command_callback = cmd_echo_on_cb
};
struct command cmd_echo_off = {
.command = "echo off",
.description = "Switch echo off.",
.command_callback = cmd_echo_off_cb
};
static void *cmd_kosmos_version_cb(const char *cmd)
{
char *greeter = "Kosmos Version: ";
write(shell_object.shell_device, greeter, strlen(greeter));
write(shell_object.shell_device, KERNEL_VERSION, strlen(KERNEL_VERSION));
write(shell_object.shell_device, ".", 1);
write(shell_object.shell_device, MAJOR_VERSION, strlen(MAJOR_VERSION));
write(shell_object.shell_device, ".", 1);
write(shell_object.shell_device, MINOR_VERSION, strlen(MINOR_VERSION));
write(shell_object.shell_device, ".", 1);
write(shell_object.shell_device, BUILD_NUMBER, strlen(BUILD_NUMBER));
return NULL;
}
static void *cmd_list_all_commands_cb(const char *cmd)
{
char *greeter = "Command list: \r\n";
struct list_node *it = shell_object.command_list.front;
int i, len = list_get_len(&shell_object.command_list);
write(shell_object.shell_device, greeter, strlen(greeter));
for(i = 0; i < (len - 1); i++) {
if(NULL != it) {
struct command *cmd = (struct command *)it->data;
write(shell_object.shell_device, cmd->command, strlen(cmd->command));
write(shell_object.shell_device, " - ", 3);
write(shell_object.shell_device, cmd->description, strlen(cmd->description));
write(shell_object.shell_device, "\r\n", 2);
it = it->next;
}
}
return NULL;
}
static void *cmd_echo_on_cb(const char *cmd)
{
shell_object.echo_on = true;
return NULL;
}
static void *cmd_echo_off_cb(const char *cmd)
{
shell_object.echo_on = false;
return NULL;
}