/** * @brief push_buffer * pushes the data structure onto the circular buffer (queues it) * @param *buffer : pointer to event buffer * @param data : data to be Queued in event_buffer * @retval None */ void push_eventbuffer_queue(wifi_event_buffer *buffer, wifi_event_TypeDef data) { int bufsize; uint32_t index; if (event_full(buffer)) { return; } else { index=buffer->end/ELEMENT_SIZE; buffer->element[index].data_length = data.data_length; buffer->element[index].wind64_pending_packet_no = data.wind64_pending_packet_no; buffer->element[index].socket_id = data.socket_id; buffer->element[index].server_id = data.server_id; buffer->element[index].wind = data.wind; buffer->element[index].event = data.event; buffer->count++; buffer->end = buffer->end + ELEMENT_SIZE; //wrap around if max size is reached bufsize = (buffer->size); buffer->end %= bufsize; } }
void event_push(struct event e) { // full ? don't push if (event_full()) return; *evt_in++ = e; // end of line ? rewind if (evt_in==&evt_queue[EVT_QUEUE_SIZE]) { evt_in=&evt_queue[0]; } }
static void event_test() { // test vectors const int add[] = {0,2,3,10,6 ,4,0,16,0 ,16,16,16,16,16,16,0}; const int get[] = {2,0,6,0 ,16,0,4,0 ,16,0,0,0,0,0,0,16}; event_clear(); for (int i=0;i<sizeof(add)/sizeof(int);i++) { printf("round %d:+%d-%d:",i,add[i],get[i]); for (int j=0;j<add[i];j++) event_push((event){.raw=i}); for (int j=0;j<get[i];j++) printf("%2d ",event_get(i)); //printf("in: %p out:%p start:%p end:%p",evt_in, evt_out, QUEUE_START,QUEUE_END); if (event_full()) printf(" - now full "); if (event_empty()) printf("- now empty "); printf("\n"); }