-
Notifications
You must be signed in to change notification settings - Fork 0
/
snow.cpp
116 lines (93 loc) · 2.06 KB
/
snow.cpp
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
class LinuxFile
{
private:
int m_Handle;
public:
LinuxFile(const char *pFile, int flags = O_RDWR)
{
m_Handle = open(pFile, flags);
}
~LinuxFile()
{
if (m_Handle != -1)
close(m_Handle);
}
size_t Write(const void *pBuffer, size_t size)
{
return write(m_Handle, pBuffer, size);
}
size_t Read(void *pBuffer, size_t size)
{
return read(m_Handle, pBuffer, size);
}
size_t Write(const char *pText)
{
return Write(pText, strlen(pText));
}
size_t Write(int number)
{
char szNum[32];
snprintf(szNum, sizeof(szNum), "%d", number);
return Write(szNum);
}
};
class LinuxGPIOExporter
{
protected:
int m_Number;
public:
LinuxGPIOExporter(int number)
: m_Number(number)
{
LinuxFile("/sys/class/gpio/export", O_WRONLY).Write(number);
}
~LinuxGPIOExporter()
{
LinuxFile("/sys/class/gpio/unexport", O_WRONLY).Write(m_Number);
}
};
class LinuxGPIO : public LinuxGPIOExporter
{
public:
LinuxGPIO(int number)
: LinuxGPIOExporter(number)
{
}
void SetValue(bool value)
{
char szFN[128];
snprintf(szFN, sizeof(szFN), "/sys/class/gpio/gpio%d/value", m_Number);
LinuxFile(szFN).Write(value ? "1" : "0");
}
void SetDirection(bool isOutput)
{
char szFN[128];
snprintf(szFN, sizeof(szFN),
"/sys/class/gpio/gpio%d/direction", m_Number);
LinuxFile(szFN).Write(isOutput ? "out" : "in");
}
};
class Led {
public:
void snowled()
{
LinuxGPIO gpio23(23);
gpio23.SetDirection(true);
bool on = true;
for (;;)
{
printf("Switchingg %s the LED...\n", on ? "on" : "off");
gpio23.SetValue(on);
on = !on;
sleep(1);
}
}
};
extern "C" {
Led* Led_new(){ return new Led(); }
void Led_snowled(Led* led){ led->snowled(); }
}