// shell.c


#include <912d60.h>
#include <stdio.h>
#include <string.h>
#include "kernel.h"
#include "semlib.h"




// FUNCTION PROTOTYPES
void shellcmd_tcb(void);
void shellcmd_rcb(void);
void shellcmd_ticks(void);
void shellcmd_start_task(unsigned char id);

/*void shellcmd_stop_task(unsigned char id);
void shellcmd_set_task_priority(unsigned char id, unsigned char priority);
void shellcmd_quit_shell(void);*/




// GLOBAL VARIABLES
extern unsigned long int system_tick;
extern unsigned int current;		   	 	// current task id number





void shell(void) {
	
	// LOCAL VARIABLES
	char command[32], i, j;
	int cmd;
	
	
	
	// INITIALIZE
	sem_get(COM1);		  // get comm port 1 semaphore
	INTR_ON();			  // enable interrupts
	
	
	
	// COMMAND SHELL 
	while (1) {
	
		  i = 0;
		  
		  // put a prompt
		  putchar('>'); putchar('>'); putchar(' ');
		  
		  
		  // get and echo a command
		  while (((command[i]=getchar()) != 0xD) && (i<7)) {
		  		putchar(command[i]);
				
				if (command[i] == 8) {
				    putchar(32);  		 // space
					putchar(8);			 // backspace
					command[i] = '\0';	 // null
					i--;
				} else
				  	i++;
		  }
		  command[i] = '\0';
		  putchar('\n');

		  
		  
		  // determine/execute the command
		  if (command[0] == 0xD)	 // CR
		  	 cmd = 0;
		  else if (strcmp(command, "tcb") == 0)
		  	 shellcmd_tcb();
		  else if (strcmp(command, "ticks") == 0)
		  	 shellcmd_ticks();
		  else if (strcmp(command, "start") == 0)
		  	 shellcmd_start_task(2);
		  else if (strcmp(command, "") == 0);
		  else
		  	  puts("syntax error"); putchar('\n');


	}  // end while(1)
	
	INTR_OFF();
	sem_give(COM1);
	
}




void shellcmd_tcb(void) {

	 // LOCAL VARIABLES
	 int id;

	 
	 for (id=0; id<3; id++) {
	 puts  ("----------+----------+---------+");
	 
	 /* this takes a while, so treat as a critical section in order
	 	to get reliable data  */
	 INTR_OFF();
	 
	 printf("TaskID: %d | State: %d | Prio: %d\n", id,
	 				 	  		 	  			   get_task_state(id),
												   get_task_priority(id));
	 } // end for loop
	 
	 // finished with critical section
	 INTR_ON();
	 
	 puts  ("----------+----------+---------+");
	 puts("Idle=0, Pending=1, Running=2, Waiting=3, Finished=4");
	 putchar('\n');
	 
	 
}




void shellcmd_ticks(void) {
	 
	 INTR_OFF();
	 printf("Ticks: %ld\n", system_tick);
	 INTR_ON();
	 putchar('\n');
}




void shellcmd_start_task(unsigned char id) {

	 INTR_OFF();
	 set_task_state(id, 1);
	 INTR_ON();
	 puts("task started");
}

