MPU6050のサンプルプログラム2

Dependencies:   ConfigFile SDFileSystem mbed

Fork of LAURUS_program by LAURUS

Committer:
taurin
Date:
Mon Dec 07 02:11:56 2015 +0000
Revision:
36:94dc027e05cd
Parent:
6:2b68f85a984a
MPU?HMC??????ver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
onaka 6:2b68f85a984a 1
onaka 6:2b68f85a984a 2 /**
onaka 6:2b68f85a984a 3 * @file Buffer.h
onaka 6:2b68f85a984a 4 * @brief Software Buffer - Templated Ring Buffer for most data types
onaka 6:2b68f85a984a 5 * @author sam grove
onaka 6:2b68f85a984a 6 * @version 1.0
onaka 6:2b68f85a984a 7 * @see
onaka 6:2b68f85a984a 8 *
onaka 6:2b68f85a984a 9 * Copyright (c) 2013
onaka 6:2b68f85a984a 10 *
onaka 6:2b68f85a984a 11 * Licensed under the Apache License, Version 2.0 (the "License");
onaka 6:2b68f85a984a 12 * you may not use this file except in compliance with the License.
onaka 6:2b68f85a984a 13 * You may obtain a copy of the License at
onaka 6:2b68f85a984a 14 *
onaka 6:2b68f85a984a 15 * http://www.apache.org/licenses/LICENSE-2.0
onaka 6:2b68f85a984a 16 *
onaka 6:2b68f85a984a 17 * Unless required by applicable law or agreed to in writing, software
onaka 6:2b68f85a984a 18 * distributed under the License is distributed on an "AS IS" BASIS,
onaka 6:2b68f85a984a 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
onaka 6:2b68f85a984a 20 * See the License for the specific language governing permissions and
onaka 6:2b68f85a984a 21 * limitations under the License.
onaka 6:2b68f85a984a 22 */
onaka 6:2b68f85a984a 23
onaka 6:2b68f85a984a 24 #ifndef BUFFER_H
onaka 6:2b68f85a984a 25 #define BUFFER_H
onaka 6:2b68f85a984a 26
onaka 6:2b68f85a984a 27 #include <stdint.h>
onaka 6:2b68f85a984a 28 #include <string.h>
onaka 6:2b68f85a984a 29
onaka 6:2b68f85a984a 30 /** A templated software ring buffer
onaka 6:2b68f85a984a 31 *
onaka 6:2b68f85a984a 32 * Example:
onaka 6:2b68f85a984a 33 * @code
onaka 6:2b68f85a984a 34 * #include "mbed.h"
onaka 6:2b68f85a984a 35 * #include "Buffer.h"
onaka 6:2b68f85a984a 36 *
onaka 6:2b68f85a984a 37 * Buffer <char> buf;
onaka 6:2b68f85a984a 38 *
onaka 6:2b68f85a984a 39 * int main()
onaka 6:2b68f85a984a 40 * {
onaka 6:2b68f85a984a 41 * buf = 'a';
onaka 6:2b68f85a984a 42 * buf.put('b');
onaka 6:2b68f85a984a 43 * char *head = buf.head();
onaka 6:2b68f85a984a 44 * puts(head);
onaka 6:2b68f85a984a 45 *
onaka 6:2b68f85a984a 46 * char whats_in_there[2] = {0};
onaka 6:2b68f85a984a 47 * int pos = 0;
onaka 6:2b68f85a984a 48 *
onaka 6:2b68f85a984a 49 * while(buf.available())
onaka 6:2b68f85a984a 50 * {
onaka 6:2b68f85a984a 51 * whats_in_there[pos++] = buf;
onaka 6:2b68f85a984a 52 * }
onaka 6:2b68f85a984a 53 * printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
onaka 6:2b68f85a984a 54 * buf.clear();
onaka 6:2b68f85a984a 55 * error("done\n\n\n");
onaka 6:2b68f85a984a 56 * }
onaka 6:2b68f85a984a 57 * @endcode
onaka 6:2b68f85a984a 58 */
onaka 6:2b68f85a984a 59
onaka 6:2b68f85a984a 60 template <typename T>
onaka 6:2b68f85a984a 61 class Buffer
onaka 6:2b68f85a984a 62 {
onaka 6:2b68f85a984a 63 private:
onaka 6:2b68f85a984a 64 T *_buf;
onaka 6:2b68f85a984a 65 volatile uint32_t _wloc;
onaka 6:2b68f85a984a 66 volatile uint32_t _rloc;
onaka 6:2b68f85a984a 67 uint32_t _size;
onaka 6:2b68f85a984a 68
onaka 6:2b68f85a984a 69 public:
onaka 6:2b68f85a984a 70 /** Create a Buffer and allocate memory for it
onaka 6:2b68f85a984a 71 * @param size The size of the buffer
onaka 6:2b68f85a984a 72 */
onaka 6:2b68f85a984a 73 Buffer(uint32_t size = 0x100);
onaka 6:2b68f85a984a 74
onaka 6:2b68f85a984a 75 /** Get the size of the ring buffer
onaka 6:2b68f85a984a 76 * @return the size of the ring buffer
onaka 6:2b68f85a984a 77 */
onaka 6:2b68f85a984a 78 uint32_t getSize();
onaka 6:2b68f85a984a 79
onaka 6:2b68f85a984a 80 /** Destry a Buffer and release it's allocated memory
onaka 6:2b68f85a984a 81 */
onaka 6:2b68f85a984a 82 ~Buffer();
onaka 6:2b68f85a984a 83
onaka 6:2b68f85a984a 84 /** Add a data element into the buffer
onaka 6:2b68f85a984a 85 * @param data Something to add to the buffer
onaka 6:2b68f85a984a 86 */
onaka 6:2b68f85a984a 87 void put(T data);
onaka 6:2b68f85a984a 88
onaka 6:2b68f85a984a 89 /** Remove a data element from the buffer
onaka 6:2b68f85a984a 90 * @return Pull the oldest element from the buffer
onaka 6:2b68f85a984a 91 */
onaka 6:2b68f85a984a 92 T get(void);
onaka 6:2b68f85a984a 93
onaka 6:2b68f85a984a 94 /** Get the address to the head of the buffer
onaka 6:2b68f85a984a 95 * @return The address of element 0 in the buffer
onaka 6:2b68f85a984a 96 */
onaka 6:2b68f85a984a 97 T *head(void);
onaka 6:2b68f85a984a 98
onaka 6:2b68f85a984a 99 /** Reset the buffer to 0. Useful if using head() to parse packeted data
onaka 6:2b68f85a984a 100 */
onaka 6:2b68f85a984a 101 void clear(void);
onaka 6:2b68f85a984a 102
onaka 6:2b68f85a984a 103 /** Determine if anything is readable in the buffer
onaka 6:2b68f85a984a 104 * @return 1 if something can be read, 0 otherwise
onaka 6:2b68f85a984a 105 */
onaka 6:2b68f85a984a 106 uint32_t available(void);
onaka 6:2b68f85a984a 107
onaka 6:2b68f85a984a 108 /** Overloaded operator for writing to the buffer
onaka 6:2b68f85a984a 109 * @param data Something to put in the buffer
onaka 6:2b68f85a984a 110 * @return
onaka 6:2b68f85a984a 111 */
onaka 6:2b68f85a984a 112 Buffer &operator= (T data)
onaka 6:2b68f85a984a 113 {
onaka 6:2b68f85a984a 114 put(data);
onaka 6:2b68f85a984a 115 return *this;
onaka 6:2b68f85a984a 116 }
onaka 6:2b68f85a984a 117
onaka 6:2b68f85a984a 118 /** Overloaded operator for reading from the buffer
onaka 6:2b68f85a984a 119 * @return Pull the oldest element from the buffer
onaka 6:2b68f85a984a 120 */
onaka 6:2b68f85a984a 121 operator int(void)
onaka 6:2b68f85a984a 122 {
onaka 6:2b68f85a984a 123 return get();
onaka 6:2b68f85a984a 124 }
onaka 6:2b68f85a984a 125
onaka 6:2b68f85a984a 126 uint32_t peek(char c);
onaka 6:2b68f85a984a 127
onaka 6:2b68f85a984a 128 };
onaka 6:2b68f85a984a 129
onaka 6:2b68f85a984a 130 template <class T>
onaka 6:2b68f85a984a 131 inline void Buffer<T>::put(T data)
onaka 6:2b68f85a984a 132 {
onaka 6:2b68f85a984a 133 _buf[_wloc++] = data;
onaka 6:2b68f85a984a 134 _wloc %= (_size-1);
onaka 6:2b68f85a984a 135 if(_wloc==_rloc){
onaka 6:2b68f85a984a 136 _rloc++;
onaka 6:2b68f85a984a 137 _rloc %= (_size-1);
onaka 6:2b68f85a984a 138 }
onaka 6:2b68f85a984a 139
onaka 6:2b68f85a984a 140 return;
onaka 6:2b68f85a984a 141 }
onaka 6:2b68f85a984a 142
onaka 6:2b68f85a984a 143 template <class T>
onaka 6:2b68f85a984a 144 inline T Buffer<T>::get(void)
onaka 6:2b68f85a984a 145 {
onaka 6:2b68f85a984a 146 T data_pos = _buf[_rloc++];
onaka 6:2b68f85a984a 147 _rloc %= (_size-1);
onaka 6:2b68f85a984a 148
onaka 6:2b68f85a984a 149 return data_pos;
onaka 6:2b68f85a984a 150 }
onaka 6:2b68f85a984a 151
onaka 6:2b68f85a984a 152 template <class T>
onaka 6:2b68f85a984a 153 inline T *Buffer<T>::head(void)
onaka 6:2b68f85a984a 154 {
onaka 6:2b68f85a984a 155 T *data_pos = &_buf[0];
onaka 6:2b68f85a984a 156
onaka 6:2b68f85a984a 157 return data_pos;
onaka 6:2b68f85a984a 158 }
onaka 6:2b68f85a984a 159
onaka 6:2b68f85a984a 160 template <class T>
onaka 6:2b68f85a984a 161 inline uint32_t Buffer<T>::available(void)
onaka 6:2b68f85a984a 162 {
onaka 6:2b68f85a984a 163 return (_wloc == _rloc) ? 0 : 1;
onaka 6:2b68f85a984a 164 }
onaka 6:2b68f85a984a 165
onaka 6:2b68f85a984a 166 #endif
onaka 6:2b68f85a984a 167