Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

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?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 #include "CallbackStream.h"
Michael J. Spencer 2:1df0b61d3b5a 2 #include "Kernel.h"
Michael J. Spencer 2:1df0b61d3b5a 3
Michael J. Spencer 2:1df0b61d3b5a 4 #define DEBUG_PRINTF std::printf
Michael J. Spencer 2:1df0b61d3b5a 5
Michael J. Spencer 2:1df0b61d3b5a 6 CallbackStream::CallbackStream(cb_t cb, void *u)
Michael J. Spencer 2:1df0b61d3b5a 7 {
Michael J. Spencer 2:1df0b61d3b5a 8 DEBUG_PRINTF("Callbackstream ctor: %p\n", this);
Michael J. Spencer 2:1df0b61d3b5a 9 callback= cb;
Michael J. Spencer 2:1df0b61d3b5a 10 user= u;
Michael J. Spencer 2:1df0b61d3b5a 11 closed= false;
Michael J. Spencer 2:1df0b61d3b5a 12 use_count= 0;
Michael J. Spencer 2:1df0b61d3b5a 13 }
Michael J. Spencer 2:1df0b61d3b5a 14
Michael J. Spencer 2:1df0b61d3b5a 15 CallbackStream::~CallbackStream()
Michael J. Spencer 2:1df0b61d3b5a 16 {
Michael J. Spencer 2:1df0b61d3b5a 17 DEBUG_PRINTF("Callbackstream dtor: %p\n", this);
Michael J. Spencer 2:1df0b61d3b5a 18 }
Michael J. Spencer 2:1df0b61d3b5a 19
Michael J. Spencer 2:1df0b61d3b5a 20 int CallbackStream::puts(const char *s)
Michael J. Spencer 2:1df0b61d3b5a 21 {
Michael J. Spencer 2:1df0b61d3b5a 22 if(closed) return 0;
Michael J. Spencer 2:1df0b61d3b5a 23
Michael J. Spencer 2:1df0b61d3b5a 24 if(s == NULL) return (*callback)(NULL, user);
Michael J. Spencer 2:1df0b61d3b5a 25
Michael J. Spencer 2:1df0b61d3b5a 26 int len = strlen(s);
Michael J. Spencer 2:1df0b61d3b5a 27 int n;
Michael J. Spencer 2:1df0b61d3b5a 28 do {
Michael J. Spencer 2:1df0b61d3b5a 29 // call this streams result callback
Michael J. Spencer 2:1df0b61d3b5a 30 n= (*callback)(s, user);
Michael J. Spencer 2:1df0b61d3b5a 31
Michael J. Spencer 2:1df0b61d3b5a 32 // if closed just pretend we sent it
Michael J. Spencer 2:1df0b61d3b5a 33 if(n == -1) {
Michael J. Spencer 2:1df0b61d3b5a 34 closed= true;
Michael J. Spencer 2:1df0b61d3b5a 35 return len;
Michael J. Spencer 2:1df0b61d3b5a 36
Michael J. Spencer 2:1df0b61d3b5a 37 }else if(n == 0) {
Michael J. Spencer 2:1df0b61d3b5a 38 // if output queue is full
Michael J. Spencer 2:1df0b61d3b5a 39 // call idle until we can output more
Michael J. Spencer 2:1df0b61d3b5a 40 THEKERNEL->call_event(ON_IDLE);
Michael J. Spencer 2:1df0b61d3b5a 41 }
Michael J. Spencer 2:1df0b61d3b5a 42 } while(n == 0);
Michael J. Spencer 2:1df0b61d3b5a 43
Michael J. Spencer 2:1df0b61d3b5a 44 return len;
Michael J. Spencer 2:1df0b61d3b5a 45 }
Michael J. Spencer 2:1df0b61d3b5a 46
Michael J. Spencer 2:1df0b61d3b5a 47 void CallbackStream::mark_closed()
Michael J. Spencer 2:1df0b61d3b5a 48 {
Michael J. Spencer 2:1df0b61d3b5a 49 closed= true;
Michael J. Spencer 2:1df0b61d3b5a 50 if(use_count <= 0) delete this;
Michael J. Spencer 2:1df0b61d3b5a 51 }
Michael J. Spencer 2:1df0b61d3b5a 52 void CallbackStream::dec()
Michael J. Spencer 2:1df0b61d3b5a 53 {
Michael J. Spencer 2:1df0b61d3b5a 54 use_count--;
Michael J. Spencer 2:1df0b61d3b5a 55 if(closed && use_count <= 0) delete this;
Michael J. Spencer 2:1df0b61d3b5a 56 }
Michael J. Spencer 2:1df0b61d3b5a 57
Michael J. Spencer 2:1df0b61d3b5a 58 extern "C" void *new_callback_stream(cb_t cb, void *u)
Michael J. Spencer 2:1df0b61d3b5a 59 {
Michael J. Spencer 2:1df0b61d3b5a 60 return new CallbackStream(cb, u);
Michael J. Spencer 2:1df0b61d3b5a 61 }
Michael J. Spencer 2:1df0b61d3b5a 62
Michael J. Spencer 2:1df0b61d3b5a 63 extern "C" void delete_callback_stream(void *p)
Michael J. Spencer 2:1df0b61d3b5a 64 {
Michael J. Spencer 2:1df0b61d3b5a 65 // we don't delete it in case it is still on the command queue
Michael J. Spencer 2:1df0b61d3b5a 66 ((CallbackStream*)p)->mark_closed();
Michael J. Spencer 2:1df0b61d3b5a 67 }