Ejemplo n.º 1
0
int release_msg_env(msg_envelope *rel_msg)
{
    int retCode;
    atomic(ON);
    retCode=k_release_msg_env(rel_msg);
    atomic(OFF);
    
    return retCode;
}
Ejemplo n.º 2
0
/*
 * 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;
}