#include "../../../headers/input/touch/touch_controller_L3_deltas_compute.h" #include #include void delta_store( tracked_delta *delta, uint8_t state_flag, uint8_t cursor, uint64_t *ids_buffer ){ (*delta).state = state_flag; (*delta).tracking_id = ids_buffer[cursor]; } void increase_and_flag( uint8_t *cursor, uint8_t buffer_length, uint8_t *buffer_completed ){ (*cursor)++; if( (*cursor) >= buffer_length){ *buffer_completed = 1; } } /* a lot of params since sizeof(arr) does not work with heap arrays */ /* takes two sorted arrays of ids : previous and current returns an array of tracked_delta(s) */ void touch_events_sorted_ids_deltas( tracked_delta **endbuffer, uint16_t *endcount, uint64_t *previous_ids, uint8_t previous_count, uint64_t *current_ids, uint8_t current_count ){ uint16_t accumulatedCounter = 0; uint8_t previous_completed = 0; uint8_t current_completed = 0; uint8_t previous_cursor = 0; uint8_t current_cursor = 0; //until at least one of the lists has not been fully traversed, checks must be done to avoid collisions while( ! previous_completed && ! current_completed){ accumulatedCounter++; if( previous_ids[previous_cursor] < current_ids[current_cursor]){ increase_and_flag( &previous_cursor, previous_count, &previous_completed); } else if( previous_ids[previous_cursor] == current_ids[current_cursor]){ increase_and_flag( &previous_cursor, previous_count, &previous_completed); increase_and_flag( ¤t_cursor, current_count, ¤t_completed); } else{ increase_and_flag( ¤t_cursor, current_count, ¤t_completed); } } accumulatedCounter += ( previous_count - previous_cursor); accumulatedCounter += ( current_count - current_cursor); *endcount = accumulatedCounter; *endbuffer = malloc( *endcount * sizeof( tracked_delta)); /* since the scan has already been done once, previous_completed and current_completed could be substituted by a counter_threshold variable... */ accumulatedCounter = (uint16_t) -1u; previous_completed = 0; current_completed = 0; previous_cursor = 0; current_cursor = 0; while( ! previous_completed && ! current_completed){ accumulatedCounter++; if( previous_ids[previous_cursor] < current_ids[current_cursor]){ endbuffer[accumulatedCounter]->old_index = previous_cursor; delta_store( endbuffer[accumulatedCounter], TRACKED_DELTA_EXITED, previous_cursor, previous_ids); increase_and_flag( &previous_cursor, previous_count, &previous_completed); } else if( previous_ids[previous_cursor] == current_ids[current_cursor]){ endbuffer[accumulatedCounter]->old_index = previous_cursor; endbuffer[accumulatedCounter]->new_index = current_cursor; // both the combinations of cursor and ids_buffer will work delta_store( endbuffer[accumulatedCounter], TRACKED_DELTA_UNCHANGED, previous_cursor, previous_ids); increase_and_flag( &previous_cursor, previous_count, &previous_completed); increase_and_flag( ¤t_cursor, current_count, ¤t_completed); } else{ endbuffer[accumulatedCounter]->new_index = current_cursor; delta_store( endbuffer[accumulatedCounter], TRACKED_DELTA_ENTERED, current_cursor, current_ids ); increase_and_flag( ¤t_cursor, current_count, ¤t_completed); } } while( ! previous_completed){ accumulatedCounter++; endbuffer[accumulatedCounter]->old_index = previous_cursor; delta_store( endbuffer[accumulatedCounter], TRACKED_DELTA_EXITED, previous_cursor, previous_ids); increase_and_flag( &previous_cursor, previous_count, &previous_completed); } while( ! current_completed){ accumulatedCounter++; endbuffer[accumulatedCounter]->new_index = current_cursor; delta_store( endbuffer[accumulatedCounter], TRACKED_DELTA_ENTERED, current_cursor, current_ids ); increase_and_flag( ¤t_cursor, current_count, ¤t_completed); } }