void fake_cci () { trace(ALWAYS,"request envelopes and stuff."); MsgEnv *env = k_request_msg_env (); while (1) { trace(ALWAYS,"request delay of 5 sec."); k_request_delay( 500, 123 , env); k_receive_message (); trace(ALWAYS,"request delay of 2 sec."); k_request_delay( 200, 123 , env); k_receive_message (); trace(ALWAYS,"request delay of 1 sec."); k_request_delay( 100, 123 , env); k_receive_message (); trace(ALWAYS,"request delay of 0.5 sec."); k_request_delay( 50, 123 , env); k_receive_message (); trace(ALWAYS,"done"); } }
msg_envelope *request_msg_env() { msg_envelope *temp; atomic(ON); temp=k_request_msg_env(); atomic(OFF); return temp; }
/* * This function is called by the assembly STUB function */ void uart_i_process() { int i; BYTE temp; temp = SERIAL1_UCSR; // Ack the interrupt volatile BYTE CharIn = ' '; // There is data to be read if( temp & 1 ) { CharIn = SERIAL1_RD; if (pong_mode) { MsgEnv* message = k_request_msg_env(); message->msg_type = CONSOLE_INPUT; message->msg[0] = CharIn; k_send_message(PONG_PID, message); return; } if (CharIn == KB_LINE_END) { SERIAL1_IMR = 3; SERIAL1_WD = '\n'; SERIAL1_IMR = 2; #ifdef _CFSERVER_ inputIndex--; #endif InBuffer[inputIndex] = '\0'; inputIndex++; MsgEnv* message = k_request_msg_env(); if (message != NULL) { for (i = 0; i < inputIndex; i++) { message->msg[i] = InBuffer[i]; } message->msg_type = CONSOLE_INPUT; k_send_message(CCI_PID, message); } inputIndex = 0; } else if (inputIndex < INPUT_BUFFER_SIZE - 2) // enter in a character { if (!hotkey(CharIn)) { InBuffer[inputIndex] = CharIn; inputIndex++; SERIAL1_IMR = 3; SERIAL1_WD = CharIn; SERIAL1_IMR = 2; } } } // Check to see if data can be written out else if ( temp & 4 ) { if (outputIndex == 0 && output_print_char == FALSE) { MsgEnv* message = k_receive_message(); if (message != NULL) { i = 0; while (message->msg[i] != '\0') { OutBuffer[i] = message->msg[i]; i++; } OutBuffer[i] = '\0'; output_print_char = TRUE; if (message->msg_type == CONSOLE_OUTPUT) { k_release_msg_env(message); } else { message->msg_type = DISPLAY_ACK; k_send_message(message->send_pid, message); } } else { trace(ERROR, "Uart i process expected an env but received NULL"); } } if (output_print_char) { if (OutBuffer[outputIndex] == '\0') { outputIndex = 0; output_print_char = FALSE; MsgEnv* message = k_receive_message(); if (message != NULL) { i = 0; while (message->msg[i] != '\0') { OutBuffer[i] = message->msg[i]; i++; } OutBuffer[i] = '\0'; output_print_char = TRUE; if (message->msg_type == CONSOLE_OUTPUT) { k_release_msg_env(message); } else { message->msg_type = DISPLAY_ACK; k_send_message(message->send_pid, message); } } else { SERIAL1_IMR = 2; // Disable tx interrupt } } else { SERIAL1_WD = OutBuffer[outputIndex]; // Write data outputIndex++; } } } return; }