Fork of Smoothie to port to mbed non-LPC targets.
Fork of Smoothie by
libs/Network/uip/CommandQueue.cpp@2:1df0b61d3b5a, 2014-02-28 (annotated)
- Committer:
- Michael J. Spencer
- Date:
- Fri Feb 28 18:52:52 2014 -0800
- Revision:
- 2:1df0b61d3b5a
Update to latest Smoothie.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Michael J. Spencer |
2:1df0b61d3b5a | 1 | #include "CommandQueue.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 2 | |
Michael J. Spencer |
2:1df0b61d3b5a | 3 | #include "stdio.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 4 | #include "string.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 5 | #include "stdlib.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 6 | |
Michael J. Spencer |
2:1df0b61d3b5a | 7 | #include "Kernel.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 8 | #include "libs/SerialMessage.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 9 | #include "CallbackStream.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 10 | |
Michael J. Spencer |
2:1df0b61d3b5a | 11 | static CommandQueue *command_queue_instance; |
Michael J. Spencer |
2:1df0b61d3b5a | 12 | CommandQueue *CommandQueue::instance = NULL; |
Michael J. Spencer |
2:1df0b61d3b5a | 13 | |
Michael J. Spencer |
2:1df0b61d3b5a | 14 | |
Michael J. Spencer |
2:1df0b61d3b5a | 15 | CommandQueue::CommandQueue() |
Michael J. Spencer |
2:1df0b61d3b5a | 16 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 17 | command_queue_instance = this; |
Michael J. Spencer |
2:1df0b61d3b5a | 18 | null_stream= &(StreamOutput::NullStream); |
Michael J. Spencer |
2:1df0b61d3b5a | 19 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 20 | |
Michael J. Spencer |
2:1df0b61d3b5a | 21 | CommandQueue* CommandQueue::getInstance() |
Michael J. Spencer |
2:1df0b61d3b5a | 22 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 23 | if(instance == 0) instance= new CommandQueue(); |
Michael J. Spencer |
2:1df0b61d3b5a | 24 | return instance; |
Michael J. Spencer |
2:1df0b61d3b5a | 25 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 26 | |
Michael J. Spencer |
2:1df0b61d3b5a | 27 | extern "C" { |
Michael J. Spencer |
2:1df0b61d3b5a | 28 | int network_add_command(const char *cmd, void *pstream) |
Michael J. Spencer |
2:1df0b61d3b5a | 29 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 30 | return command_queue_instance->add(cmd, (StreamOutput*)pstream); |
Michael J. Spencer |
2:1df0b61d3b5a | 31 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 32 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 33 | |
Michael J. Spencer |
2:1df0b61d3b5a | 34 | int CommandQueue::add(const char *cmd, StreamOutput *pstream) |
Michael J. Spencer |
2:1df0b61d3b5a | 35 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 36 | cmd_t c= {strdup(cmd), pstream==NULL?null_stream:pstream}; |
Michael J. Spencer |
2:1df0b61d3b5a | 37 | q.push(c); |
Michael J. Spencer |
2:1df0b61d3b5a | 38 | if(pstream != NULL) { |
Michael J. Spencer |
2:1df0b61d3b5a | 39 | // count how many times this is on the queue |
Michael J. Spencer |
2:1df0b61d3b5a | 40 | CallbackStream *s= static_cast<CallbackStream *>(pstream); |
Michael J. Spencer |
2:1df0b61d3b5a | 41 | s->inc(); |
Michael J. Spencer |
2:1df0b61d3b5a | 42 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 43 | return q.size(); |
Michael J. Spencer |
2:1df0b61d3b5a | 44 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 45 | |
Michael J. Spencer |
2:1df0b61d3b5a | 46 | // pops the next command off the queue and submits it. |
Michael J. Spencer |
2:1df0b61d3b5a | 47 | bool CommandQueue::pop() |
Michael J. Spencer |
2:1df0b61d3b5a | 48 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 49 | if (q.size() == 0) return false; |
Michael J. Spencer |
2:1df0b61d3b5a | 50 | |
Michael J. Spencer |
2:1df0b61d3b5a | 51 | cmd_t c= q.pop(); |
Michael J. Spencer |
2:1df0b61d3b5a | 52 | char *cmd= c.str; |
Michael J. Spencer |
2:1df0b61d3b5a | 53 | |
Michael J. Spencer |
2:1df0b61d3b5a | 54 | struct SerialMessage message; |
Michael J. Spencer |
2:1df0b61d3b5a | 55 | message.message = cmd; |
Michael J. Spencer |
2:1df0b61d3b5a | 56 | message.stream = c.pstream; |
Michael J. Spencer |
2:1df0b61d3b5a | 57 | |
Michael J. Spencer |
2:1df0b61d3b5a | 58 | free(cmd); |
Michael J. Spencer |
2:1df0b61d3b5a | 59 | THEKERNEL->call_event(ON_CONSOLE_LINE_RECEIVED, &message ); |
Michael J. Spencer |
2:1df0b61d3b5a | 60 | |
Michael J. Spencer |
2:1df0b61d3b5a | 61 | if(message.stream != null_stream) { |
Michael J. Spencer |
2:1df0b61d3b5a | 62 | message.stream->puts(NULL); // indicates command is done |
Michael J. Spencer |
2:1df0b61d3b5a | 63 | // decrement usage count |
Michael J. Spencer |
2:1df0b61d3b5a | 64 | CallbackStream *s= static_cast<CallbackStream *>(message.stream); |
Michael J. Spencer |
2:1df0b61d3b5a | 65 | s->dec(); |
Michael J. Spencer |
2:1df0b61d3b5a | 66 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 67 | return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 68 | } |