3 B15F *B15F::instance =
nullptr;
4 errorhandler_t B15F::errorhandler =
nullptr;
14 instance =
new B15F();
31 abort(
"Verbindung kann nicht repariert werden");
44 for (uint8_t i = 0; i < 16; i++)
46 usart.
transmit(&rq[0], 0,
sizeof(rq));
51 catch (std::exception &ex)
61 uint8_t dummy = rand() % 256;
68 usart.
transmit(&rq[0], 0,
sizeof(rq));
71 usart.
receive(&aw[0], 0,
sizeof(aw));
73 return aw[0] ==
MSG_OK && aw[1] == dummy;
79 uint16_t dummy = rand() % (0xFFFF / 3);
84 static_cast<uint8_t >(dummy & 0xFF),
85 static_cast<uint8_t >(dummy >> 8)
87 usart.
transmit(&rq[0], 0,
sizeof(rq));
90 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
92 return aw == dummy * 3;
98 std::vector<std::string> info;
104 usart.
transmit(&rq[0], 0,
sizeof(rq));
107 usart.
receive(&n, 0,
sizeof(n));
111 usart.
receive(&len, 0,
sizeof(len));
115 usart.
receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
117 info.push_back(std::string(str));
121 usart.
receive(&aw, 0,
sizeof(aw));
123 abort(
"Board Info fehlerhalft: code " + std::to_string((
int) aw));
130 std::this_thread::sleep_for(std::chrono::milliseconds(ms));
135 std::this_thread::sleep_for(std::chrono::microseconds(us));
140 b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
141 b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
142 b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
148 std::array<char, 128> buffer;
150 std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(),
"r"), pclose);
153 throw std::runtime_error(
"popen() failed!");
155 while (fgets(buffer.data(), buffer.size(), pipe.get()) !=
nullptr)
157 result += buffer.data();
174 std::cerr <<
"NOTICE: B15F::errorhandler not set" << std::endl;
175 std::cout << ex.what() << std::endl;
199 usart.
transmit(&rq[0], 0,
sizeof(rq));
202 usart.
receive(&aw, 0,
sizeof(aw));
213 usart.
transmit(&rq[0], 0,
sizeof(rq));
216 usart.
receive(&aw, 0,
sizeof(aw));
227 usart.
transmit(&rq[0], 0,
sizeof(rq));
230 usart.
receive(&aw, 0,
sizeof(aw));
241 usart.
transmit(&rq[0], 0,
sizeof(rq));
244 usart.
receive(&aw, 0,
sizeof(aw));
255 usart.
transmit(&rq[0], 0,
sizeof(rq));
258 usart.
receive(&aw, 0,
sizeof(aw));
269 usart.
transmit(&rq[0], 0,
sizeof(rq));
272 usart.
receive(&aw, 0,
sizeof(aw));
284 static_cast<uint8_t >(value & 0xFF),
285 static_cast<uint8_t >(value >> 8)
287 usart.
transmit(&rq[0], 0,
sizeof(rq));
290 usart.
receive(&aw, 0,
sizeof(aw));
299 static_cast<uint8_t >(value & 0xFF),
300 static_cast<uint8_t >(value >> 8)
302 usart.
transmit(&rq[0], 0,
sizeof(rq));
305 usart.
receive(&aw, 0,
sizeof(aw));
313 abort(
"Bad ADC channel: " + std::to_string(channel));
321 usart.
transmit(&rq[0], 0,
sizeof(rq));
324 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
327 abort(
"Bad ADC data detected (1)");
332 B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
333 uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
336 buffer_a += offset_a;
337 buffer_b += offset_b;
346 static_cast<uint8_t >(start & 0xFF),
347 static_cast<uint8_t >(start >> 8),
348 static_cast<uint8_t >(delta & 0xFF),
349 static_cast<uint8_t >(delta >> 8),
350 static_cast<uint8_t >(count & 0xFF),
351 static_cast<uint8_t >(count >> 8)
354 usart.
transmit(&rq[0], 0,
sizeof(rq));
356 for (uint16_t i = 0; i < count; i++)
360 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_a[i]), 0, 2);
362 if (buffer_a[i] > 1023)
363 abort(
"Bad ADC data detected (2)");
372 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_b[i]), 0, 2);
374 if (buffer_b[i] > 1023)
375 abort(
"Bad ADC data detected (3)");
384 usart.
receive(&aw, 0,
sizeof(aw));
386 abort(
"Sequenz unterbrochen");
396 static_cast<uint8_t>((freq >> 0) & 0xFF),
397 static_cast<uint8_t>((freq >> 8) & 0xFF),
398 static_cast<uint8_t>((freq >> 16) & 0xFF),
399 static_cast<uint8_t>((freq >> 24) & 0xFF)
402 usart.
transmit(&rq[0], 0,
sizeof(rq));
405 usart.
receive(&aw, 0,
sizeof(aw));
419 usart.
transmit(&rq[0], 0,
sizeof(rq));
422 usart.
receive(&aw, 0,
sizeof(aw));
433 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
434 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
438 usart.
transmit(&rq[0], 0,
sizeof(rq));
441 usart.
receive(&aw, 0,
sizeof(aw));
452 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
453 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8)
456 usart.
transmit(&rq[0], 0,
sizeof(rq));
459 usart.
receive(&aw, 0,
sizeof(aw));
470 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
471 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
472 static_cast<uint8_t >(val & 0xFF),
473 static_cast<uint8_t >(val >> 8)
476 usart.
transmit(&rq[0], 0,
sizeof(rq));
479 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
490 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
491 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8)
494 usart.
transmit(&rq[0], 0,
sizeof(rq));
497 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
520 usart.
transmit(&rq[0], 0,
sizeof(rq));
523 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
524 return reinterpret_cast<uint16_t*>(aw);
536 usart.
transmit(&rq[0], 0,
sizeof(rq));
539 usart.
receive(&aw, 0,
sizeof(aw));
552 usart.
transmit(&rq[0], 0,
sizeof(rq));
555 usart.
receive(&aw, 0,
sizeof(aw));
562 throw DriverException(
"Impulslänge ist zu lang: " + std::to_string(pos));
569 static_cast<uint8_t >(pos & 0xFF),
570 static_cast<uint8_t >(pos >> 8)
573 usart.
transmit(&rq[0], 0,
sizeof(rq));
576 usart.
receive(&aw, 0,
sizeof(aw));
596 std::string device =
exec(
"bash -c 'ls /dev/ttyUSB*'");
597 while (device.find(
' ') != std::string::npos || device.find(
'\n') != std::string::npos ||
598 device.find(
'\t') != std::string::npos)
601 if (device.length() == 0)
602 abort(
"Adapter nicht gefunden");
604 std::cout <<
PRE <<
"Verwende Adapter: " << device << std::endl;
607 std::cout <<
PRE <<
"Stelle Verbindung mit Adapter her... " << std::flush;
610 std::cout <<
"OK" << std::endl;
613 std::cout <<
PRE <<
"Teste Verbindung... " << std::flush;
629 abort(
"Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
630 std::cout <<
"OK" << std::endl;
635 std::cout <<
PRE <<
"AVR Firmware Version: " << info[0] <<
" um " << info[1] <<
" Uhr (" << info[2] <<
")" 639 void B15F::assertCode(uint8_t& code, uint8_t expectation)
const 641 if(code != expectation)
642 throw DriverException(
"Ungültige Antwort erhalten: " + std::to_string((
int) code) +
" (erwartet: " + std::to_string((
int) expectation) +
")");