Exemple #1
0
void sem_server()
{
    Sem_request request;
    Semaphore* sem;
    int tid;
    int status;

    status = RegisterAs( SEMAPHORE_SERVER_NAME );
    assert( status == REGISTER_AS_SUCCESS );

    while( 1 ) {
        status = Receive( &tid, ( char* )&request, sizeof( request ) );
        assert( status == sizeof( request ) );

        sem = request.sem;

        switch( request.type ) {
        case SEM_RELEASE:
            sem->count += 1;
            status = Reply( tid, ( char* )&status, sizeof( status ) );
            assert( status == SYSCALL_SUCCESS );
            break;
        case SEM_AC_ALL:
            if( sem->count > 0 ) {
                sem->count = 1;
            }
        // Fall through
        case SEM_ACQUIRE:
            status = rbuf_put( &sem->wait_queue, ( uchar* )&tid );
            assert( status == ERR_NONE );
            break;
        }

        while( sem->count > 0 && ! rbuf_empty( &sem->wait_queue ) ) {
            sem->count -= 1;
            rbuf_get( &sem->wait_queue, ( uchar* )&tid );
            status = Reply( tid, ( char* )&status, sizeof( status ) );
            assert( status == SYSCALL_SUCCESS );
        }
    }
}
Exemple #2
0
/**
 * \brief Passes CAN message data and VEH_IO data to the output stream
 * @param canMsg1 pointer to a packet of CAN message data
 * @param u64Can1EpochTime1 Time the message arrived
 * @param canMsg2 pointer to a packet of CAN message data
 * @param u64CanEpochTime2 Time the message arrived
 * @param u8IoDir 8-bit value representing the direction of the IO pins (Input:1, Output:0)
 * @param u8IoVal 8-bit value representing the value currently on the IO pins.
 * @return T if data is in a valid format and if there is space available in the output stream buffers
 */
uint8_t CCOM_TxCmd00(CAN_msg_t *canMsg1,
		             uint64_t u64CanEpochTime1,
					 CAN_msg_t *canMsg2,
					 uint64_t u64CanEpochTime2,
					 uint8_t u8IoDir,
					 uint8_t u8IoVal)
{
	uint8_t bOk = 1;
	T_CCOM_ID00 id00Packet;
	uint8_t i;
	uint32_t u32PutAddr;

	Clear_ID00_Packet(&id00Packet);

	/* Check to see if there is room in the output stream buffers */
	if(rbuf_full(&ccomBuf)){ return 0; }

	id00Packet.u16Header = ID00_HEADER;
	id00Packet.u8Id = ID00;
	id00Packet.u8IoDir = u8IoDir;
	id00Packet.u8IoVal = u8IoVal;
	id00Packet.u8BufSize = ccomBuf.count;

	if(NULL == canMsg1)
	{
		id00Packet.u8Dat = ID00_IO_ONLY;
	}
	else if(canMsg2 != NULL)
	{
		id00Packet.u8Dat = ID00_CAN_MSG1_AND_2_AND_IO;

		/* CAN MESSAGE 1 */
		id00Packet.u32CanId1 = canMsg1->id;
		id00Packet.u8CanDlc1 = canMsg1->len;
		id00Packet.u8CanStat1 = canMsg1->stat;
		for(i=0;i<canMsg1->len;i++){ id00Packet.au8CanData1[i] = canMsg1->buf[i]; }
		id00Packet.u64CanEpochTime1 = u64CanEpochTime1;

		/* CAN MESSAGE 2 */
		id00Packet.u32CanId2 = canMsg2->id;
		id00Packet.u8CanDlc2 = canMsg2->len;
		id00Packet.u8CanStat2 = canMsg2->stat;
		for(i=0;i<canMsg2->len;i++){ id00Packet.au8CanData2[i] = canMsg2->buf[i]; }
		id00Packet.u64CanEpochTime2 = u64CanEpochTime2;
	}
	else
	{
		id00Packet.u8Dat = ID00_CAN_MSG1_AND_IO;

		/* CAN MESSAGE 1 */
		id00Packet.u32CanId1 = canMsg1->id;
		id00Packet.u8CanDlc1 = canMsg1->len;
		id00Packet.u8CanStat1 = canMsg1->stat;
		for(i=0;i<canMsg1->len;i++){ id00Packet.au8CanData1[i] = canMsg1->buf[i]; }
		id00Packet.u64CanEpochTime1 = u64CanEpochTime1;
	}

	id00Packet.u8Cksm = Checksum_ID00_Packet(&id00Packet);

	/* Packet is put together... Now stuff it in a bucket for sending */
	rbuf_put(&ccomBuf, &u32PutAddr);	// which available array should we use?
	LoadOutput(&id00Packet.au8AllData[0],(uint8_t *)u32PutAddr,MAX_FRAME_SIZE);


	//for(i=0;i<MAX_FRAME_SIZE;i++){ printf("%02x,",au8Data[0][i]); } printf("\n\r");

	return bOk;
}