Definition in file gui.c.
#include <stdarg.h>
#include "board.h"
#include "et024006dhu.h"
#include "conf_demo.h"
#include "delay.h"
#include "gpio.h"
#include "gui.h"
#include "background_image.h"
#include "cycle_counter.h"
#include "dsp.h"
#include "compiler.h"
Go to the source code of this file.
Data Structures | |
struct | gui_box |
Defines | |
#define | MAX_BUFFER_HEIGHT Max(Max(Max(Max(GUI_SOURCE1_HEIGHT, GUI_OUTPUT1_HEIGHT), GUI_OUTPUT2_HEIGHT), GUI_OUTPUT3_HEIGHT), GUI_ZOOM_BOX_HEIGHT) |
#define | MAX_BUFFER_WIDTH Max(Max(Max(Max(GUI_SOURCE1_WIDTH, GUI_OUTPUT1_WIDTH), GUI_OUTPUT2_WIDTH), GUI_OUTPUT3_WIDTH), GUI_ZOOM_BOX_WIDTH) |
Functions | |
static void | gui_buffer_print_dsp16_signal (void *buffer, uint16_t width, uint16_t height, dsp16_t *signal, uint16_t signal_size) |
static void | gui_buffer_set_pixel (void *buffer, uint16_t width, uint16_t height, uint16_t x, uint16_t y) |
void | gui_change_update_fs (uint32_t time_ms) |
This function change the frequency rate of the update of the display. | |
void | gui_clear_view (void) |
static void | gui_draw_background (uint16_t x, uint16_t y, uint16_t width, uint16_t height) |
uint32_t | gui_get_update_fs (void) |
void | gui_init (int cpu_hz, int hsb_hz, int pba_hz, int pbb_hz) |
static void | gui_print_signal_box (int box_id, dsp16_t *signal, uint16_t signal_size) |
void | gui_set_selection (int box_id) |
Select a new box (can select only one box a time). | |
void | gui_task (void) |
Variables | |
static struct gui_box | box [] |
static uint8_t | buffer [ET024006_BITMAP_WIDTH(MAX_BUFFER_WIDTH)*MAX_BUFFER_HEIGHT] |
static int | gui_cpu_hz |
struct { | |
t_cpu_time cpu_time | |
uint32_t time_ms | |
} | gui_fs |
char | gui_text_buffer [GUI_TEXT_BUFFER_SIZE] |
dsp16_t | signal1_buf [BUFFER_LENGTH] |
dsp16_t | signal2_buf [BUFFER_LENGTH] |
dsp16_t | signal3_buf [BUFFER_LENGTH] |
dsp16_t | signal4_buf [BUFFER_LENGTH] |
static dsp16_t | signal_buffer [BUFFER_LENGTH] |
dsp16_t * | signal_in_buf |
dsp16_t | signal_in_fft [BUFFER_LENGTH] |
dsp16_t | signal_out_buf [BUFFER_LENGTH] |
dsp16_t | signal_out_fft [BUFFER_LENGTH] |
bool | signals_are_updated |
#define MAX_BUFFER_HEIGHT Max(Max(Max(Max(GUI_SOURCE1_HEIGHT, GUI_OUTPUT1_HEIGHT), GUI_OUTPUT2_HEIGHT), GUI_OUTPUT3_HEIGHT), GUI_ZOOM_BOX_HEIGHT) |
#define MAX_BUFFER_WIDTH Max(Max(Max(Max(GUI_SOURCE1_WIDTH, GUI_OUTPUT1_WIDTH), GUI_OUTPUT2_WIDTH), GUI_OUTPUT3_WIDTH), GUI_ZOOM_BOX_WIDTH) |
static void gui_buffer_print_dsp16_signal | ( | void * | buffer, | |
uint16_t | width, | |||
uint16_t | height, | |||
dsp16_t * | signal, | |||
uint16_t | signal_size | |||
) | [static] |
Definition at line 228 of file gui.c.
References gui_buffer_set_pixel().
Referenced by gui_print_signal_box().
00228 { 00229 uint16_t t, cur_y; 00230 uint32_t scale_x, scale_y; 00231 uint32_t i_signal; 00232 uint16_t i, last_y = 0; 00233 00234 // Clean the graph 00235 memset(buffer, 0, ET024006_BITMAP_WIDTH(width)*height); 00236 // Compute scaling coefficients 00237 scale_y = (uint32_t) ((height/2) * 0x10000) / ((uint32_t) -DSP_FP_MIN(DSP16_QA, DSP16_QB)); 00238 00239 if (signal_size >= width) 00240 { 00241 // Speed drawing 00242 scale_x = (uint32_t) (signal_size * 0x10000) / width; 00243 for (t=0; t<width; t++) 00244 { 00245 i_signal = ((uint64_t) t * scale_x) / 0x10000; 00246 // Integer value 00247 cur_y = ((((uint64_t) signal[i_signal] * scale_y) / 0x10000) >> DSP16_QB); 00248 cur_y = height/2 - cur_y - 1; 00249 if (last_y <= cur_y && t) 00250 { 00251 for (i=last_y; i<=cur_y; i++) 00252 gui_buffer_set_pixel(buffer, width, height, t, i); 00253 } 00254 else if (t) 00255 { 00256 for (i=cur_y; i<=last_y; i++) 00257 gui_buffer_set_pixel(buffer, width, height, t, i); 00258 } 00259 last_y = cur_y; 00260 } 00261 } 00262 else 00263 { 00264 uint16_t prev_t = 0, prev_y = 0; 00265 int32_t delta_y; 00266 00267 // Fine drawing 00268 scale_x = (((uint32_t) (width * (signal_size + 1)) / signal_size) * 0x10000) / signal_size; 00269 for (i_signal=0; i_signal<signal_size; i_signal++) 00270 { 00271 t = ((uint64_t) i_signal * scale_x) / 0x10000; 00272 cur_y = ((((uint64_t) signal[i_signal] * scale_y) / 0x10000) >> DSP16_QB); 00273 cur_y = height/2 - cur_y - 1; 00274 // Draw a line between points 00275 if (i_signal) 00276 { 00277 // Draw a line when its angle with the horizontal axis is bellow 45 degres 00278 if (Abs(prev_y - cur_y) < t - prev_t) 00279 { 00280 int16_t b; 00281 // delta_y = a * 0x10000 00282 delta_y = (int32_t) ((prev_y - cur_y) * 0x10000) / (prev_t - t); 00283 b = cur_y - (delta_y * t) / 0x10000; 00284 for (i=prev_t; i<t; i++) 00285 { 00286 uint16_t temp_y; 00287 temp_y = (uint16_t) ((delta_y * i) / 0x10000 + b); 00288 gui_buffer_set_pixel(buffer, width, height, i, temp_y); 00289 } 00290 } 00291 // Draw a line when its angle with the horizontal axis is above 45 degres 00292 else 00293 { 00294 int16_t b; 00295 // delta_y = (1 / a) * 0x10000 < 0x10000 00296 delta_y = (int32_t) ((prev_t - t) * 0x10000) / (prev_y - cur_y); 00297 b = cur_y - ((int32_t) 0x10000 * t) / delta_y; 00298 if (prev_y < cur_y) 00299 { 00300 for (i=prev_y; i<cur_y; i++) 00301 { 00302 uint16_t temp_x; 00303 temp_x = ((uint32_t) ((i - b) * delta_y)) / 0x10000; 00304 gui_buffer_set_pixel(buffer, width, height, temp_x, i); 00305 } 00306 } 00307 else 00308 { 00309 for (i=cur_y; i<prev_y; i++) 00310 { 00311 uint16_t temp_x; 00312 temp_x = ((uint32_t) ((i - b) * delta_y)) / 0x10000; 00313 gui_buffer_set_pixel(buffer, width, height, temp_x, i); 00314 } 00315 } 00316 } 00317 } 00318 prev_t = t; 00319 prev_y = cur_y; 00320 } 00321 } 00322 } 00323 }
static void gui_buffer_set_pixel | ( | void * | buffer, | |
uint16_t | width, | |||
uint16_t | height, | |||
uint16_t | x, | |||
uint16_t | y | |||
) | [inline, static] |
Definition at line 219 of file gui.c.
Referenced by gui_buffer_print_dsp16_signal().
00219 { 00220 uint8_t *u8_buffer = (uint8_t *) buffer; 00221 if (x >= width || y >= height) 00222 return; 00223 u8_buffer += y * ET024006_BITMAP_WIDTH(width) + x / 8; 00224 *u8_buffer = *u8_buffer | (1 << (x & 7)); 00225 } 00226
void gui_change_update_fs | ( | uint32_t | time_ms | ) |
This function change the frequency rate of the update of the display.
Definition at line 102 of file gui.c.
References gui_cpu_hz, and gui_fs.
Referenced by gui_init().
00103 { 00104 gui_fs.time_ms = time_ms; 00105 cpu_set_timeout(cpu_ms_2_cy(gui_fs.time_ms, gui_cpu_hz), &gui_fs.cpu_time); 00106 }
void gui_clear_view | ( | void | ) |
Definition at line 127 of file gui.c.
References gui_draw_background().
Referenced by gui_init(), and state_machine_task().
00128 { 00129 gui_draw_background(0, 0, ET024006_WIDTH, ET024006_HEIGHT); 00130 }
static void gui_draw_background | ( | uint16_t | x, | |
uint16_t | y, | |||
uint16_t | width, | |||
uint16_t | height | |||
) | [static] |
Definition at line 213 of file gui.c.
References background_image.
Referenced by gui_clear_view(), and gui_set_selection().
00214 { 00215 et024006_PutPixmap(background_image, ET024006_WIDTH, x, y, x, y, width, height); 00216 }
uint32_t gui_get_update_fs | ( | void | ) |
void gui_init | ( | int | cpu_hz, | |
int | hsb_hz, | |||
int | pba_hz, | |||
int | pbb_hz | |||
) |
Definition at line 113 of file gui.c.
References DEFAULT_SCREEN_UPDATE_FS_MS, gui_change_update_fs(), gui_clear_view(), and gui_cpu_hz.
Referenced by main().
00114 { 00115 gui_cpu_hz = cpu_hz; 00116 // Init the delay function 00117 delay_init(cpu_hz); 00118 // Init the display 00119 et024006_Init(cpu_hz, hsb_hz); 00120 gpio_set_gpio_pin(ET024006DHU_BL_PIN); 00121 // Draw the background 00122 gui_clear_view(); 00123 // Set the frequency rate of the update of the display 00124 gui_change_update_fs(DEFAULT_SCREEN_UPDATE_FS_MS); 00125 }
static void gui_print_signal_box | ( | int | box_id, | |
dsp16_t * | signal, | |||
uint16_t | signal_size | |||
) | [static] |
Definition at line 189 of file gui.c.
References gui_box::bg_color, buffer, BUFFER_LENGTH, gui_box::fg_color, gui_buffer_print_dsp16_signal(), GUI_ZOOM_BOX_HEIGHT, GUI_ZOOM_BOX_WIDTH, GUI_ZOOM_BOX_X, GUI_ZOOM_BOX_Y, gui_box::height, signal_buffer, gui_box::width, gui_box::x, gui_box::y, zoom_view, and zoom_view_id.
Referenced by gui_task().
00190 { 00191 const struct gui_box *sb = &box[box_id]; 00192 extern volatile Bool zoom_view; 00193 extern volatile int zoom_view_id; 00194 00195 if (zoom_view && zoom_view_id != box_id) 00196 return; 00197 00198 signal_size = Min(signal_size, BUFFER_LENGTH); 00199 00200 memcpy(signal_buffer, signal, sizeof(dsp16_t)*signal_size); 00201 00202 if (zoom_view && zoom_view_id == box_id) 00203 gui_buffer_print_dsp16_signal(buffer, GUI_ZOOM_BOX_WIDTH, GUI_ZOOM_BOX_HEIGHT, signal_buffer, signal_size); 00204 else 00205 gui_buffer_print_dsp16_signal(buffer, sb->width, sb->height, signal_buffer, signal_size); 00206 00207 if (zoom_view && zoom_view_id == box_id) 00208 et024006_PutBitmap(buffer, GUI_ZOOM_BOX_WIDTH, GUI_ZOOM_BOX_X, GUI_ZOOM_BOX_Y, GUI_ZOOM_BOX_WIDTH, GUI_ZOOM_BOX_HEIGHT, sb->fg_color, sb->bg_color); 00209 else 00210 et024006_PutBitmap(buffer, sb->width, sb->x, sb->y, sb->width, sb->height, sb->fg_color, sb->bg_color); 00211 }
void gui_set_selection | ( | int | box_id | ) |
Select a new box (can select only one box a time).
Definition at line 148 of file gui.c.
References gui_box::bg_color, gui_draw_background(), GUI_NO_COLOR, GUI_NO_SEL, GUI_SELECTION_COLOR, gui_box::height, gui_box::width, gui_box::x, and gui_box::y.
Referenced by state_machine_global().
00149 { 00150 static int prev_selection = GUI_NO_SEL; 00151 struct gui_box *sb; 00152 int i; 00153 00154 // Clear previous selections 00155 if (prev_selection != GUI_NO_SEL && prev_selection != box_id) 00156 { 00157 i = prev_selection; 00158 sb = (struct gui_box *) &box[i]; 00159 // Don't do anything if the color is transparent 00160 if (sb->bg_color == GUI_NO_COLOR) 00161 { 00162 gui_draw_background(sb->x - 2, sb->y - 2, sb->width + 4, 2); 00163 gui_draw_background(sb->x - 2, sb->y + sb->height, sb->width + 4, 2); 00164 gui_draw_background(sb->x - 2, sb->y - 2, 2, sb->height + 4); 00165 gui_draw_background(sb->x + sb->width, sb->y - 2, 2, sb->height + 4); 00166 } 00167 else 00168 { 00169 et024006_DrawFilledRect(sb->x - 2, sb->y - 2, sb->width + 4, 2, sb->bg_color); 00170 et024006_DrawFilledRect(sb->x - 2, sb->y + sb->height, sb->width + 4, 2, sb->bg_color); 00171 et024006_DrawFilledRect(sb->x - 2, sb->y - 2, 2, sb->height + 4, sb->bg_color); 00172 et024006_DrawFilledRect(sb->x + sb->width, sb->y - 2, 2, sb->height + 4, sb->bg_color); 00173 } 00174 } 00175 00176 prev_selection = box_id; 00177 00178 if (box_id == GUI_NO_SEL) 00179 return; 00180 // Draw the selection 00181 sb = (struct gui_box *) &box[box_id]; 00182 et024006_DrawFilledRect(sb->x - 2, sb->y - 2, sb->width + 4, 2, GUI_SELECTION_COLOR); 00183 et024006_DrawFilledRect(sb->x - 2, sb->y + sb->height, sb->width + 4, 2, GUI_SELECTION_COLOR); 00184 et024006_DrawFilledRect(sb->x - 2, sb->y - 2, 2, sb->height + 4, GUI_SELECTION_COLOR); 00185 et024006_DrawFilledRect(sb->x + sb->width, sb->y - 2, 2, sb->height + 4, GUI_SELECTION_COLOR); 00186 }
void gui_task | ( | void | ) |
Definition at line 132 of file gui.c.
References gui_cpu_hz, gui_fs, GUI_OUTPUT1_ID, GUI_OUTPUT2_ID, GUI_OUTPUT3_ID, gui_print_signal_box(), GUI_SOURCE1_ID, signal1_buf, signal2_buf, signal3_buf, and signal4_buf.
Referenced by main().
00133 { 00134 extern volatile Bool source1_zoom_view; 00135 00136 // Check the last time the printing has been done 00137 if (cpu_is_timeout(&gui_fs.cpu_time)) 00138 { 00139 gui_print_signal_box(GUI_SOURCE1_ID, signal1_buf, sizeof(signal1_buf)/sizeof(signal1_buf[0])); 00140 gui_print_signal_box(GUI_OUTPUT3_ID, signal2_buf, sizeof(signal2_buf)/sizeof(signal2_buf[0])); 00141 gui_print_signal_box(GUI_OUTPUT2_ID, signal3_buf, sizeof(signal3_buf)/sizeof(signal3_buf[0])); 00142 gui_print_signal_box(GUI_OUTPUT1_ID, signal4_buf, sizeof(signal4_buf)/sizeof(signal4_buf[0])); 00143 00144 cpu_set_timeout(cpu_ms_2_cy(gui_fs.time_ms, gui_cpu_hz), &gui_fs.cpu_time); 00145 } 00146 }
uint8_t buffer[ET024006_BITMAP_WIDTH(MAX_BUFFER_WIDTH)*MAX_BUFFER_HEIGHT] [static] |
int gui_cpu_hz [static] |
Definition at line 88 of file gui.c.
Referenced by gui_change_update_fs(), gui_init(), and gui_task().
struct { ... } gui_fs [static] |
Referenced by gui_change_update_fs(), gui_get_update_fs(), and gui_task().
char gui_text_buffer[GUI_TEXT_BUFFER_SIZE] |
dsp16_t signal1_buf[BUFFER_LENGTH] |
dsp16_t signal2_buf[BUFFER_LENGTH] |
dsp16_t signal3_buf[BUFFER_LENGTH] |
dsp16_t signal4_buf[BUFFER_LENGTH] |
dsp16_t signal_buffer[BUFFER_LENGTH] [static] |
dsp16_t* signal_in_buf |
dsp16_t signal_in_fft[BUFFER_LENGTH] |
dsp16_t signal_out_buf[BUFFER_LENGTH] |
dsp16_t signal_out_fft[BUFFER_LENGTH] |
bool signals_are_updated |