Skip to content
Snippets Groups Projects
Commit 497c64a9 authored by Cedric Roux's avatar Cedric Roux
Browse files

XY view

parent 8195e42d
No related branches found
No related tags found
No related merge requests found
CC=gcc
CFLAGS=-Wall -g -pthread -I..
OBJS=stdout.o textlist.o
OBJS=stdout.o textlist.o xy.o
view.a: $(OBJS)
ar cr view.a $(OBJS)
......
......@@ -13,5 +13,7 @@ typedef struct view {
view *new_view_stdout(void);
view *new_view_textlist(int maxsize, float refresh_rate, gui *g, widget *w);
view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
int color);
#endif /* _VIEW_H_ */
#include "view.h"
#include "../utils.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdarg.h>
#include <string.h>
struct xy {
view common;
gui *g;
widget *w;
int plot;
float refresh_rate;
pthread_mutex_t lock;
int length;
float *x;
float *y;
int insert_point;
};
static void *xy_thread(void *_this)
{
struct xy *this = _this;
while (1) {
if (pthread_mutex_lock(&this->lock)) abort();
xy_plot_set_points(this->g, this->w, this->plot,
this->length, this->x, this->y);
if (pthread_mutex_unlock(&this->lock)) abort();
sleepms(1000/this->refresh_rate);
}
return 0;
}
static void clear(view *this)
{
/* TODO */
}
static void append(view *_this, float *x, float *y, int length)
{
struct xy *this = (struct xy *)_this;
int i;
int ip;
if (pthread_mutex_lock(&this->lock)) abort();
ip = this->insert_point;
/* TODO: optimize the copy */
for (i = 0; i < length; i++) {
this->x[ip] = x[i];
this->y[ip] = y[i];
ip++; if (ip == this->length) ip = 0;
}
this->insert_point = ip;
if (pthread_mutex_unlock(&this->lock)) abort();
}
static void set(view *_this, char *name, ...)
{
struct xy *this = (struct xy *)_this;
va_list ap;
if (!strcmp(name, "length")) {
if (pthread_mutex_lock(&this->lock)) abort();
va_start(ap, name);
free(this->x);
free(this->y);
this->length = va_arg(ap, int);
this->x = calloc(sizeof(float), this->length); if (this->x==NULL)abort();
this->y = calloc(sizeof(float), this->length); if (this->y==NULL)abort();
this->insert_point = 0;
va_end(ap);
if (pthread_mutex_unlock(&this->lock)) abort();
return;
}
printf("%s:%d: unkown setting '%s'\n", __FILE__, __LINE__, name);
abort();
}
view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
int color)
{
struct xy *ret = calloc(1, sizeof(struct xy));
if (ret == NULL) abort();
ret->common.clear = clear;
ret->common.append = (void (*)(view *, ...))append;
ret->common.set = set;
ret->refresh_rate = refresh_rate;
ret->g = g;
ret->w = w;
ret->plot = xy_plot_new_plot(g, w, color);
ret->length = length;
ret->x = calloc(sizeof(float), length); if (ret->x == NULL) abort();
ret->y = calloc(sizeof(float), length); if (ret->y == NULL) abort();
ret->insert_point = 0;
if (pthread_mutex_init(&ret->lock, NULL)) abort();
new_thread(xy_thread, ret);
return (view *)ret;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment