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));
503 return setMem8(reinterpret_cast<volatile uint16_t*>(adr), val);
508 return getMem8(reinterpret_cast<volatile uint16_t*>(adr));
527 std::string device =
exec(
"bash -c 'ls /dev/ttyUSB*'");
528 while (device.find(
' ') != std::string::npos || device.find(
'\n') != std::string::npos ||
529 device.find(
'\t') != std::string::npos)
532 if (device.length() == 0)
533 abort(
"Adapter nicht gefunden");
535 std::cout <<
PRE <<
"Verwende Adapter: " << device << std::endl;
538 std::cout <<
PRE <<
"Stelle Verbindung mit Adapter her... " << std::flush;
541 std::cout <<
"OK" << std::endl;
544 std::cout <<
PRE <<
"Teste Verbindung... " << std::flush;
560 abort(
"Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
561 std::cout <<
"OK" << std::endl;
566 std::cout <<
PRE <<
"AVR Firmware Version: " << info[0] <<
" um " << info[1] <<
" Uhr (" << info[2] <<
")"