]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blob - source/cmdio_tisci.c
Debugging and rewriting send not to use interrupts, but direct sending.
[pes-rpp/rpp-test-sw.git] / source / cmdio_tisci.c
1 /*
2  * cmdio_buffer.c
3  *
4  *  Created on: 17.7.2012
5  *      Author: Michal Horn
6  *
7  *  Definition of IO. This implementation uses queues as buffers, which are than used for input and output.
8  *
9  */
10
11 #include "cmdio_tisci.h"
12
13 tBuffer outBuffer;
14 tBuffer inBuffer;
15
16 void initIoBuffer() {
17         outBuffer.buf = xQueueCreate(MAX_BUFFER_LEN, sizeof(uint8_t));
18         outBuffer.mutex = xSemaphoreCreateMutex();
19         outBuffer.initialized = 1;
20         inBuffer.buf = xQueueCreate(MAX_BUFFER_LEN, sizeof(uint8_t));
21         inBuffer.mutex = xSemaphoreCreateMutex();
22         inBuffer.initialized = 1;
23 }
24 portBASE_TYPE print(const uint8_t * string, uint32_t length) {
25         return genericPrint(&outBuffer, string, length);
26 }
27 portBASE_TYPE read(uint8_t * ch) {
28         return genericRead(&inBuffer, ch);
29 }
30 portBASE_TYPE genericRead(tBuffer* buffer, uint8_t * ch) {
31         if (!buffer->initialized) return errBUFFER_NOT_INITIALIZED;
32         portBASE_TYPE ret;
33         ret = xQueueReceive(buffer->buf, ch, portMAX_DELAY);
34         return ret;
35 }
36 portBASE_TYPE genericPrint(tBuffer* buffer, const uint8_t * string, uint32_t length) {
37         if (!buffer->initialized) return errBUFFER_NOT_INITIALIZED;
38         uint32_t i = 0;
39         portBASE_TYPE ret = pdPASS;
40         xSemaphoreTake(buffer->mutex, portMAX_DELAY);
41         while (i < length && string[i] != '\0') {
42                 if (xQueueSend(buffer->buf, (void*)&string[i], 0) == pdPASS) {
43                         i++;
44                 }
45                 else sciSend(sciREG, 1, NULL);
46         }
47         sciSend(sciREG, 1, NULL);
48         xSemaphoreGive(buffer->mutex);
49         return ret;
50 }
51 portBASE_TYPE clearInputBuffer() {
52         return clearBuffer(&inBuffer);
53 }
54 portBASE_TYPE clearOutputBuffer() {
55         return clearBuffer(&outBuffer);
56 }
57 portBASE_TYPE clearBuffer(tBuffer * buffer) {
58         if (!buffer->initialized) return errBUFFER_NOT_INITIALIZED;
59         while ((xQueueReceive(buffer->buf, NULL, 0)) != errQUEUE_EMPTY) // Delete content of queue
60                 ;
61         return pdPASS;
62 }
63
64 int tisci_putc(cmd_io_t *cmd_io, int ch) {
65         uint8_t c = (uint8_t)ch;
66         if (print((uint8_t *)&c, 1) != pdPASS) {
67                 return 0;
68         }
69     return 1;
70 }
71
72 int tisci_getc(cmd_io_t *cmd_io) {
73         uint8_t ret = '\0';
74         if (read(&ret) != pdPASS) {
75         ret = '\0';
76         }
77     return ret;
78 }
79 int tisci_write(cmd_io_t *cmd_io, const void *buf, int count) {
80     const char *tmpBuf = buf;
81         if (print((uint8_t *)tmpBuf, count) != pdPASS)
82                 return 0;
83     return count;
84 }
85 int tisci_read(cmd_io_t *cmd_io, void *buf, int count) {
86     char *tmpBuf = buf;
87     int i = 0;
88     while (i < count) {
89         if (read((uint8_t *)&tmpBuf[i]) != pdPASS)
90                 break;
91         i++;
92     }
93     return i;
94 }
95
96 /* Setting io stack for cmdProc */
97 cmd_io_t cmd_io_buf={
98         tisci_putc,
99         tisci_getc,
100         tisci_write,
101         tisci_read
102 };
103