Skip to content
This repository was archived by the owner on Aug 19, 2023. It is now read-only.

Commit eb06534

Browse files
committed
Completed Terminal.ino example; Added more class descriptions; Added Task::parent field; Added Task::getTerminal() and Task::getStream()
1 parent bc4103a commit eb06534

File tree

6 files changed

+96
-28
lines changed

6 files changed

+96
-28
lines changed

Arduino/libraries/Nexus_OS/Nexus_OS/Nexus_Message.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,24 @@
44

55
namespace Nexus {
66

7+
/**
8+
9+
Proviedes run time type information , used by messages and events
10+
11+
*/
12+
713
template<typename Type>
814
struct TypeInfo {
915

1016
static void *GetType() { return reinterpret_cast<void *>(&GetType); }
1117

1218
};
19+
20+
/**
21+
22+
An encapsulated option data type, passed to tasks via messages
23+
24+
*/
1325

1426
class Event {
1527

@@ -26,6 +38,12 @@ namespace Nexus {
2638

2739
};
2840

41+
/*
42+
43+
Used to synchronously send data between tasks or the scheduler
44+
45+
*/
46+
2947
class Message {
3048

3149
public:

Arduino/libraries/Nexus_OS/Nexus_OS/Nexus_Scheduler.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ namespace Nexus {
2424
_coros = coro;
2525
}
2626

27-
void addTask(Task *task)
27+
void addTask(Task *task, Task *parent = NULL)
2828
{
29+
task->_parent = parent;
2930
task->_next = _tasks;
3031

3132
_tasks = task;

Arduino/libraries/Nexus_OS/Nexus_OS/Nexus_Task.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,19 @@ namespace Nexus {
1111
Scheduler.send(*this, message);
1212
}
1313

14+
Terminal *Task::getTerminal()
15+
{
16+
for (Task *task = Scheduler.getTasks(); task != NULL; task = task->getParent())
17+
{
18+
if (task->getParent() == NULL) return static_cast<Terminal *>(task);
19+
}
20+
21+
return NULL;
22+
}
23+
24+
Stream& Task::getStream()
25+
{
26+
return getTerminal()->getStream();
27+
}
28+
1429
}

Arduino/libraries/Nexus_OS/Nexus_OS/Nexus_Task.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
#define __Nexus_Task__
77

88
#include <Arduino.h>
9-
#include <limits.h>
9+
#include <stdint.h>
10+
11+
#ifndef INT32_MAX
12+
#define INT32_MAX 0x7FFFFFFF
13+
#endif
1014

1115
#define MERGE_LINE(line) label_##line
1216
#define LABEL_LINE(line) MERGE_LINE(line)
@@ -18,7 +22,7 @@
1822
#define task_enter coro_enter
1923
#define task_sleep(msecs) _timeout = millis() + msecs; _sleep = true; coro_yield()
2024
#define task_yield() _timeout = 0; _sleep = false; coro_yield()
21-
#define task_wait() _timeout = LONG_MAX; _sleep = false; coro_yield()
25+
#define task_wait() _timeout = INT32_MAX; _sleep = false; coro_yield()
2226
#define task_wait4(msecs) _timeout = millis() + msecs; _sleep = false; coro_yield()
2327
#define task_exit coro_exit
2428

@@ -48,6 +52,7 @@ namespace Nexus {
4852

4953
void *_context;
5054
Coro *_next;
55+
Coro *_parent;
5156

5257
};
5358

@@ -73,6 +78,8 @@ namespace Nexus {
7378
7479
*/
7580

81+
class Terminal;
82+
7683
class Task : public Coro {
7784

7885
public:
@@ -85,7 +92,11 @@ namespace Nexus {
8592

8693
void send(const Message& message);
8794

88-
Task* getNext() { return static_cast<Task*>(Coro::getNext()); }
95+
Task* getNext() { return static_cast<Task *>(Coro::getNext()); }
96+
Task* getParent() { return static_cast<Task *>(Coro::getNext()); }
97+
98+
Terminal *getTerminal();
99+
Stream& getStream();
89100

90101
protected:
91102

Arduino/libraries/Nexus_OS/Nexus_OS/Nexus_Terminal.h

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ namespace Nexus {
1616

1717
enum Key
1818
{
19-
None = 256, KeyEnter, KeyDelete, KeyEscape,
20-
KeyUp, KeyDown, KeyLeft, KeyRight
19+
KeyEnter = 10, KeyDelete = 8, KeyEscape = 27,
20+
KeyUp = 30, KeyDown = 31, KeyLeft = 28, KeyRight = 29
2121
};
2222

23-
KeyEvent(int key = None) : key(key) { }
23+
KeyEvent(int key = 0) : key(key) { }
2424

2525
int key;
2626

@@ -31,36 +31,47 @@ namespace Nexus {
3131
public:
3232

3333
Terminal(Stream& stream) : Task(&TaskHelper<Terminal>::run, F("Terminal")),
34-
_stream(stream)
34+
_stream(stream), _task(NULL)
3535
{ }
3636

37+
void setForegroundTask(Task *foregroundTask)
38+
{
39+
_task = foregroundTask;
40+
}
41+
42+
Stream& getStream() { return _stream; }
43+
3744
void run(const Message& message)
3845
{
39-
//StreamEvent streamEvent;
46+
int c, key;
4047

4148
task_enter;
4249

4350
for (;;)
4451
{
45-
int key;
46-
4752
task_wait();
4853

49-
int c = _stream.read();
54+
c = _stream.read();
55+
56+
if (c == 13) continue;
5057

58+
if (c == 10)
59+
{
60+
key = KeyEvent::KeyEnter;
61+
}
5162
if (c == 27)
5263
{
5364
task_wait4(10);
5465

5566
if (message.get<StreamEvent>())
5667
{
57-
int c = _stream.read();
68+
c = _stream.read();
5869

5970
if (c == '[')
6071
{
6172
task_wait();
6273

63-
int c = _stream.read();
74+
c = _stream.read();
6475

6576
switch (c)
6677
{
@@ -75,8 +86,7 @@ namespace Nexus {
7586
}
7687
else key = c;
7788

78-
Serial.println(key);
79-
Message(KeyEvent(key));
89+
if (_task) _task->send(Message(KeyEvent(key)));
8090
}
8191

8292
task_exit;

Arduino/libraries/Nexus_OS/examples/Terminal/Terminal.ino

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66

77
using namespace Nexus;
88

9-
class Blink : public Task {
9+
class Client : public Task {
1010

1111
public:
1212

13-
Blink() : Task(&TaskHelper<Blink>::run, F("Blink")) { }
13+
Client() : Task(&TaskHelper<Client>::run, F("Client")) { }
1414

1515
void run(const Message& message)
1616
{
17+
KeyEvent keyEvent;
18+
1719
task_enter;
1820

1921
pinMode(13, OUTPUT);
@@ -22,43 +24,54 @@ class Blink : public Task {
2224
{
2325
task_wait();
2426

27+
if (keyEvent = message.get<KeyEvent>())
28+
{
29+
switch (keyEvent.key)
30+
{
31+
case KeyEvent::KeyEscape: getStream().print(F("<ESC>")); break;
32+
case KeyEvent::KeyUp: getStream().print(F("<UP>")); break;
33+
case KeyEvent::KeyDown: getStream().print(F("<DOWN>")); break;
34+
case KeyEvent::KeyLeft: getStream().print(F("<LEFT>")); break;
35+
case KeyEvent::KeyRight: getStream().print(F("<RIGHT>")); break;
36+
default: getStream().print((char)keyEvent.key);
37+
}
38+
}
2539
}
2640

2741
task_exit;
2842
}
2943

30-
private:
31-
32-
uint8_t i;
33-
3444
};
3545

36-
Terminal terminal(Serial);
37-
//Blink blink;
46+
Terminal console(Serial);
3847

3948
namespace {
4049

4150
void stream(Coro& coro, const Message& message)
4251
{
4352
if (Serial.available() > 0)
4453
{
45-
terminal.send(Message(StreamEvent(Serial)));
54+
console.send(Message(StreamEvent(Serial)));
4655
}
4756
}
4857

4958
}
5059

5160
Coro messenger = Coro(&stream);
61+
Client client = Client();
5262

5363
void setup()
5464
{
5565
Serial.begin(9600);
5666

57-
Serial.println("Arduino OS 0.1 | 2015 Mike Austin");
67+
Serial.println(F("Type. And try the arrow keys and escape."));
5868

5969
Scheduler.addCoro(&messenger);
60-
//Scheduler.addTask(&blink);
61-
Scheduler.addTask(&terminal);
70+
71+
Scheduler.addTask(&console, NULL);
72+
Scheduler.addTask(&client, &console);
73+
74+
console.setForegroundTask(&client);
6275
}
6376

6477
void loop()

0 commit comments

Comments
 (0)