Publishing for Biomimetics.
Dependencies: CRC MODDMA MODSERIAL MPU6050IMU PID QEI mbed-rtos mbed-src
packet_parser.h@0:8cfa73bb68e4, 2016-05-31 (annotated)
- Committer:
- abuchan
- Date:
- Tue May 31 17:04:59 2016 +0000
- Revision:
- 0:8cfa73bb68e4
Publishing for Biomimetics.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
abuchan | 0:8cfa73bb68e4 | 1 | #ifndef PACKET_PARSER_H |
abuchan | 0:8cfa73bb68e4 | 2 | #define PACKET_PARSER_H |
abuchan | 0:8cfa73bb68e4 | 3 | |
abuchan | 0:8cfa73bb68e4 | 4 | #include "mbed.h" |
abuchan | 0:8cfa73bb68e4 | 5 | |
abuchan | 0:8cfa73bb68e4 | 6 | #include "MODDMA.h" |
abuchan | 0:8cfa73bb68e4 | 7 | #include "MODSERIAL.h" |
abuchan | 0:8cfa73bb68e4 | 8 | #include "rtos.h" |
abuchan | 0:8cfa73bb68e4 | 9 | #include "lib_crc.h" |
abuchan | 0:8cfa73bb68e4 | 10 | |
abuchan | 0:8cfa73bb68e4 | 11 | #include "protocol.h" |
abuchan | 0:8cfa73bb68e4 | 12 | |
abuchan | 0:8cfa73bb68e4 | 13 | /** |
abuchan | 0:8cfa73bb68e4 | 14 | * Defines the number of packets in the incoming and outgoing buffers. |
abuchan | 0:8cfa73bb68e4 | 15 | */ |
abuchan | 0:8cfa73bb68e4 | 16 | #define PACKET_BUFFER_LENGTH 4 |
abuchan | 0:8cfa73bb68e4 | 17 | |
abuchan | 0:8cfa73bb68e4 | 18 | /** |
abuchan | 0:8cfa73bb68e4 | 19 | * Thread flag to start work. |
abuchan | 0:8cfa73bb68e4 | 20 | */ |
abuchan | 0:8cfa73bb68e4 | 21 | #define START_THREAD_FLAG (1<<0) |
abuchan | 0:8cfa73bb68e4 | 22 | #define DMA_COMPLETE_FLAG (1<<1) |
abuchan | 0:8cfa73bb68e4 | 23 | |
abuchan | 0:8cfa73bb68e4 | 24 | class PacketParser { |
abuchan | 0:8cfa73bb68e4 | 25 | |
abuchan | 0:8cfa73bb68e4 | 26 | public: |
abuchan | 0:8cfa73bb68e4 | 27 | |
abuchan | 0:8cfa73bb68e4 | 28 | /** |
abuchan | 0:8cfa73bb68e4 | 29 | * Constructor. |
abuchan | 0:8cfa73bb68e4 | 30 | * |
abuchan | 0:8cfa73bb68e4 | 31 | * Creates a packet parsing protocol on the USB serial connection. |
abuchan | 0:8cfa73bb68e4 | 32 | * |
abuchan | 0:8cfa73bb68e4 | 33 | */ |
abuchan | 0:8cfa73bb68e4 | 34 | PacketParser(uint32_t baudrate, PinName tx_pin, PinName rx_pin, PinName tx_led, PinName rx_led); |
abuchan | 0:8cfa73bb68e4 | 35 | |
abuchan | 0:8cfa73bb68e4 | 36 | /** |
abuchan | 0:8cfa73bb68e4 | 37 | * Get a pointer to the next received packet, or NULL if there is no packet. |
abuchan | 0:8cfa73bb68e4 | 38 | */ |
abuchan | 0:8cfa73bb68e4 | 39 | packet_union_t* get_received_packet(void); |
abuchan | 0:8cfa73bb68e4 | 40 | |
abuchan | 0:8cfa73bb68e4 | 41 | /** |
abuchan | 0:8cfa73bb68e4 | 42 | * Return a received packet to the packet pool. Must be called after using |
abuchan | 0:8cfa73bb68e4 | 43 | * a packet from get_received_packet. |
abuchan | 0:8cfa73bb68e4 | 44 | * |
abuchan | 0:8cfa73bb68e4 | 45 | * @param packet - pointer to packet to be freed. |
abuchan | 0:8cfa73bb68e4 | 46 | */ |
abuchan | 0:8cfa73bb68e4 | 47 | void free_received_packet(packet_union_t* packet); |
abuchan | 0:8cfa73bb68e4 | 48 | |
abuchan | 0:8cfa73bb68e4 | 49 | /** |
abuchan | 0:8cfa73bb68e4 | 50 | * Get a pointer to a packet to be sent. Will return NULL if there are no |
abuchan | 0:8cfa73bb68e4 | 51 | * available outgoing packets. |
abuchan | 0:8cfa73bb68e4 | 52 | */ |
abuchan | 0:8cfa73bb68e4 | 53 | packet_union_t* get_send_packet(void); |
abuchan | 0:8cfa73bb68e4 | 54 | |
abuchan | 0:8cfa73bb68e4 | 55 | /** |
abuchan | 0:8cfa73bb68e4 | 56 | * Send the packet returned by get_send_packet. |
abuchan | 0:8cfa73bb68e4 | 57 | * |
abuchan | 0:8cfa73bb68e4 | 58 | * @param packet - pointer to packet to be sent. |
abuchan | 0:8cfa73bb68e4 | 59 | */ |
abuchan | 0:8cfa73bb68e4 | 60 | void send_packet(packet_union_t* packet); |
abuchan | 0:8cfa73bb68e4 | 61 | |
abuchan | 0:8cfa73bb68e4 | 62 | private: |
abuchan | 0:8cfa73bb68e4 | 63 | |
abuchan | 0:8cfa73bb68e4 | 64 | MODSERIAL pc_; |
abuchan | 0:8cfa73bb68e4 | 65 | MODDMA dma_; |
abuchan | 0:8cfa73bb68e4 | 66 | |
abuchan | 0:8cfa73bb68e4 | 67 | DigitalOut tx_led_; |
abuchan | 0:8cfa73bb68e4 | 68 | uint32_t tx_sequence_; |
abuchan | 0:8cfa73bb68e4 | 69 | |
abuchan | 0:8cfa73bb68e4 | 70 | Mail<packet_union_t, PACKET_BUFFER_LENGTH> out_box_; |
abuchan | 0:8cfa73bb68e4 | 71 | packet_union_t* out_pkt_; |
abuchan | 0:8cfa73bb68e4 | 72 | |
abuchan | 0:8cfa73bb68e4 | 73 | static void thread_starter(void const *p); |
abuchan | 0:8cfa73bb68e4 | 74 | Thread send_thread_; |
abuchan | 0:8cfa73bb68e4 | 75 | |
abuchan | 0:8cfa73bb68e4 | 76 | void send_worker(void); |
abuchan | 0:8cfa73bb68e4 | 77 | void send_complete(MODSERIAL_IRQ_INFO *q); |
abuchan | 0:8cfa73bb68e4 | 78 | |
abuchan | 0:8cfa73bb68e4 | 79 | DigitalOut rx_led_; |
abuchan | 0:8cfa73bb68e4 | 80 | Mail<packet_union_t, PACKET_BUFFER_LENGTH> in_box_; |
abuchan | 0:8cfa73bb68e4 | 81 | |
abuchan | 0:8cfa73bb68e4 | 82 | packet_union_t* in_pkt_; |
abuchan | 0:8cfa73bb68e4 | 83 | uint32_t in_pkt_idx_; |
abuchan | 0:8cfa73bb68e4 | 84 | uint32_t in_pkt_len_; |
abuchan | 0:8cfa73bb68e4 | 85 | uint8_t in_pkt_crc_; |
abuchan | 0:8cfa73bb68e4 | 86 | |
abuchan | 0:8cfa73bb68e4 | 87 | void receive_callback(MODSERIAL_IRQ_INFO *q); |
abuchan | 0:8cfa73bb68e4 | 88 | }; |
abuchan | 0:8cfa73bb68e4 | 89 | |
abuchan | 0:8cfa73bb68e4 | 90 | #endif |