summaryrefslogtreecommitdiffstats
path: root/hal/uart.hpp
blob: 179dd4a0fbd3ce6dedd232a003bd511b7ad23db0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* 
 * File:   uart.hpp
 * Author: naopross
 *
 * Created on May 2, 2018, 7:04 PM
 */

#ifndef UART_HPP
#define	UART_HPP

#include <cstdint>
#include <cstddef>
#include <string>

extern "C" {
void usart_1_isr();
void usart_2_isr();
void usart_3_isr();
void usart_4_isr();
}

namespace uart
{
	const unsigned devices_count = 4;

	enum class status : unsigned int
	{
		rx_data_available = 1<<0,
		rx_overrun_error = 1<<1,
		framing_error = 1<<2,
		parity_error = 1<<3,
		receiver_ide = 1<<4,
		tx_complete = 1<<8,
		tx_full = 1<<9,
	};

	enum class transfer_status : unsigned int
	{
		rx_full = 1<<0,
		rx_data_present = 1<<1,
		rx_empty = 1<<2,
		tx_full = 1<<3,
		tx_empty = 1<<4,
	};

	std::string rx_buffer[devices_count];
	std::string tx_buffer[devices_count];

	template<unsigned dev>
	void initialize();

    template<unsigned dev>
    uint8_t peek(uint16_t offset);

    template<unsigned dev>
    uint8_t read(void);

    template<unsigned dev>
    unsigned read(uint8_t *buffer, const unsigned numbytes);
    
    template<unsigned dev>
    void write(const uint8_t byte);

    template<unsigned dev>
    unsigned write(const uint8_t *buffer, const unsigned numbytes);

    template<unsigned dev>
    status status();

    template<unsigned dev>
    transfer_status tranfer_status();

    template<unsigned dev>
    unsigned rx_buffer_size();

    template<unsigned dev>
    unsigned tx_buffer_size();

    template<unsigned dev>
    bool rx_buffer_empty();

    template<unsigned dev>
    bool tx_buffer_full();
}

#endif	/* UART_HPP */