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

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Bigcheese
Date:
Sun Mar 02 06:33:08 2014 +0000
Revision:
3:f151d08d335c
Parent:
2:1df0b61d3b5a
Bunch of stuff. Need to locally merge in updated USB changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 #ifndef _HEAPRING_H
Michael J. Spencer 2:1df0b61d3b5a 2 #define _HEAPRING_H
Michael J. Spencer 2:1df0b61d3b5a 3
Michael J. Spencer 2:1df0b61d3b5a 4 template<class kind> class HeapRing {
Michael J. Spencer 2:1df0b61d3b5a 5
Michael J. Spencer 2:1df0b61d3b5a 6 // smoothie-specific friend classes
Michael J. Spencer 2:1df0b61d3b5a 7 friend class Planner;
Michael J. Spencer 2:1df0b61d3b5a 8 friend class Conveyor;
Michael J. Spencer 2:1df0b61d3b5a 9 friend class Block;
Michael J. Spencer 2:1df0b61d3b5a 10
Michael J. Spencer 2:1df0b61d3b5a 11 public:
Michael J. Spencer 2:1df0b61d3b5a 12 HeapRing();
Michael J. Spencer 2:1df0b61d3b5a 13 HeapRing(unsigned int length);
Michael J. Spencer 2:1df0b61d3b5a 14
Michael J. Spencer 2:1df0b61d3b5a 15 ~HeapRing();
Michael J. Spencer 2:1df0b61d3b5a 16
Michael J. Spencer 2:1df0b61d3b5a 17 /*
Michael J. Spencer 2:1df0b61d3b5a 18 * direct accessors
Michael J. Spencer 2:1df0b61d3b5a 19 */
Michael J. Spencer 2:1df0b61d3b5a 20 kind& head();
Michael J. Spencer 2:1df0b61d3b5a 21 kind& tail();
Michael J. Spencer 2:1df0b61d3b5a 22
Michael J. Spencer 2:1df0b61d3b5a 23 void push_front(kind&) __attribute__ ((warning("Not thread-safe if pop_back() is used in ISR context!"))); // instead, prepare(head_ref()); produce_head();
Michael J. Spencer 2:1df0b61d3b5a 24 kind& pop_back(void) __attribute__ ((warning("Not thread-safe if head_ref() is used to prepare new items, or push_front() is used in ISR context!"))); // instead, consume(tail_ref()); consume_tail();
Michael J. Spencer 2:1df0b61d3b5a 25
Michael J. Spencer 2:1df0b61d3b5a 26 /*
Michael J. Spencer 2:1df0b61d3b5a 27 * pointer accessors
Michael J. Spencer 2:1df0b61d3b5a 28 */
Michael J. Spencer 2:1df0b61d3b5a 29 kind* head_ref();
Michael J. Spencer 2:1df0b61d3b5a 30 kind* tail_ref();
Michael J. Spencer 2:1df0b61d3b5a 31
Michael J. Spencer 2:1df0b61d3b5a 32 void produce_head(void);
Michael J. Spencer 2:1df0b61d3b5a 33 void consume_tail(void);
Michael J. Spencer 2:1df0b61d3b5a 34
Michael J. Spencer 2:1df0b61d3b5a 35 /*
Michael J. Spencer 2:1df0b61d3b5a 36 * queue status
Michael J. Spencer 2:1df0b61d3b5a 37 */
Michael J. Spencer 2:1df0b61d3b5a 38 bool is_empty(void);
Michael J. Spencer 2:1df0b61d3b5a 39 bool is_full(void);
Michael J. Spencer 2:1df0b61d3b5a 40
Michael J. Spencer 2:1df0b61d3b5a 41 /*
Michael J. Spencer 2:1df0b61d3b5a 42 * resize
Michael J. Spencer 2:1df0b61d3b5a 43 *
Michael J. Spencer 2:1df0b61d3b5a 44 * returns true on success, or false if queue is not empty or not enough memory available
Michael J. Spencer 2:1df0b61d3b5a 45 */
Michael J. Spencer 2:1df0b61d3b5a 46 bool resize(unsigned int);
Michael J. Spencer 2:1df0b61d3b5a 47
Michael J. Spencer 2:1df0b61d3b5a 48 /*
Michael J. Spencer 2:1df0b61d3b5a 49 * provide
Michael J. Spencer 2:1df0b61d3b5a 50 * kind* - new buffer pointer
Michael J. Spencer 2:1df0b61d3b5a 51 * int length - number of items in buffer (NOT size in bytes!)
Michael J. Spencer 2:1df0b61d3b5a 52 *
Michael J. Spencer 2:1df0b61d3b5a 53 * cause HeapRing to use a specific memory location instead of allocating its own
Michael J. Spencer 2:1df0b61d3b5a 54 *
Michael J. Spencer 2:1df0b61d3b5a 55 * returns true on success, or false if queue is not empty
Michael J. Spencer 2:1df0b61d3b5a 56 */
Michael J. Spencer 2:1df0b61d3b5a 57 bool provide(kind*, unsigned int length);
Michael J. Spencer 2:1df0b61d3b5a 58
Michael J. Spencer 2:1df0b61d3b5a 59 protected:
Michael J. Spencer 2:1df0b61d3b5a 60 /*
Michael J. Spencer 2:1df0b61d3b5a 61 * these functions are protected as they should only be used internally
Michael J. Spencer 2:1df0b61d3b5a 62 * or in extremely specific circumstances
Michael J. Spencer 2:1df0b61d3b5a 63 */
Michael J. Spencer 2:1df0b61d3b5a 64 kind& item(unsigned int);
Michael J. Spencer 2:1df0b61d3b5a 65 kind* item_ref(unsigned int);
Michael J. Spencer 2:1df0b61d3b5a 66
Michael J. Spencer 2:1df0b61d3b5a 67 unsigned int next(unsigned int);
Michael J. Spencer 2:1df0b61d3b5a 68 unsigned int prev(unsigned int);
Michael J. Spencer 2:1df0b61d3b5a 69
Michael J. Spencer 2:1df0b61d3b5a 70 /*
Michael J. Spencer 2:1df0b61d3b5a 71 * buffer variables
Michael J. Spencer 2:1df0b61d3b5a 72 */
Michael J. Spencer 2:1df0b61d3b5a 73 unsigned int length;
Michael J. Spencer 2:1df0b61d3b5a 74
Michael J. Spencer 2:1df0b61d3b5a 75 volatile unsigned int head_i;
Michael J. Spencer 2:1df0b61d3b5a 76 volatile unsigned int tail_i;
Michael J. Spencer 2:1df0b61d3b5a 77
Michael J. Spencer 2:1df0b61d3b5a 78 private:
Michael J. Spencer 2:1df0b61d3b5a 79 kind* ring;
Michael J. Spencer 2:1df0b61d3b5a 80 };
Michael J. Spencer 2:1df0b61d3b5a 81
Michael J. Spencer 2:1df0b61d3b5a 82 #endif /* _HEAPRING_H */