예제 #1
0
bool Queue_Enqueue(CQueue &q, CQueueType value)
{
    assert(Queue_IsFull(q) == false);
    if (Queue_IsFull(q))
    {
        return false;
    }
    ++q.size;
    q.pData[q.tail++] = value;
    q.tail %= q.capacity;

    return true;
}
void* RddProtocol_CreatePacket(uint8_t receiver, uint8_t type, uint8_t size)
{
	if (Queue_IsFull(transportRddQueue))
	{
		Diagnostics_SendEvent(DIAGNOSTICS_NETWORK_UNABLE_TO_CREATE_RDD_PACKET);
		return NULL;
	}
	queue_element* qe = Queue_Head(transportRddQueue);

	qe->size = size;
	qe->object = MemoryManager_Allocate(qe->size);

	if (qe->object == NULL)
	{
		Diagnostics_SendEvent(DIAGNOSTICS_NETWORK_UNABLE_TO_CREATE_RDD_PACKET);
		return NULL;
	}

	link_network_rdd_header* p = qe->object;
	p->link.type = type;
	p->network.receiver = receiver;
	p->network.sender = address;
	p->transport.sequenceNumber = transportRddNextSequenceNumber++;

	Diagnostics_SendEvent(DIAGNOSTICS_NETWORK_CREATED_RDD_PACKET);

	return qe->object;
}
예제 #3
0
void SPI_Transfer(spi_configuration* configuration, uint8_t* output, uint8_t* input, uint8_t length, completion_handler handler)
{
	if (Queue_IsFull(operationQueue))
	{
		return;
	}

	bool isIdle;

	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
	{
		isIdle = Queue_IsEmpty(operationQueue);
	}

	operation* o = Queue_Head(operationQueue);

	o->configuration = configuration;
	o->output = output;
	o->input = input;
	o->length = length;
	o->handler = handler;

	Queue_AdvanceHead(operationQueue);

	if (isIdle) // just check some register bit instead of isIdle?
	{
		// power up peripheral

		PowerManager_RequestResource(PROCESSOR_RESOURCE_IO_CLOCK); // don't let it sleep

		ExecuteOperation();
	}
}