うおーるぼっとをiPhoneでコントロールするプログラムです。 iPhoneとはBTLEで接続しています。
Dependencies: FatFileSystem HighSpeedAnalogIn TB6612FNG2 mbed
usb/Usb_td.cpp@0:373bcb197dc8, 2013-05-10 (annotated)
- Committer:
- jksoft
- Date:
- Fri May 10 11:48:07 2013 +0000
- Revision:
- 0:373bcb197dc8
?????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jksoft | 0:373bcb197dc8 | 1 | #include "mbed.h" |
jksoft | 0:373bcb197dc8 | 2 | #include "Usb_td.h" |
jksoft | 0:373bcb197dc8 | 3 | //#define __DEBUG |
jksoft | 0:373bcb197dc8 | 4 | #include "mydbg.h" |
jksoft | 0:373bcb197dc8 | 5 | |
jksoft | 0:373bcb197dc8 | 6 | #define __TEST |
jksoft | 0:373bcb197dc8 | 7 | |
jksoft | 0:373bcb197dc8 | 8 | #ifdef __TEST |
jksoft | 0:373bcb197dc8 | 9 | #include <queue> |
jksoft | 0:373bcb197dc8 | 10 | #endif |
jksoft | 0:373bcb197dc8 | 11 | |
jksoft | 0:373bcb197dc8 | 12 | template class tdqueue<HCTD*>; |
jksoft | 0:373bcb197dc8 | 13 | template class tdqueue<HCITD*>; |
jksoft | 0:373bcb197dc8 | 14 | |
jksoft | 0:373bcb197dc8 | 15 | HCTD* td_reverse(HCTD* td) |
jksoft | 0:373bcb197dc8 | 16 | { |
jksoft | 0:373bcb197dc8 | 17 | HCTD* result = NULL; |
jksoft | 0:373bcb197dc8 | 18 | HCTD* next; |
jksoft | 0:373bcb197dc8 | 19 | while(td) { |
jksoft | 0:373bcb197dc8 | 20 | next = (HCTD*)td->Next; |
jksoft | 0:373bcb197dc8 | 21 | td->Next = (uint32_t)result; |
jksoft | 0:373bcb197dc8 | 22 | result = td; |
jksoft | 0:373bcb197dc8 | 23 | td = next; |
jksoft | 0:373bcb197dc8 | 24 | } |
jksoft | 0:373bcb197dc8 | 25 | return result; |
jksoft | 0:373bcb197dc8 | 26 | } |
jksoft | 0:373bcb197dc8 | 27 | |
jksoft | 0:373bcb197dc8 | 28 | template <class T> |
jksoft | 0:373bcb197dc8 | 29 | tdqueue<T>::tdqueue():m_head(NULL),m_tail(NULL) |
jksoft | 0:373bcb197dc8 | 30 | { |
jksoft | 0:373bcb197dc8 | 31 | |
jksoft | 0:373bcb197dc8 | 32 | } |
jksoft | 0:373bcb197dc8 | 33 | |
jksoft | 0:373bcb197dc8 | 34 | template <class T> |
jksoft | 0:373bcb197dc8 | 35 | int tdqueue<T>::size() |
jksoft | 0:373bcb197dc8 | 36 | { |
jksoft | 0:373bcb197dc8 | 37 | int n = 0; |
jksoft | 0:373bcb197dc8 | 38 | T td = m_head; |
jksoft | 0:373bcb197dc8 | 39 | while(td) { |
jksoft | 0:373bcb197dc8 | 40 | td = (T)td->Next; |
jksoft | 0:373bcb197dc8 | 41 | n++; |
jksoft | 0:373bcb197dc8 | 42 | } |
jksoft | 0:373bcb197dc8 | 43 | return n; |
jksoft | 0:373bcb197dc8 | 44 | } |
jksoft | 0:373bcb197dc8 | 45 | |
jksoft | 0:373bcb197dc8 | 46 | template <class T> |
jksoft | 0:373bcb197dc8 | 47 | bool tdqueue<T>::empty() |
jksoft | 0:373bcb197dc8 | 48 | { |
jksoft | 0:373bcb197dc8 | 49 | return (m_head == NULL); |
jksoft | 0:373bcb197dc8 | 50 | } |
jksoft | 0:373bcb197dc8 | 51 | |
jksoft | 0:373bcb197dc8 | 52 | template <class T> |
jksoft | 0:373bcb197dc8 | 53 | T tdqueue<T>::front() |
jksoft | 0:373bcb197dc8 | 54 | { |
jksoft | 0:373bcb197dc8 | 55 | return m_head; |
jksoft | 0:373bcb197dc8 | 56 | } |
jksoft | 0:373bcb197dc8 | 57 | |
jksoft | 0:373bcb197dc8 | 58 | template <class T> |
jksoft | 0:373bcb197dc8 | 59 | void tdqueue<T>::pop() |
jksoft | 0:373bcb197dc8 | 60 | { |
jksoft | 0:373bcb197dc8 | 61 | T td = m_head; |
jksoft | 0:373bcb197dc8 | 62 | if (td) { |
jksoft | 0:373bcb197dc8 | 63 | m_head = (T)td->Next; |
jksoft | 0:373bcb197dc8 | 64 | } |
jksoft | 0:373bcb197dc8 | 65 | if (td == m_tail) { |
jksoft | 0:373bcb197dc8 | 66 | m_tail = NULL; |
jksoft | 0:373bcb197dc8 | 67 | } |
jksoft | 0:373bcb197dc8 | 68 | } |
jksoft | 0:373bcb197dc8 | 69 | |
jksoft | 0:373bcb197dc8 | 70 | template <class T> |
jksoft | 0:373bcb197dc8 | 71 | void tdqueue<T>::push(T td) |
jksoft | 0:373bcb197dc8 | 72 | { |
jksoft | 0:373bcb197dc8 | 73 | td->Next = NULL; |
jksoft | 0:373bcb197dc8 | 74 | if (m_tail) { |
jksoft | 0:373bcb197dc8 | 75 | m_tail->Next = (uint32_t)td; |
jksoft | 0:373bcb197dc8 | 76 | } |
jksoft | 0:373bcb197dc8 | 77 | m_tail = td; |
jksoft | 0:373bcb197dc8 | 78 | if (m_head == NULL) { |
jksoft | 0:373bcb197dc8 | 79 | m_head = td; |
jksoft | 0:373bcb197dc8 | 80 | } |
jksoft | 0:373bcb197dc8 | 81 | } |
jksoft | 0:373bcb197dc8 | 82 | |
jksoft | 0:373bcb197dc8 | 83 | #ifdef __TEST |
jksoft | 0:373bcb197dc8 | 84 | static void test_td_list() |
jksoft | 0:373bcb197dc8 | 85 | { |
jksoft | 0:373bcb197dc8 | 86 | tdqueue<HCTD*> list; |
jksoft | 0:373bcb197dc8 | 87 | HCTD* td1; |
jksoft | 0:373bcb197dc8 | 88 | HCTD* td2; |
jksoft | 0:373bcb197dc8 | 89 | HCTD* td3; |
jksoft | 0:373bcb197dc8 | 90 | HCTD* td4; |
jksoft | 0:373bcb197dc8 | 91 | // 0 |
jksoft | 0:373bcb197dc8 | 92 | DBG_ASSERT(list.size() == 0); |
jksoft | 0:373bcb197dc8 | 93 | td1 = list.front(); |
jksoft | 0:373bcb197dc8 | 94 | DBG_ASSERT(td1 == NULL); |
jksoft | 0:373bcb197dc8 | 95 | list.pop(); |
jksoft | 0:373bcb197dc8 | 96 | td1 = list.front(); |
jksoft | 0:373bcb197dc8 | 97 | DBG_ASSERT(td1 == NULL); |
jksoft | 0:373bcb197dc8 | 98 | // 1 |
jksoft | 0:373bcb197dc8 | 99 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 100 | list.push(td1); |
jksoft | 0:373bcb197dc8 | 101 | DBG_ASSERT(list.size() == 1); |
jksoft | 0:373bcb197dc8 | 102 | td2 = list.front(); |
jksoft | 0:373bcb197dc8 | 103 | DBG_ASSERT(td2 == td1); |
jksoft | 0:373bcb197dc8 | 104 | list.pop(); |
jksoft | 0:373bcb197dc8 | 105 | td2 = list.front(); |
jksoft | 0:373bcb197dc8 | 106 | DBG_ASSERT(td2 == NULL); |
jksoft | 0:373bcb197dc8 | 107 | DBG_ASSERT(list.size() == 0); |
jksoft | 0:373bcb197dc8 | 108 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 109 | // 2 |
jksoft | 0:373bcb197dc8 | 110 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 111 | td2 = (HCTD*)usb_get_td(2); |
jksoft | 0:373bcb197dc8 | 112 | list.push(td1); |
jksoft | 0:373bcb197dc8 | 113 | list.push(td2); |
jksoft | 0:373bcb197dc8 | 114 | DBG_ASSERT(list.size() == 2); |
jksoft | 0:373bcb197dc8 | 115 | td3 = list.front(); |
jksoft | 0:373bcb197dc8 | 116 | DBG_ASSERT(td3 == td1); |
jksoft | 0:373bcb197dc8 | 117 | list.pop(); |
jksoft | 0:373bcb197dc8 | 118 | td3 = list.front(); |
jksoft | 0:373bcb197dc8 | 119 | DBG_ASSERT(td3 == td2); |
jksoft | 0:373bcb197dc8 | 120 | list.pop(); |
jksoft | 0:373bcb197dc8 | 121 | td3 = list.front(); |
jksoft | 0:373bcb197dc8 | 122 | DBG_ASSERT(td3 == NULL); |
jksoft | 0:373bcb197dc8 | 123 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 124 | usb_free_td((byte*)td2); |
jksoft | 0:373bcb197dc8 | 125 | // 3 |
jksoft | 0:373bcb197dc8 | 126 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 127 | td2 = (HCTD*)usb_get_td(2); |
jksoft | 0:373bcb197dc8 | 128 | td3 = (HCTD*)usb_get_td(3); |
jksoft | 0:373bcb197dc8 | 129 | list.push(td1); |
jksoft | 0:373bcb197dc8 | 130 | list.push(td2); |
jksoft | 0:373bcb197dc8 | 131 | list.push(td3); |
jksoft | 0:373bcb197dc8 | 132 | DBG_ASSERT(list.size() == 3); |
jksoft | 0:373bcb197dc8 | 133 | td4 = list.front(); |
jksoft | 0:373bcb197dc8 | 134 | DBG_ASSERT(td4 == td1); |
jksoft | 0:373bcb197dc8 | 135 | list.pop(); |
jksoft | 0:373bcb197dc8 | 136 | td4 = list.front(); |
jksoft | 0:373bcb197dc8 | 137 | DBG_ASSERT(td4 == td2); |
jksoft | 0:373bcb197dc8 | 138 | list.pop(); |
jksoft | 0:373bcb197dc8 | 139 | td4 = list.front(); |
jksoft | 0:373bcb197dc8 | 140 | DBG_ASSERT(td4 == td3); |
jksoft | 0:373bcb197dc8 | 141 | list.pop(); |
jksoft | 0:373bcb197dc8 | 142 | td4 = list.front(); |
jksoft | 0:373bcb197dc8 | 143 | DBG_ASSERT(td4 == NULL); |
jksoft | 0:373bcb197dc8 | 144 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 145 | usb_free_td((byte*)td2); |
jksoft | 0:373bcb197dc8 | 146 | usb_free_td((byte*)td3); |
jksoft | 0:373bcb197dc8 | 147 | // n |
jksoft | 0:373bcb197dc8 | 148 | queue<HCTD*> queue; |
jksoft | 0:373bcb197dc8 | 149 | for(int n = 1; n <= 10; n++) { |
jksoft | 0:373bcb197dc8 | 150 | DBG_ASSERT(list.size() == queue.size()); |
jksoft | 0:373bcb197dc8 | 151 | DBG_ASSERT(list.empty() == queue.empty()); |
jksoft | 0:373bcb197dc8 | 152 | if (list.empty() || (rand()%10) > 5) { |
jksoft | 0:373bcb197dc8 | 153 | td1 = (HCTD*)usb_get_td(n); |
jksoft | 0:373bcb197dc8 | 154 | if (td1) { |
jksoft | 0:373bcb197dc8 | 155 | list.push(td1); |
jksoft | 0:373bcb197dc8 | 156 | queue.push(td1); |
jksoft | 0:373bcb197dc8 | 157 | } |
jksoft | 0:373bcb197dc8 | 158 | //DBG("+ %d %p\n", n, td1); |
jksoft | 0:373bcb197dc8 | 159 | } else { |
jksoft | 0:373bcb197dc8 | 160 | td1 = list.front(); |
jksoft | 0:373bcb197dc8 | 161 | td2 = queue.front(); |
jksoft | 0:373bcb197dc8 | 162 | if (td1 != td2) { |
jksoft | 0:373bcb197dc8 | 163 | //DBG("td1=%p td2=%p\n", td1, td2); |
jksoft | 0:373bcb197dc8 | 164 | } |
jksoft | 0:373bcb197dc8 | 165 | DBG_ASSERT(td1 == td2); |
jksoft | 0:373bcb197dc8 | 166 | if (td1) { |
jksoft | 0:373bcb197dc8 | 167 | list.pop(); |
jksoft | 0:373bcb197dc8 | 168 | queue.pop(); |
jksoft | 0:373bcb197dc8 | 169 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 170 | } |
jksoft | 0:373bcb197dc8 | 171 | //DBG("- %d %p\n", n, td1); |
jksoft | 0:373bcb197dc8 | 172 | } |
jksoft | 0:373bcb197dc8 | 173 | } |
jksoft | 0:373bcb197dc8 | 174 | while(!list.empty()) { |
jksoft | 0:373bcb197dc8 | 175 | td1 = list.front(); |
jksoft | 0:373bcb197dc8 | 176 | list.pop(); |
jksoft | 0:373bcb197dc8 | 177 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 178 | } |
jksoft | 0:373bcb197dc8 | 179 | //DBG_ASSERT(0); |
jksoft | 0:373bcb197dc8 | 180 | } |
jksoft | 0:373bcb197dc8 | 181 | |
jksoft | 0:373bcb197dc8 | 182 | static void test_td_reverse() |
jksoft | 0:373bcb197dc8 | 183 | { |
jksoft | 0:373bcb197dc8 | 184 | |
jksoft | 0:373bcb197dc8 | 185 | HCTD* td1; |
jksoft | 0:373bcb197dc8 | 186 | HCTD* td2; |
jksoft | 0:373bcb197dc8 | 187 | HCTD* td3; |
jksoft | 0:373bcb197dc8 | 188 | HCTD* td4; |
jksoft | 0:373bcb197dc8 | 189 | // 0 |
jksoft | 0:373bcb197dc8 | 190 | td1 = NULL; |
jksoft | 0:373bcb197dc8 | 191 | td2 = td_reverse(td1); |
jksoft | 0:373bcb197dc8 | 192 | DBG_ASSERT(td2 == NULL); |
jksoft | 0:373bcb197dc8 | 193 | // 1 |
jksoft | 0:373bcb197dc8 | 194 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 195 | DBG_ASSERT(td1); |
jksoft | 0:373bcb197dc8 | 196 | DBG_ASSERT(td1->Next == NULL); |
jksoft | 0:373bcb197dc8 | 197 | td2 = td_reverse(td1); |
jksoft | 0:373bcb197dc8 | 198 | DBG_ASSERT(td2 == td1); |
jksoft | 0:373bcb197dc8 | 199 | DBG_ASSERT(td2->Next == NULL); |
jksoft | 0:373bcb197dc8 | 200 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 201 | // 2 |
jksoft | 0:373bcb197dc8 | 202 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 203 | DBG_ASSERT(td1); |
jksoft | 0:373bcb197dc8 | 204 | td2 = (HCTD*)usb_get_td(2); |
jksoft | 0:373bcb197dc8 | 205 | DBG_ASSERT(td2); |
jksoft | 0:373bcb197dc8 | 206 | td1->Next = (uint32_t)td2; |
jksoft | 0:373bcb197dc8 | 207 | td3 = td_reverse(td1); |
jksoft | 0:373bcb197dc8 | 208 | DBG_ASSERT(td3 == td2); |
jksoft | 0:373bcb197dc8 | 209 | DBG_ASSERT(td3->Next == (uint32_t)td1); |
jksoft | 0:373bcb197dc8 | 210 | DBG_ASSERT(td1->Next == NULL); |
jksoft | 0:373bcb197dc8 | 211 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 212 | usb_free_td((byte*)td2); |
jksoft | 0:373bcb197dc8 | 213 | // 3 |
jksoft | 0:373bcb197dc8 | 214 | td1 = (HCTD*)usb_get_td(1); |
jksoft | 0:373bcb197dc8 | 215 | td2 = (HCTD*)usb_get_td(2); |
jksoft | 0:373bcb197dc8 | 216 | td3 = (HCTD*)usb_get_td(3); |
jksoft | 0:373bcb197dc8 | 217 | td1->Next = (uint32_t)td2; |
jksoft | 0:373bcb197dc8 | 218 | td2->Next = (uint32_t)td3; |
jksoft | 0:373bcb197dc8 | 219 | td4 = td_reverse(td1); |
jksoft | 0:373bcb197dc8 | 220 | DBG_ASSERT(td4 == td3); |
jksoft | 0:373bcb197dc8 | 221 | DBG_ASSERT(td3->Next == (uint32_t)td2); |
jksoft | 0:373bcb197dc8 | 222 | DBG_ASSERT(td2->Next == (uint32_t)td1); |
jksoft | 0:373bcb197dc8 | 223 | DBG_ASSERT(td1->Next == NULL); |
jksoft | 0:373bcb197dc8 | 224 | usb_free_td((byte*)td1); |
jksoft | 0:373bcb197dc8 | 225 | usb_free_td((byte*)td2); |
jksoft | 0:373bcb197dc8 | 226 | usb_free_td((byte*)td3); |
jksoft | 0:373bcb197dc8 | 227 | } |
jksoft | 0:373bcb197dc8 | 228 | |
jksoft | 0:373bcb197dc8 | 229 | void test_td() |
jksoft | 0:373bcb197dc8 | 230 | { |
jksoft | 0:373bcb197dc8 | 231 | test_td_reverse(); |
jksoft | 0:373bcb197dc8 | 232 | test_td_list(); |
jksoft | 0:373bcb197dc8 | 233 | DBG("Usb_td.cpp TD test done.\n"); |
jksoft | 0:373bcb197dc8 | 234 | } |
jksoft | 0:373bcb197dc8 | 235 | #else //__TEST |
jksoft | 0:373bcb197dc8 | 236 | void test_td() |
jksoft | 0:373bcb197dc8 | 237 | { |
jksoft | 0:373bcb197dc8 | 238 | |
jksoft | 0:373bcb197dc8 | 239 | } |
jksoft | 0:373bcb197dc8 | 240 | #endif //__TEST |