1/*
2 * Copyright 2018, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <autoconf.h>
8#include <camkes.h>
9#include <stdio.h>
10
11#define CLIENT_BUF 20
12#define SERIAL_BUF (0x1000 - 8)
13
14struct {
15    uint32_t head;
16    uint32_t tail;
17    char buf[SERIAL_BUF];
18} extern volatile *interrupt_getchar_buf;
19
20void pre_init(void)
21{
22    set_putchar(interrupt_putchar_putchar);
23}
24
25int run(void)
26{
27    printf("%s: Hello Serial Server!\n", get_instance_name());
28
29    char buf[CLIENT_BUF];
30    while (1) {
31        seL4_Word badge = 0;
32        int i = 0;
33        do {
34            if (interrupt_getchar_buf->head == interrupt_getchar_buf->tail) {
35                seL4_Wait(interrupt_getchar_notification(), &badge);
36            }
37            buf[i] = interrupt_getchar_buf->buf[interrupt_getchar_buf->head];
38            interrupt_getchar_buf->head = (interrupt_getchar_buf->head + 1) % sizeof(interrupt_getchar_buf->buf);
39        } while (buf[i] != '\r' && ++i < CLIENT_BUF - 1);
40        buf[i] = 0;
41        printf("%s: %s\n", get_instance_name(), buf);
42    }
43    return 0;
44}
45