00001
00047 #include <stdarg.h>
00048 #include "board.h"
00049 #include "et024006dhu.h"
00050 #include "conf_demo.h"
00051 #include "delay.h"
00052 #include "gpio.h"
00053 #include "gui.h"
00054 #include "background_image.h"
00055 #include "cycle_counter.h"
00056
00057 #include "dsp.h"
00058
00059 #include "compiler.h"
00060
00061 struct gui_box
00062 {
00063 uint16_t x, y;
00064 uint16_t width, height;
00065 et024006_color_t fg_color, bg_color;
00066 };
00067
00068 static void gui_draw_background(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
00069 static void gui_buffer_print_dsp16_signal(void *buffer, uint16_t width, uint16_t height, dsp16_t *signal, uint16_t signal_size);
00070 static inline void gui_buffer_set_pixel(void *buffer, uint16_t width, uint16_t height, uint16_t x, uint16_t y);
00071 static void gui_print_signal_box(int box_id, dsp16_t *signal, uint16_t signal_size);
00072
00073 static const struct gui_box box[] = {
00074 GUI_BOXES
00075 };
00076
00077 #define MAX_BUFFER_WIDTH Max(Max(Max(Max(GUI_SOURCE1_WIDTH, GUI_OUTPUT1_WIDTH), GUI_OUTPUT2_WIDTH), GUI_OUTPUT3_WIDTH), GUI_ZOOM_BOX_WIDTH)
00078 #define MAX_BUFFER_HEIGHT Max(Max(Max(Max(GUI_SOURCE1_HEIGHT, GUI_OUTPUT1_HEIGHT), GUI_OUTPUT2_HEIGHT), GUI_OUTPUT3_HEIGHT), GUI_ZOOM_BOX_HEIGHT)
00079
00080 static uint8_t buffer[ET024006_BITMAP_WIDTH(MAX_BUFFER_WIDTH)*MAX_BUFFER_HEIGHT];
00081 static dsp16_t signal_buffer[BUFFER_LENGTH];
00082
00083 static struct
00084 {
00085 t_cpu_time cpu_time;
00086 uint32_t time_ms;
00087 } gui_fs;
00088 static int gui_cpu_hz;
00089
00090 char gui_text_buffer[GUI_TEXT_BUFFER_SIZE];
00091
00092 extern dsp16_t signal1_buf[BUFFER_LENGTH];
00093 extern dsp16_t signal2_buf[BUFFER_LENGTH];
00094 extern dsp16_t signal3_buf[BUFFER_LENGTH];
00095 extern dsp16_t signal4_buf[BUFFER_LENGTH];
00096 extern dsp16_t *signal_in_buf;
00097 extern dsp16_t signal_in_fft[BUFFER_LENGTH];
00098 extern dsp16_t signal_out_buf[BUFFER_LENGTH];
00099 extern dsp16_t signal_out_fft[BUFFER_LENGTH];
00100
00101 extern bool signals_are_updated;
00102 void gui_change_update_fs(uint32_t time_ms)
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 }
00107
00108 uint32_t gui_get_update_fs(void)
00109 {
00110 return gui_fs.time_ms;
00111 }
00112
00113 void gui_init(int cpu_hz, int hsb_hz, int pba_hz, int pbb_hz)
00114 {
00115 gui_cpu_hz = cpu_hz;
00116
00117 delay_init(cpu_hz);
00118
00119 et024006_Init(cpu_hz, hsb_hz);
00120 gpio_set_gpio_pin(ET024006DHU_BL_PIN);
00121
00122 gui_clear_view();
00123
00124 gui_change_update_fs(DEFAULT_SCREEN_UPDATE_FS_MS);
00125 }
00126
00127 void gui_clear_view(void)
00128 {
00129 gui_draw_background(0, 0, ET024006_WIDTH, ET024006_HEIGHT);
00130 }
00131
00132 void gui_task(void)
00133 {
00134 extern volatile Bool source1_zoom_view;
00135
00136
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 }
00147
00148 void gui_set_selection(int box_id)
00149 {
00150 static int prev_selection = GUI_NO_SEL;
00151 struct gui_box *sb;
00152 int i;
00153
00154
00155 if (prev_selection != GUI_NO_SEL && prev_selection != box_id)
00156 {
00157 i = prev_selection;
00158 sb = (struct gui_box *) &box[i];
00159
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
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 }
00187
00188
00189 static void gui_print_signal_box(int box_id, dsp16_t *signal, uint16_t signal_size)
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 }
00212
00213 static void gui_draw_background(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
00214 {
00215 et024006_PutPixmap(background_image, ET024006_WIDTH, x, y, x, y, width, height);
00216 }
00217
00218 static inline void gui_buffer_set_pixel(void *buffer, uint16_t width, uint16_t height, uint16_t x, uint16_t y)
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
00227 static void gui_buffer_print_dsp16_signal(void *buffer, uint16_t width, uint16_t height, dsp16_t *signal, uint16_t signal_size)
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
00235 memset(buffer, 0, ET024006_BITMAP_WIDTH(width)*height);
00236
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
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
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
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
00275 if (i_signal)
00276 {
00277
00278 if (Abs(prev_y - cur_y) < t - prev_t)
00279 {
00280 int16_t b;
00281
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
00292 else
00293 {
00294 int16_t b;
00295
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 }