gui.c File Reference


Detailed Description

GUI.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

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 Documentation

#define MAX_BUFFER_HEIGHT   Max(Max(Max(Max(GUI_SOURCE1_HEIGHT, GUI_OUTPUT1_HEIGHT), GUI_OUTPUT2_HEIGHT), GUI_OUTPUT3_HEIGHT), GUI_ZOOM_BOX_HEIGHT)

Definition at line 78 of file gui.c.

#define MAX_BUFFER_WIDTH   Max(Max(Max(Max(GUI_SOURCE1_WIDTH, GUI_OUTPUT1_WIDTH), GUI_OUTPUT2_WIDTH), GUI_OUTPUT3_WIDTH), GUI_ZOOM_BOX_WIDTH)

Definition at line 77 of file gui.c.


Function Documentation

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   ) 

Definition at line 108 of file gui.c.

References gui_fs.

00109 {
00110   return gui_fs.time_ms;
00111 }

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 }


Variable Documentation

struct gui_box box[] [static]

Initial value:

 {
GUI_BOXES
}

Definition at line 73 of file gui.c.

uint8_t buffer[ET024006_BITMAP_WIDTH(MAX_BUFFER_WIDTH)*MAX_BUFFER_HEIGHT] [static]

Definition at line 80 of file gui.c.

Referenced by gui_print_signal_box().

t_cpu_time cpu_time

Definition at line 85 of file gui.c.

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]

char gui_text_buffer[GUI_TEXT_BUFFER_SIZE]

Definition at line 90 of file gui.c.

dsp16_t signal1_buf[BUFFER_LENGTH]

Definition at line 115 of file main.c.

Referenced by adc_process_task(), and gui_task().

dsp16_t signal2_buf[BUFFER_LENGTH]

Definition at line 83 of file lin_task.c.

Referenced by gui_task(), and lin_task().

dsp16_t signal3_buf[BUFFER_LENGTH]

Definition at line 89 of file can_task.c.

Referenced by can_task(), and gui_task().

dsp16_t signal4_buf[BUFFER_LENGTH]

Definition at line 116 of file main.c.

Referenced by adc_process_task(), and gui_task().

dsp16_t signal_buffer[BUFFER_LENGTH] [static]

Definition at line 81 of file gui.c.

Referenced by gui_print_signal_box().

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]

uint32_t time_ms

Definition at line 86 of file gui.c.


Generated on Fri Feb 19 02:22:37 2010 for AVR32 - CAN LIN LOOPBACKS Demo. by  doxygen 1.5.5