summaryrefslogtreecommitdiff
path: root/examples/getbaud.cc
blob: 2488fc19f8d91bf1d2c244cd7e2d8cba57dc5e83 (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
#include "getbaud.h"

Speed getBaud(int speed)
{
	struct
	{
		int value;
		Speed speed;
	}
	speeds[] =
		{
			{      0,      Speed::B0 },
			{     50,     Speed::B50 },
			{     75,     Speed::B75 },
			{    110,    Speed::B110 },
			{    134,    Speed::B134 },
			{    150,    Speed::B150 },
			{    200,    Speed::B200 },
			{    300,    Speed::B300 },
			{    600,    Speed::B600 },
			{   1200,   Speed::B1200 },
			{   1800,   Speed::B1800 },
			{   2400,   Speed::B2400 },
			{   4800,   Speed::B4800 },
			{   9600,   Speed::B9600 },
			{  19200,  Speed::B19200 },
			{  38400,  Speed::B38400 },
			{  57600,  Speed::B57600 },
			{ 115200, Speed::B115200 },
			{ 230400, Speed::B230400 },
		};

	if(speed < 0)
	{
		throw bad_speed();
	}

	for(const auto& s : speeds)
	{
		if(speed == s.value)
		{
			return s.speed;
		}

		if(speed < s.value)
		{
			return (*((&s)-1)).speed;
		}
	}

	return speeds[sizeof(speeds) / sizeof(*speeds) - 1].speed;
}