diff --git a/pattern_frame_buffer/include/frame_buffer.h b/pattern_frame_buffer/include/frame_buffer.h index 6b48631151c97075bff569fdc8c376095b4c3f50..aca02b27815ec1ae5a128b4eb32a522c67dcde83 100644 --- a/pattern_frame_buffer/include/frame_buffer.h +++ b/pattern_frame_buffer/include/frame_buffer.h @@ -5,6 +5,8 @@ extern "C" { #endif +#include "memory.h" + #ifndef FB_MAX_BUFFER_LEN #error "Please, specify the maximum frame buffer length with the FB_MAX_BUFFER_LEN macro" #endif @@ -13,6 +15,7 @@ extern "C" { typedef struct { + TMemory *memory; unsigned short int ram_base_address; unsigned short int eeprom_base_address; unsigned short int num_rows; @@ -23,7 +26,7 @@ typedef struct unsigned char pixel_buffer[FB_MAX_BUFFER_LEN]; }TFrameBuffer; -void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsigned short int eeprom_base_address); +void frame_buffer_init(TFrameBuffer *fb,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address); void frame_buffer_set_num_rows(TFrameBuffer *fb,unsigned short int rows); unsigned short int frame_buffer_get_num_rows(TFrameBuffer *fb); void frame_buffer_set_pixels_per_row(TFrameBuffer *fb,unsigned short int pixels); diff --git a/pattern_frame_buffer/include/frame_buffer_control.h b/pattern_frame_buffer/include/frame_buffer_control.h index ed4deeed49e34676641ff1bf7423c07a28a3f337..934b906a7c40b29c483c62a814d9406a3a883466 100644 --- a/pattern_frame_buffer/include/frame_buffer_control.h +++ b/pattern_frame_buffer/include/frame_buffer_control.h @@ -32,6 +32,7 @@ typedef struct TFBControl TScheduler *scheduler; sched_channel_t sch_channel; unsigned short int period_ms; + TMemory *memory; TMemModule mem_module; unsigned short int ram_base_address; unsigned short int eeprom_base_address; diff --git a/pattern_frame_buffer/include/image_patterns.h b/pattern_frame_buffer/include/image_patterns.h index 69696474c272258aeb2b0e0c7b105b83a7b626bc..d61001fc0ae404aeb17a6403ecb97e37213825af 100644 --- a/pattern_frame_buffer/include/image_patterns.h +++ b/pattern_frame_buffer/include/image_patterns.h @@ -3,6 +3,7 @@ #include "patterns.h" #include "frame_buffer_control.h" +#include "memory.h" #ifndef IMG_MAX_NUM_IMAGES #error "Please, specify the maximum number of images with the IMG_MAX_NUM_IMAGES macro" @@ -20,7 +21,7 @@ extern unsigned char img_pattern_data[IMG_MAX_NUM_IMAGES][IMG_MAX_IMAGE_WIDTH][IMG_MAX_IMAGE_HEIGHT][3]; -void img_patterns_init(unsigned short int ram_base_address); +void img_patterns_init(TMemory *memory,unsigned short int ram_base_address); #pragma pack (push, 1) typedef struct diff --git a/pattern_frame_buffer/src/frame_buffer.c b/pattern_frame_buffer/src/frame_buffer.c index 4e35ec0c62296d8b1c294fde8d6e280acb18deac..ec208cadcc8e039f16d594f3f1677f5d7e1545ab 100644 --- a/pattern_frame_buffer/src/frame_buffer.c +++ b/pattern_frame_buffer/src/frame_buffer.c @@ -7,12 +7,12 @@ void frame_buffer_compute_free_memory(TFrameBuffer *fb) { fb->buffer_size=fb->num_rows*fb->num_pixels_per_row*FB_BYTES_PER_PIXEL; fb->free_mem=FB_MAX_BUFFER_LEN-fb->buffer_size*fb->num_buffers; - ram_data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET]=fb->free_mem&0x00FF; - ram_data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET+1]=(fb->free_mem&0xFF00)>>8; + fb->memory->data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET]=fb->free_mem&0x00FF; + fb->memory->data[fb->ram_base_address+FRAME_BUFFER_CONTROL_FREE_MEMORY_OFFSET+1]=(fb->free_mem&0xFF00)>>8; } // public functions -void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsigned short int eeprom_base_address) +void frame_buffer_init(TFrameBuffer *fb,TMemory *memory,unsigned short int ram_base_address,unsigned short int eeprom_base_address) { unsigned int i; @@ -22,6 +22,7 @@ void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsi frame_buffer_set_num_buffers(fb,DEFAULT_FRAME_BUFFER_CONTROL_NUM_BUFFERS); fb->ram_base_address=ram_base_address; fb->eeprom_base_address=eeprom_base_address; + fb->memory=memory; for(i=0;i<FB_MAX_BUFFER_LEN;i++) fb->pixel_buffer[i]=0x00; @@ -30,8 +31,8 @@ void frame_buffer_init(TFrameBuffer *fb,unsigned short int ram_base_address,unsi void frame_buffer_set_num_rows(TFrameBuffer *fb,unsigned short int rows) { fb->num_rows=rows; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET]=rows&0x00FF; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET+1]=(rows&0xFF00)>>8; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET]=rows&0x00FF; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_ROWS_OFFSET+1]=(rows&0xFF00)>>8; frame_buffer_compute_free_memory(fb); } @@ -43,8 +44,8 @@ unsigned short int frame_buffer_get_num_rows(TFrameBuffer *fb) void frame_buffer_set_pixels_per_row(TFrameBuffer *fb,unsigned short int pixels) { fb->num_pixels_per_row=pixels; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET]=pixels&0x00FF; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET+1]=(pixels&0xFF00)>>8; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET]=pixels&0x00FF; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_PIXELS_OFFSET+1]=(pixels&0xFF00)>>8; frame_buffer_compute_free_memory(fb); } @@ -56,8 +57,8 @@ unsigned short int frame_buffer_get_pixels_per_row(TFrameBuffer *fb) void frame_buffer_set_num_buffers(TFrameBuffer *fb,unsigned char num) { fb->num_buffers=num; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET]=num&0x00FF; - ram_data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET+1]=(num&0xFF00)>>8; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET]=num&0x00FF; + fb->memory->data[fb->eeprom_base_address+FRAME_BUFFER_CONTROL_NUM_BUFFERS_OFFSET+1]=(num&0xFF00)>>8; frame_buffer_compute_free_memory(fb); } diff --git a/pattern_frame_buffer/src/frame_buffer_control.c b/pattern_frame_buffer/src/frame_buffer_control.c index 12efbd809630cd1fe262fc46e5c4f34b7271bd68..f1e2277e793566d65bee38a062a5ce23e7487827 100644 --- a/pattern_frame_buffer/src/frame_buffer_control.c +++ b/pattern_frame_buffer/src/frame_buffer_control.c @@ -161,7 +161,9 @@ void frame_buffer_control_write_cmd(void *module,unsigned short int address,unsi void frame_buffer_control_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data) { - ram_read_table(address,length,data); + TFBControl *control=(TFBControl *)module; + + ram_read_table(control->memory,address,length,data); } void frame_buffer_control_scheduler(void *data) @@ -180,7 +182,7 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch // initialize internal variables frame_buffer_control_clear_patterns(control); frame_buffer_control_clear_copy_functions(control); - frame_buffer_init(&control->frame_buffer,ram_base_address,eeprom_base_address); + frame_buffer_init(&control->frame_buffer,memory,ram_base_address,eeprom_base_address); control->ram_base_address=ram_base_address; control->eeprom_base_address=eeprom_base_address; @@ -189,13 +191,14 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch control->scheduler=scheduler; control->sch_channel=ch; - img_patterns_init(ram_base_address); + img_patterns_init(memory,ram_base_address); /* initialize memory module */ mem_module_init(&control->mem_module); control->mem_module.write_cmd=frame_buffer_control_write_cmd; control->mem_module.read_cmd=frame_buffer_control_read_cmd; control->mem_module.data=control; + control->memory=memory; if(!mem_module_add_ram_segment(&control->mem_module,ram_base_address,RAM_FRAME_BUFFER_CONTROL_LENGTH)) return 0x00; if(!mem_module_add_eeprom_segment(&control->mem_module,eeprom_base_address,EEPROM_FRAME_BUFFER_CONTROL_LENGTH)) @@ -209,20 +212,20 @@ unsigned char frame_buffer_control_init(TFBControl *control,TMemory *memory,TSch void frame_buffer_control_start(TFBControl *control) { scheduler_enable_channel(control->scheduler,control->sch_channel); - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]|=FRAME_BUFFER_CONTROL_RUNNING; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]|=FRAME_BUFFER_CONTROL_RUNNING; } void frame_buffer_control_stop(TFBControl *control) { scheduler_disable_channel(control->scheduler,control->sch_channel); - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]&=(~FRAME_BUFFER_CONTROL_RUNNING); + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_OFFSET]&=(~FRAME_BUFFER_CONTROL_RUNNING); } void frame_buffer_control_set_period(TFBControl *control,unsigned short int period_ms) { scheduler_change_period(control->scheduler,control->sch_channel,period_ms); - ram_data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET]=period_ms&0x00FF; - ram_data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET+1]=(period_ms&0xFF00)>>8; + control->memory->data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET]=period_ms&0x00FF; + control->memory->data[control->eeprom_base_address+FRAME_BUFFER_CONTROL_PERIOD_OFFSET+1]=(period_ms&0xFF00)>>8; control->period_ms=period_ms; } @@ -241,22 +244,22 @@ unsigned char frame_buffer_control_add_pattern(TFBControl *control,pattern_func_ num_cols=frame_buffer_get_pixels_per_row(&control->frame_buffer); if(area->min_row>num_rows || area->max_row>num_rows || area->min_row>area->max_row) { - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; return 0xFF; } if(area->min_col>num_cols || area->max_col>num_cols || area->min_col>area->max_col) { - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; return 0xFF; } if(data_length>FBC_MAX_DATA_PATTERN_LEN) { - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; return 0xFF; } if(buffer_id>=frame_buffer_get_num_buffers(&control->frame_buffer)) { - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; return 0xFF; } @@ -274,13 +277,13 @@ unsigned char frame_buffer_control_add_pattern(TFBControl *control,pattern_func_ control->pat_parameters[j][i]=((unsigned char *)data)[i]; control->pat_functions[j]=function; control->num_patterns++; - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_NUM_PATTERN_OFFSET]=control->num_patterns; - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=j; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_NUM_PATTERN_OFFSET]=control->num_patterns; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=j; return j; } } // the pattern could not be added - ram_data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; + control->memory->data[control->ram_base_address+FRAME_BUFFER_CONTROL_PATTERN_INDEX_OFFSET]=0xFF; return 0xFF; } diff --git a/pattern_frame_buffer/src/image_patterns.c b/pattern_frame_buffer/src/image_patterns.c index f49a883511e192516bc59d9508efcc551d841141..85f7aadce9cb2cc2f5aeb8924d5fe203065bbc54 100644 --- a/pattern_frame_buffer/src/image_patterns.c +++ b/pattern_frame_buffer/src/image_patterns.c @@ -43,12 +43,12 @@ void img_patterns_compute_range(unsigned short int area_min,unsigned short int a } // public functions -void img_patterns_init(unsigned short int ram_base_address) +void img_patterns_init(TMemory *memory,unsigned short int ram_base_address) { //initialize internal variables (read only variables) - ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_WIDTH_OFFSET]=IMG_MAX_IMAGE_WIDTH; - ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_HEIGHT_OFFSET]=IMG_MAX_IMAGE_HEIGHT; - ram_data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_NUM_IMGS_OFFSET]=IMG_MAX_NUM_IMAGES; + memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_WIDTH_OFFSET]=IMG_MAX_IMAGE_WIDTH; + memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_MAX_HEIGHT_OFFSET]=IMG_MAX_IMAGE_HEIGHT; + memory->data[ram_base_address+FRAME_BUFFER_CONTROL_IMG_NUM_IMGS_OFFSET]=IMG_MAX_NUM_IMAGES; } void img_general(TLEDArea *area,TIMGDisplayData *pattern_data,unsigned char buffer_id,unsigned short int period,TFBControl *control)