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::cout << ex.what() << std::endl;
199 assertRequestLength(rq, RQ_SELF_TEST);
200 usart.
transmit(&rq[0], 0,
sizeof(rq));
203 usart.
receive(&aw, 0,
sizeof(aw));
215 assertRequestLength(rq, RQ_DIGITAL_WRITE_0);
216 usart.
transmit(&rq[0], 0,
sizeof(rq));
219 usart.
receive(&aw, 0,
sizeof(aw));
231 assertRequestLength(rq, RQ_DIGITAL_WRITE_1);
232 usart.
transmit(&rq[0], 0,
sizeof(rq));
235 usart.
receive(&aw, 0,
sizeof(aw));
247 assertRequestLength(rq, RQ_DIGITAL_READ_0);
248 usart.
transmit(&rq[0], 0,
sizeof(rq));
251 usart.
receive(&aw, 0,
sizeof(aw));
263 assertRequestLength(rq, RQ_DIGITAL_READ_1);
264 usart.
transmit(&rq[0], 0,
sizeof(rq));
267 usart.
receive(&aw, 0,
sizeof(aw));
279 assertRequestLength(rq, RQ_READ_DIP_SWITCH);
280 usart.
transmit(&rq[0], 0,
sizeof(rq));
283 usart.
receive(&aw, 0,
sizeof(aw));
295 static_cast<uint8_t >(value & 0xFF),
296 static_cast<uint8_t >(value >> 8)
299 assertRequestLength(rq, RQ_ANALOG_WRITE_0);
300 usart.
transmit(&rq[0], 0,
sizeof(rq));
303 usart.
receive(&aw, 0,
sizeof(aw));
312 static_cast<uint8_t >(value & 0xFF),
313 static_cast<uint8_t >(value >> 8)
316 assertRequestLength(rq, RQ_ANALOG_WRITE_1);
317 usart.
transmit(&rq[0], 0,
sizeof(rq));
320 usart.
receive(&aw, 0,
sizeof(aw));
328 abort(
"Bad ADC channel: " + std::to_string(channel));
336 assertRequestLength(rq, RQ_ANALOG_READ);
337 usart.
transmit(&rq[0], 0,
sizeof(rq));
340 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
343 abort(
"Bad ADC data detected (1)");
347 void B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
348 uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
351 buffer_a += offset_a;
352 buffer_b += offset_b;
361 static_cast<uint8_t >(start & 0xFF),
362 static_cast<uint8_t >(start >> 8),
363 static_cast<uint8_t >(delta & 0xFF),
364 static_cast<uint8_t >(delta >> 8),
365 static_cast<uint8_t >(count & 0xFF),
366 static_cast<uint8_t >(count >> 8)
369 assertRequestLength(rq, RQ_ADC_DAC_STROKE);
370 usart.
transmit(&rq[0], 0,
sizeof(rq));
372 for (uint16_t i = 0; i < count; i++)
376 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_a[i]), 0, 2);
378 if (buffer_a[i] > 1023)
379 abort(
"Bad ADC data detected (2)");
388 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_b[i]), 0, 2);
390 if (buffer_b[i] > 1023)
391 abort(
"Bad ADC data detected (3)");
400 usart.
receive(&aw, 0,
sizeof(aw));
411 static_cast<uint8_t>((freq >> 0) & 0xFF),
412 static_cast<uint8_t>((freq >> 8) & 0xFF),
413 static_cast<uint8_t>((freq >> 16) & 0xFF),
414 static_cast<uint8_t>((freq >> 24) & 0xFF)
417 assertRequestLength(rq, RQ_PWM_SET_FREQ);
418 usart.
transmit(&rq[0], 0,
sizeof(rq));
421 usart.
receive(&aw, 0,
sizeof(aw));
435 assertRequestLength(rq, RQ_PWM_SET_VALUE);
436 usart.
transmit(&rq[0], 0,
sizeof(rq));
439 usart.
receive(&aw, 0,
sizeof(aw));
450 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
451 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
455 assertRequestLength(rq, RQ_SET_MEM_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)
474 assertRequestLength(rq, RQ_GET_MEM_8);
475 usart.
transmit(&rq[0], 0,
sizeof(rq));
478 usart.
receive(&aw, 0,
sizeof(aw));
489 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
490 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
491 static_cast<uint8_t >(val & 0xFF),
492 static_cast<uint8_t >(val >> 8)
495 assertRequestLength(rq, RQ_SET_MEM_16);
496 usart.
transmit(&rq[0], 0,
sizeof(rq));
499 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
510 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
511 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8)
514 assertRequestLength(rq, RQ_GET_MEM_16);
515 usart.
transmit(&rq[0], 0,
sizeof(rq));
518 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
541 assertRequestLength(rq, RQ_COUNTER_OFFSET);
542 usart.
transmit(&rq[0], 0,
sizeof(rq));
545 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
546 return reinterpret_cast<uint16_t*>(aw);
558 assertRequestLength(rq, RQ_SERVO_ENABLE);
559 usart.
transmit(&rq[0], 0,
sizeof(rq));
562 usart.
receive(&aw, 0,
sizeof(aw));
575 assertRequestLength(rq, RQ_SERVO_DISABLE);
576 usart.
transmit(&rq[0], 0,
sizeof(rq));
579 usart.
receive(&aw, 0,
sizeof(aw));
586 throw DriverException(
"Impulslänge ist zu lang: " + std::to_string(pos));
593 static_cast<uint8_t >(pos & 0xFF),
594 static_cast<uint8_t >(pos >> 8)
597 assertRequestLength(rq, RQ_SERVO_SET_POS);
598 usart.
transmit(&rq[0], 0,
sizeof(rq));
601 usart.
receive(&aw, 0,
sizeof(aw));
623 std::string device =
exec(
"bash -c 'ls /dev/ttyAMA* 2> /dev/null'");
626 std::string device =
exec(
"bash -c 'ls /dev/ttyUSB* 2> /dev/null'");
629 while (device.find(
' ') != std::string::npos || device.find(
'\n') != std::string::npos ||
630 device.find(
'\t') != std::string::npos)
633 if (device.length() == 0)
634 abort(
"Adapter nicht gefunden");
636 std::cout <<
PRE <<
"Verwende Adapter: " << device << std::endl;
639 std::cout <<
PRE <<
"Stelle Verbindung mit Adapter her... " << std::flush;
642 std::cout <<
"OK" << std::endl;
645 std::cout <<
PRE <<
"Teste Verbindung... " << std::flush;
661 abort(
"Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
662 std::cout <<
"OK" << std::endl;
667 std::cout <<
PRE <<
"AVR Firmware Version: " << info[0] <<
" um " << info[1] <<
" Uhr (" << info[2] <<
")"