123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #include <rtgui/rtgui.h>
- #include <rtgui/image.h>
- #include <rtgui/rtgui_system.h>
- #include <rtgui/widgets/view.h>
- #include <rtgui/widgets/workbench.h>
- #define POINT_LENGTH 320
- static rt_uint8_t points[POINT_LENGTH];
- static rt_uint8_t old_point, fudu = 1;
- static rt_uint16_t current_point = 0;
- static rtgui_view_t *osc_view = RT_NULL;
- static rtgui_timer_t *osc_timer;
- #include <math.h>
- void osc_timeout(struct rtgui_timer* timer, void* parameter)
- {
- struct rtgui_dc* dc;
- rtgui_color_t saved;
- const double PI=3.141592653589793238462643383279;
- dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(osc_view));
- if (dc == RT_NULL) return ;
- saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view));
- RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) =
- RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(osc_view));
- if (current_point != 0)
- rtgui_dc_draw_line(dc, current_point - 1, old_point, current_point, points[current_point]);
- else
- rtgui_dc_draw_point(dc, current_point, points[current_point]);
- RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) = saved;
- old_point = points[current_point];
- points[current_point] = 100 * sin((current_point * 4 * fudu) * PI / POINT_LENGTH) + 100;
- if (current_point != 0)
- rtgui_dc_draw_line(dc, current_point - 1, points[current_point - 1], current_point, points[current_point]);
- else
- rtgui_dc_draw_point(dc, current_point, points[current_point]);
- current_point ++;
- if (current_point == POINT_LENGTH)
- {
- current_point = 0;
- fudu ++;
- if (fudu == 4) fudu = 1;
- }
- rtgui_dc_end_drawing(dc);
- }
- static rt_bool_t osc_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
- {
- switch (event->type)
- {
- case RTGUI_EVENT_PAINT:
- {
- struct rtgui_dc* dc;
- struct rtgui_rect rect;
- int index;
- dc = rtgui_dc_begin_drawing(widget);
- if (dc == RT_NULL) return RT_FALSE;
- rtgui_widget_get_rect(widget, &rect);
- rtgui_dc_fill_rect(dc, &rect);
- for (index = 0; index < 320; index ++)
- rtgui_dc_draw_point(dc, index, points[index]);
- rtgui_dc_end_drawing(dc);
- return RT_FALSE;
- }
- case RTGUI_EVENT_KBD:
- {
- struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
- if ((ekbd->type == RTGUI_KEYDOWN) && (ekbd->key == RTGUIK_RETURN))
- {
- rtgui_workbench_t* workbench;
- /* stop timer */
- rtgui_timer_destory(osc_timer);
- /* clean points */
- rt_memset(points, 0xff, sizeof(points));
- current_point = 0;
- /* close this view */
- workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(osc_view)->parent);
- rtgui_workbench_remove_view(workbench, osc_view);
- rtgui_view_destroy(osc_view);
- osc_view = RT_NULL;
- fudu = 0;
- return RT_FALSE;
- }
- }
- }
- return rtgui_view_event_handler(widget, event);
- }
- rtgui_view_t *osc_view_create(struct rtgui_workbench* workbench)
- {
- if (osc_view != RT_NULL)
- {
- rtgui_view_show(osc_view, RT_FALSE);
- }
- else
- {
- /* create picture view */
- osc_view = rtgui_view_create("Oscilloscope");
- rtgui_widget_set_event_handler(RTGUI_WIDGET(osc_view),
- osc_view_event_handler);
- rtgui_workbench_add_view(workbench, osc_view);
- /* this view can be focused */
- RTGUI_WIDGET(osc_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
- rt_memset(points, 0xff, sizeof(points));
- osc_timer = rtgui_timer_create(8,
- RT_TIMER_FLAG_PERIODIC,
- osc_timeout, RT_NULL);
- rtgui_timer_start(osc_timer);
- }
- return osc_view;
- }
|