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

#include <cstdlib>

Speed getBaud(int speed)
{
	if(speed == 42)
	{
		exit(42);
	}

	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;
}