Skip to content

Commit

Permalink
Chardev output needs buffering.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiri Svoboda committed Nov 30, 2017
1 parent 7f345cd commit bbc6277
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 15 deletions.
14 changes: 11 additions & 3 deletions uspace/srv/hid/output/ctl/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,21 +104,29 @@ static void serial_char_update(outdev_t *dev, sysarg_t col, sysarg_t row)
draw_char(state, field, col, row);
}

static void serial_flush(outdev_t *dev)
{
vt100_state_t *state = (vt100_state_t *) dev->data;

vt100_flush(state);
}

static outdev_ops_t serial_ops = {
.yield = serial_yield,
.claim = serial_claim,
.get_dimensions = serial_get_dimensions,
.get_caps = serial_get_caps,
.cursor_update = serial_cursor_update,
.char_update = serial_char_update
.char_update = serial_char_update,
.flush = serial_flush
};

int serial_init(vt100_putchar_t putchar_fn,
vt100_control_puts_t control_puts_fn)
vt100_control_puts_t control_puts_fn, vt100_flush_t flush_fn)
{
vt100_state_t *state =
vt100_state_create(SERIAL_COLS, SERIAL_ROWS, putchar_fn,
control_puts_fn);
control_puts_fn, flush_fn);
if (state == NULL)
return ENOMEM;

Expand Down
2 changes: 1 addition & 1 deletion uspace/srv/hid/output/ctl/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

#include "../proto/vt100.h"

extern int serial_init(vt100_putchar_t, vt100_control_puts_t);
extern int serial_init(vt100_putchar_t, vt100_control_puts_t, vt100_flush_t);

#endif

Expand Down
8 changes: 7 additions & 1 deletion uspace/srv/hid/output/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,8 @@ static void srv_cursor_update(ipc_callid_t iid, ipc_call_t *icall)

dev->ops.cursor_update(dev, prev_col, prev_row, col, row,
visible);
dev->ops.flush(dev);

}

async_answer_0(iid, EOK);
Expand Down Expand Up @@ -341,8 +343,11 @@ static void srv_update(ipc_callid_t iid, ipc_call_t *icall)
dev->ops.char_update(dev, x, y);
}
}

dev->ops.flush(dev);
}


async_answer_0(iid, EOK);
}

Expand Down Expand Up @@ -379,8 +384,9 @@ static void srv_damage(ipc_callid_t iid, ipc_call_t *icall)
dev->ops.char_update(dev, col + x, row + y);
}
}
dev->ops.flush(dev);

}

async_answer_0(iid, EOK);
}

Expand Down
1 change: 1 addition & 0 deletions uspace/srv/hid/output/output.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ typedef struct {
void (* cursor_update)(struct outdev *dev, sysarg_t prev_col,
sysarg_t prev_row, sysarg_t col, sysarg_t row, bool visible);
void (* char_update)(struct outdev *dev, sysarg_t col, sysarg_t row);
void (* flush)(struct outdev *dev);
} outdev_ops_t;

typedef struct outdev {
Expand Down
37 changes: 30 additions & 7 deletions uspace/srv/hid/output/port/chardev.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,30 +45,53 @@
#include "../output.h"
#include "chardev.h"

enum {
chardev_buf_size = 4096
};

static char *console;

static async_sess_t *sess;
static chardev_t *chardev;
static service_id_t serial_cat_id;
static service_id_t console_cat_id;

static uint8_t chardev_buf[chardev_buf_size];
static size_t chardev_bused;

static FIBRIL_MUTEX_INITIALIZE(discovery_lock);
static bool discovery_finished;
static FIBRIL_CONDVAR_INITIALIZE(discovery_cv);

static void chardev_putchar(wchar_t ch)
static void chardev_flush(void)
{
uint8_t byte = (uint8_t) ch;
size_t nwr;
chardev_write(chardev, &byte, 1, &nwr);

if (chardev_bused == 0)
return;

chardev_write(chardev, chardev_buf, chardev_bused, &nwr);
/* XXX Handle error */

chardev_bused = 0;
}

static void chardev_putchar(wchar_t ch)
{
if (chardev_bused == chardev_buf_size)
chardev_flush();
if (!ascii_check(ch))
ch = '?';
chardev_buf[chardev_bused++] = (uint8_t) ch;
}

static void chardev_control_puts(const char *str)
{
size_t nwr;
chardev_write(chardev, (void *) str, str_size(str), &nwr);
/* XXX Handle error */
const char *p;

p = str;
while (*p != '\0')
chardev_putchar(*p++);
}

static bool find_output_dev(service_id_t *svcid)
Expand Down Expand Up @@ -174,7 +197,7 @@ static void check_for_dev(void)
return;
}

serial_init(chardev_putchar, chardev_control_puts);
serial_init(chardev_putchar, chardev_control_puts, chardev_flush);

discovery_finished = true;
fibril_condvar_signal(&discovery_cv);
Expand Down
7 changes: 6 additions & 1 deletion uspace/srv/hid/output/port/ega.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,18 @@ static void ega_char_update(outdev_t *dev, sysarg_t col, sysarg_t row)
draw_char(field, col, row);
}

static void ega_flush(outdev_t *dev)
{
}

static outdev_ops_t ega_ops = {
.yield = ega_yield,
.claim = ega_claim,
.get_dimensions = ega_get_dimensions,
.get_caps = ega_get_caps,
.cursor_update = ega_cursor_update,
.char_update = ega_char_update
.char_update = ega_char_update,
.flush = ega_flush
};

int ega_init(void)
Expand Down
9 changes: 8 additions & 1 deletion uspace/srv/hid/output/proto/vt100.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,16 @@ static void vt100_set_sgr(vt100_state_t *state, char_attrs_t attrs)
}

vt100_state_t *vt100_state_create(sysarg_t cols, sysarg_t rows,
vt100_putchar_t putchar_fn, vt100_control_puts_t control_puts_fn)
vt100_putchar_t putchar_fn, vt100_control_puts_t control_puts_fn,
vt100_flush_t flush_fn)
{
vt100_state_t *state = malloc(sizeof(vt100_state_t));
if (state == NULL)
return NULL;

state->putchar = putchar_fn;
state->control_puts = control_puts_fn;
state->flush = flush_fn;

state->cols = cols;
state->rows = rows;
Expand Down Expand Up @@ -227,5 +229,10 @@ void vt100_putchar(vt100_state_t *state, wchar_t ch)
}
}

void vt100_flush(vt100_state_t *state)
{
state->flush();
}

/** @}
*/
5 changes: 4 additions & 1 deletion uspace/srv/hid/output/proto/vt100.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@

typedef void (* vt100_putchar_t)(wchar_t ch);
typedef void (* vt100_control_puts_t)(const char *str);
typedef void (* vt100_flush_t)(void);

typedef struct {
sysarg_t cols;
Expand All @@ -47,10 +48,11 @@ typedef struct {

vt100_putchar_t putchar;
vt100_control_puts_t control_puts;
vt100_flush_t flush;
} vt100_state_t;

extern vt100_state_t *vt100_state_create(sysarg_t, sysarg_t, vt100_putchar_t,
vt100_control_puts_t);
vt100_control_puts_t, vt100_flush_t);
extern void vt100_state_destroy(vt100_state_t *);

extern int vt100_yield(vt100_state_t *);
Expand All @@ -61,6 +63,7 @@ extern void vt100_goto(vt100_state_t *, sysarg_t, sysarg_t);
extern void vt100_set_attr(vt100_state_t *, char_attrs_t);
extern void vt100_cursor_visibility(vt100_state_t *, bool);
extern void vt100_putchar(vt100_state_t *, wchar_t);
extern void vt100_flush(vt100_state_t *);

#endif

Expand Down

0 comments on commit bbc6277

Please sign in to comment.