Browse code

Add source code of the XiPC emulator

Pawel Jablonski authored on 17/03/2023 16:46:08
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,127 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#include "keyboard.h"
13
+
14
+/**
15
+ * Constructor for the keyboard class
16
+ *
17
+ * @param parent Parent object
18
+ */
19
+Keyboard::Keyboard(QObject *parent) : QObject(parent)
20
+{
21
+	this->reset();
22
+}
23
+
24
+//! Reset the keyboard buffer
25
+void Keyboard::reset()
26
+{
27
+	this->buffer.clear();
28
+}
29
+
30
+/**
31
+ * Process a key press event
32
+ *
33
+ * @param key Pressed key code
34
+ * @param modifiers Optional modifiers to pressed key
35
+ */
36
+void Keyboard::keyPress(int key, Qt::KeyboardModifiers modifiers)
37
+{
38
+	if((key <= MAX_CODE) && (key >= MIN_CODE))
39
+	{
40
+		unsigned char keyCode = static_cast<unsigned char>(key);
41
+
42
+		if((key >= 'A') && (key <= 'Z'))
43
+		{
44
+			if(!(modifiers & Qt::ShiftModifier))
45
+			{
46
+				keyCode += ('a' - 'A');
47
+			}
48
+		}
49
+
50
+		if(modifiers & Qt::ControlModifier)
51
+		{
52
+			keyCode |= CTRL_MASK;
53
+		}
54
+
55
+		this->buffer.append(keyCode);
56
+	}
57
+	else
58
+	{
59
+		switch(key)
60
+		{
61
+			case Qt::Key_Escape :
62
+				this->buffer.append(KEY_ESC);
63
+				break;
64
+
65
+			case Qt::Key_Backspace :
66
+				this->buffer.append(KEY_BACKSPACE);
67
+				break;
68
+
69
+			case Qt::Key_Tab :
70
+				this->buffer.append(KEY_TAB);
71
+				break;
72
+
73
+			case Qt::Key_Return :
74
+				this->buffer.append(KEY_ENTER);
75
+				break;
76
+
77
+			case Qt::Key_Delete :
78
+				this->buffer.append(KEY_DELETE);
79
+				break;
80
+
81
+			case Qt::Key_Up :
82
+				this->buffer.append(KEY_UP);
83
+				break;
84
+
85
+			case Qt::Key_Down :
86
+				this->buffer.append(KEY_DOWN);
87
+				break;
88
+
89
+			case Qt::Key_Left :
90
+				this->buffer.append(KEY_LEFT);
91
+				break;
92
+
93
+			case Qt::Key_Right :
94
+				this->buffer.append(KEY_RIGHT);
95
+				break;
96
+		}
97
+	}
98
+
99
+	if(this->buffer.length() > 0)
100
+	{
101
+		emit dataReadySignal(true);
102
+	}
103
+}
104
+
105
+/**
106
+ * Read next a char from input buffer
107
+ *
108
+ * @return Next char from the input buffer
109
+ */
110
+unsigned char Keyboard::getKey()
111
+{
112
+	if(this->buffer.length() > 0)
113
+	{
114
+		unsigned char key = this->buffer.takeFirst();
115
+
116
+		if(this->buffer.length() == 0)
117
+		{
118
+			emit dataReadySignal(false);
119
+		}
120
+
121
+		return(key);
122
+	}
123
+
124
+	emit dataReadySignal(false);
125
+
126
+	return(0);
127
+}