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; }
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(); } }