⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
字号:
#include <ucos_ii.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "rtc.h"
#include "aux_lib.h"
#include "uart_std.h"
#include "uart2.h"
#include "command.h"
#include "cdrs_op.h"
#include "tasks.h"
#include "ff.h"
#include "gui.h"


static int command_test(int argc, char **argv);
static int command_date(int argc, char **argv);
static int command_lst(int argc, char **argv);
static int command_help(int argc, char **argv);
static int command_kill(int argc, char **argv);
static int command_top(int argc, char **argv);
static int command_clear(int argc, char **argv);
static int command_cdrs(int argc, char **argv);
static int command_atc(int argc, char **argv);
static int command_dir(int argc, char **argv);
static int command_prtsc(int argc, char **argv);

struct cmd cmds[] = {
	// {"test", command_test, "Test some function."},
	{"atc",  command_atc,  "AT command."},
	{"lst", command_lst,   "List tasks."},
	{"date", command_date, "Show rtc time."},
	{"cdrs", command_cdrs, "Open/Close cdma or gprs."},
	{"run", command_run,   "Start a new task."},
	{"kill", command_kill, "Stop a running task."},
	{"top", command_top,   "Show running task info"},
	{"help", command_help, "Show this messages."},
	{"clear", command_clear, "Clear screen."},
	{"dir", command_dir, "List directory."},
	{"prtsc", command_prtsc, "Print screen to file."},
	{NULL, NULL, NULL}
};

FILINFO Finfo;

char MenuStart(void);
void DispMenuTop(void);
int MENU_ShowStreamBMP(int x0, int y0,
		       void (*pfStream) (unsigned int, void *));
void fun(unsigned int n, void *pd);




static int command_test(int argc, char **argv)
{
//	unsigned short msg;
//    int blk = 0;
    return 0;
}

static int command_atc(int argc, char **argv)
{
   char buf[80];
    int ch, i = 0;

    printf("\r\nAt Command mode\r\n");
    do {
        ch = uart_peek_key(udev_std);

        if (ch != EOF) {
            if (ch == '\r' || ch == '\n') {
                printf("\r\n");
                buf[i] = 0;
                strcat(buf, "\r\n");
                for (i=0; buf[i] != '\0'; i++)        
                    uart2_send_ch(buf[i]);
                i = 0;
                buf[0] = 0;
            } else {
                buf[i++] = ch;
                printf("%c", ch);   
            }
        }
        ch = uart2_peek_key();
        if (ch != EOF) {
            printf("%c", ch);
        }
        OSTimeDlyHMSM(0, 0, 0, 5);
 
    } while (!(buf[0] == 'q' || buf[0] == 'Q'));
//    printf("\r\nClose CDMA ...");
//    CDRS_Close();
//    CDRS_SetPower(0);
    printf("\r\nAT Command Exit!\r\n");
	return 0;
}

static int command_cdrs(int argc, char **argv)
{
    if (!strcmp(argv[1], "open")){
        
        CDRS_SetPower(1);
        CDRS_Open();
    } else if (!strcmp(argv[1], "close")) {
        CDRS_Close();
        CDRS_SetPower(0);    
    } else {
        printf("\r\n cdrs [open|close]");
    } 
    return 0;
}

static int command_date(int argc, char **argv)
{
    time_t timer;
    struct tm stm;
    // yyyy mm dd hh mm ss
    if (argc == 7) {
        //设置时间
        memset(&stm, 0, sizeof stm);
        
        stm.tm_year = atoi(argv[1])-1900; /* years since 1900 */
        stm.tm_mon  = atoi(argv[2]) - 1;    /* months since January, 0 to 11 */
        stm.tm_mday = atoi(argv[3]);    /* day of the month, 1 to 31 */
        stm.tm_hour = atoi(argv[4]);   /* hours since midnight, 0 to 23 */
        stm.tm_min  = atoi(argv[5]);    /* minutes after the hour, 0 to 59 */

        stm.tm_sec  = atoi(argv[6]);    /* seconds after the minute, 0 to 60
         (0 - 60 allows for the occasional leap second) */

      //  stm.tm_wday = 3;    /* days since Sunday, 0 to 6 */
     //   stm.tm_yday = 0;    /* days since January 1, 0 to 365 */
     //   stm.tm_isdst = 1;   /* Daylight Savings Time flag */
        rtc_SetTime(&stm);
    }
    //显示时间
    time(&timer);
    printf("\r\n%s", ctime(&timer));  
    return 0;
}

static int command_lst(int argc, char **argv)
{
	struct user_task *ptask = &user_tasks[1];
	printf("\r\n All User Tasks :");
	for (; ptask->TaskName != NULL; ptask++) {
		printf("\r\n    \x1B[1;32m%-10s\x1B[40;37m  : %s", ptask->TaskName,
		       ptask->desc);
	}
	printf("\r\n");
	return 0;
}

int command_run(int argc, char **argv)
{
	struct user_task *ptask = &user_tasks[0];

	if (argc == 1) {
		printf("\r\nrun <task name>");
		return -1;
	}

	for (; ptask->TaskName != NULL; ptask++) {
		if (!strcmp(argv[1], (char *) ptask->TaskName))
			break;
	}
	if (ptask->TaskName == NULL) {
		printf("\r\nNo Task Named : %s", argv[1]);
		return -1;
	}
	if (OSTCBPrioTbl[ptask->prio] != (OS_TCB *) 0) {
		printf("\r\nTask : %s is running!", argv[1]);
		return -1;
	}

	ptask->parg = &argv[1];
#if 0
	{
	int i;

	printf("\r\nargc = %d", argc);
	for (i = 0; i < argc; i++) {
		printf(" %s", argv[i]);
	}
	}
#endif

	if (Run_Task(ptask) < 0) {
		printf("\r\nErr : Create Task.");
		return -1;
	}
	printf("\r\n");
	return 0;
}
static int command_kill(int argc, char **argv)
{

	struct user_task *ptask = &user_tasks[0];
	int idxp = 0, idxn;

	if (argc == 1) {
		printf("\r\nkill <task name>");
		return -1;
	}
	idxn = 1;
	if (argc > 2) {
		idxp = 1;
		idxn = 2;
	}
	for (; ptask->TaskName != NULL; ptask++) {
		if (!strcmp(argv[idxn], (char *) ptask->TaskName))
			break;
	}
	if (ptask->TaskName == NULL) {
		printf("\r\nNo Task Named : %s", argv[idxn]);
		return -1;
	}
	if (OSTCBPrioTbl[ptask->prio] == (OS_TCB *) 0) {
		printf("\r\nTask : %s isn't running!", argv[idxn]);
		return -1;
	}
	if (argc > 2
	    && (argv[idxp][idxp] == 'F' || argv[idxp][idxp] == 'f')) {
		if (OS_ERR_NONE != OSTaskDel(ptask->prio)) {
			printf("\r\nErr : Kill Task.");
			printf("\r\n");
			return -1;
		}
		return 0;
	}
	OSTaskDelReq(ptask->prio);

	printf("\r\n");
	return 0;
}

static int command_top(int argc, char **argv)
{
	INT32U TotalStk;
	OS_TCB *ptcb;
	INT16U version;
	static char *TsakS[] =
	    { "RDY", "SEM", "MBOX", "Q", "SUSPEND", "FLAG", "", "MUTEX" };
	version = OSVersion();

	while (1) {

		INT32U cpuclk;

		cpuclk = OS_CPU_ClkFreq();
		printf("%c[%dA%c[2J", 0x1b, 100, 0x1b);	//清屏

		printf("\r\n                           uC/OS-II                       ");
		printf("\r\n                                           Version %d.%d  ", version / 100, version % 100);
		printf("\r\n #CPU Clock : %u", cpuclk / 1000000);
		cpuclk %= 1000000;
		if (cpuclk) {
			printf(".%u", cpuclk);
		}
		printf(" MHz");
		printf("\r\n");
		printf("\r\n Name            Prio  State   SwCtr   CPU   FreeStk   UsedStk   TotalStk");
		printf("\r\n ------------------------------------------------------------------------");

		ptcb = OSTCBList;
		do {
			TotalStk =
			    (INT32U) ptcb->OSTCBStkBase -
			    (INT32U) ptcb->OSTCBStkBottom;

			printf("\r\n \x1B[1;32m%-15s\x1B[40;37m %-5u %-7s %-7u %2u%%   %-8u  %-8u  %u",
			     ptcb->OSTCBTaskName, ptcb->OSTCBPrio, TsakS[ptcb->OSTCBStat], ptcb->OSTCBCtxSwCtr,	//ptcb->OSTCBCyclesTot,
			     ptcb->OSTCBCyclesTot * 100 / OSTimeGet(),	// total, //ptcb->OSTCBCyclesStart,
			     TotalStk - ptcb->OSTCBStkUsed,
			     ptcb->OSTCBStkUsed, TotalStk);
			ptcb = ptcb->OSTCBNext;
		} while (ptcb);

		printf("\r\n");
		printf("\r\n #Tasks : %-2d   #CPU Usage : %d%%   #Task switch/sec : %d",
		     OSTaskCtr, OSCPUUsage, OSCtxSwCtr);	/* Display #tasks running               */
		printf("\r\n #Power On : %us", OSTimeGet() / OS_TICKS_PER_SEC);
		if (peekch() == 0x1b)
			break;
		OSTimeDlyHMSM(0, 0, 1, 0);
	}
	printf("\r\n");
	return 0;
}

static int command_help(int argc, char **argv)
{
	struct cmd *pcmd = cmds;

	printf("\r\n All commands :");
	for (; pcmd->cmdName != NULL; pcmd++) {
		printf("\r\n    \x1B[1;32m%-9s\x1B[40;37m : %s", pcmd->cmdName, pcmd->help);
	}
	printf("\r\n");
	return 0;
}

static int command_clear(int argc, char **argv)
{
	printf("%c[%dA%c[2J", 0x1b, 100, 0x1b);	//清屏
	return 0;
}

int put_rc (FRESULT rc)
{
	const char *p;
	static const char str[] =
		"OK\0" "DISK_ERR\0" "INT_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0"
		"INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0" "WRITE_PROTECTED\0"
		"INVALID_DRIVE\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0";
	FRESULT i;

	for (p = str, i = 0; i != rc && *p; i++) {
		while(*p++);
	}
	printf("\r\nrc=%u FR_%s\r\n", (UINT)rc, p);

	return 0;
}

int filinfo_list(FILINFO* finfo) {
	if (finfo->fattrib & AM_DIR) {
		printf("\r\n   %12s      <DIR>  %2d-%02d-%04d  %2d:%02d",
		  finfo->fname,
		  (finfo->fdate >> 5) & 15,
		  finfo->fdate & 31,
		  (finfo->fdate >> 9) + 1980,
		  (finfo->ftime >> 11),
		  (finfo->ftime >> 5) & 63
		);
	} else {
		printf("\r\n   %12s %10ld  %2d-%02d-%04d  %2d:%02d",
		  finfo->fname,
		  finfo->fsize,
		  (finfo->fdate >> 5) & 15,
		  finfo->fdate & 31,
		  (finfo->fdate >> 9) + 1980,
		  (finfo->ftime >> 11),
		  (finfo->ftime >> 5) & 63
		);
	}
	return 0;
}

int command_dir(int argc, char **argv)
{
	const char* sdrive = "sd";
	char* ptr, filename[84];
	long p1;
	BYTE res;
	UINT s1, s2;
	FATFS *fs;	/* Pointer to file system object */
	DIR dir;	/* Directory object */

	if (argc < 2) {
		// printf("\r\ndir <path>");
		// return -1;
		argv[1] = "/";
		argc = 2;
	}

	ptr = argv[1];
	while (*ptr == ' ') ptr++;

	strncpy(&filename[3], ptr, 80);
	ptr = &filename[3];

	if (memcmp(ptr, "1:", 2) != 0) {
		if (ptr[0] != '/' && ptr[0] != '\\') {
			ptr--;
			ptr[0] = '\\';
		}
		ptr -= 2;
		memcpy(ptr, "1:", 2);
	}

	printf("\r\n Volume in drive %s%s\r\n", sdrive, "1");
	printf("\r\n Directory of %s%s\r\n", sdrive, ptr);

	res = f_opendir(&dir, ptr);
	if (res != FR_OK) {
		put_rc(res);
		// printf("Directory Unexist %d\r\n", res);
		return -1;
	}
	p1 = s1 = s2 = 0;

	for(;;) {
		res = f_readdir(&dir, &Finfo);
		if ((res != FR_OK) || !Finfo.fname[0]) break;
		if (Finfo.fattrib & AM_DIR) {
			s2++;
		} else {
			s1++;
			p1 += Finfo.fsize;
		}
		filinfo_list(&Finfo);
	}
	printf("\r\n");
	printf("          %4u File(s),%10lu bytes total\r\n", s1, p1);
	printf("          %4u Dir(s)", s2);
	if (f_getfree(ptr, (DWORD*)&p1, &fs) == FR_OK) {
		printf(", %10lu bytes free\r\n", p1 * fs->csize * 512);
	}

	return 0;
}

FIL prt_fil_buf[1];
FIL* prt_fil = &prt_fil_buf[0];

int prtsc_file_open(char* filename, int mode) {
	char fnambuf[0x80];
	int r;

	sprintf(fnambuf, "1:\\strpic\\%s", filename);
	r = f_open(prt_fil, fnambuf, FA_WRITE | FA_CREATE_NEW);
	if (FR_OK != r) {
		printf("\r\nopen file %s err %d", fnambuf, r);
		return -2;
	}

	return 0;	
}

void prtsc_wfile_clbk(U8 Data, void* p) {
	int br;

	f_write(prt_fil, &Data, 1, (UINT*)&br);
	return;
}

static int command_prtsc(int argc, char **argv) {
	char* ptr;
	int r;

	if (argc < 2) {
		printf("\r\nprtsc <filename>");
		return -1;
	}

	ptr = argv[1];
	while (*ptr == ' ') ptr++;

	r = prtsc_file_open(ptr, 0);
	if (r < 0) {
		return -2;
	}

	GUI_StreamBMP(NULL, prtsc_wfile_clbk, NULL);

	f_sync(prt_fil);	
	f_close(prt_fil);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -