うおーるぼっとをiPhoneでコントロールするプログラムです。 iPhoneとはBTLEで接続しています。

Dependencies:   FatFileSystem HighSpeedAnalogIn TB6612FNG2 mbed

Committer:
jksoft
Date:
Fri May 10 11:48:07 2013 +0000
Revision:
0:373bcb197dc8
?????????

Who changed what in which revision?

UserRevisionLine numberNew 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