3 B15F *B15F::instance =
nullptr;
4 errorhandler_t B15F::errorhandler =
nullptr;
14 instance =
new B15F();
38 abort(
"Verbindung kann nicht repariert werden");
51 for (uint8_t i = 0; i < 16; i++)
53 usart.
transmit(&rq[0], 0,
sizeof(rq));
58 catch (std::exception &ex)
68 uint8_t dummy = rand() % 256;
75 usart.
transmit(&rq[0], 0,
sizeof(rq));
78 usart.
receive(&aw[0], 0,
sizeof(aw));
81 assertCode(aw[1], dummy);
87 uint16_t dummy = rand() % (0xFFFF / 3);
92 static_cast<uint8_t >(dummy & 0xFF),
93 static_cast<uint8_t >(dummy >> 8)
95 usart.
transmit(&rq[0], 0,
sizeof(rq));
98 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
100 assertCode(aw, dummy * 3);
106 std::vector<std::string> info;
112 usart.
transmit(&rq[0], 0,
sizeof(rq));
115 usart.
receive(&n, 0,
sizeof(n));
119 usart.
receive(&len, 0,
sizeof(len));
122 usart.
receive(reinterpret_cast<uint8_t *>(&str[0]), 0, len);
125 info.push_back(std::string(str));
129 usart.
receive(&aw, 0,
sizeof(aw));
131 abort(
"Board Info fehlerhalft: code " + std::to_string((
int) aw));
138 std::this_thread::sleep_for(std::chrono::milliseconds(ms));
143 std::this_thread::sleep_for(std::chrono::microseconds(us));
148 b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
149 b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
150 b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
156 std::array<char, 128> buffer;
158 std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(),
"r"), pclose);
161 throw std::runtime_error(
"popen() failed!");
163 while (fgets(buffer.data(), buffer.size(), pipe.get()) !=
nullptr)
165 result += buffer.data();
182 std::cout << ex.what() << std::endl;
207 assertRequestLength(rq, RQ_SELF_TEST);
208 usart.
transmit(&rq[0], 0,
sizeof(rq));
211 usart.
receive(&aw, 0,
sizeof(aw));
223 assertRequestLength(rq, RQ_DIGITAL_WRITE_0);
224 usart.
transmit(&rq[0], 0,
sizeof(rq));
227 usart.
receive(&aw, 0,
sizeof(aw));
239 assertRequestLength(rq, RQ_DIGITAL_WRITE_1);
240 usart.
transmit(&rq[0], 0,
sizeof(rq));
243 usart.
receive(&aw, 0,
sizeof(aw));
255 assertRequestLength(rq, RQ_DIGITAL_READ_0);
256 usart.
transmit(&rq[0], 0,
sizeof(rq));
259 usart.
receive(&aw, 0,
sizeof(aw));
271 assertRequestLength(rq, RQ_DIGITAL_READ_1);
272 usart.
transmit(&rq[0], 0,
sizeof(rq));
275 usart.
receive(&aw, 0,
sizeof(aw));
287 assertRequestLength(rq, RQ_READ_DIP_SWITCH);
288 usart.
transmit(&rq[0], 0,
sizeof(rq));
291 usart.
receive(&aw, 0,
sizeof(aw));
303 static_cast<uint8_t >(value & 0xFF),
304 static_cast<uint8_t >(value >> 8)
307 assertRequestLength(rq, RQ_ANALOG_WRITE_0);
308 usart.
transmit(&rq[0], 0,
sizeof(rq));
311 usart.
receive(&aw, 0,
sizeof(aw));
320 static_cast<uint8_t >(value & 0xFF),
321 static_cast<uint8_t >(value >> 8)
324 assertRequestLength(rq, RQ_ANALOG_WRITE_1);
325 usart.
transmit(&rq[0], 0,
sizeof(rq));
328 usart.
receive(&aw, 0,
sizeof(aw));
336 abort(
"Bad ADC channel: " + std::to_string(channel));
344 assertRequestLength(rq, RQ_ANALOG_READ);
345 usart.
transmit(&rq[0], 0,
sizeof(rq));
348 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
351 abort(
"Bad ADC data detected (1)");
355 void B15F::analogSequence(uint8_t channel_a, uint16_t *buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t *buffer_b,
356 uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
359 buffer_a += offset_a;
360 buffer_b += offset_b;
369 static_cast<uint8_t >(start & 0xFF),
370 static_cast<uint8_t >(start >> 8),
371 static_cast<uint8_t >(delta & 0xFF),
372 static_cast<uint8_t >(delta >> 8),
373 static_cast<uint8_t >(count & 0xFF),
374 static_cast<uint8_t >(count >> 8)
377 assertRequestLength(rq, RQ_ADC_DAC_STROKE);
378 usart.
transmit(&rq[0], 0,
sizeof(rq));
380 for (uint16_t i = 0; i < count; i++)
384 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_a[i]), 0, 2);
386 if (buffer_a[i] > 1023)
387 abort(
"Bad ADC data detected (2)");
396 usart.
receive(reinterpret_cast<uint8_t *>(&buffer_b[i]), 0, 2);
398 if (buffer_b[i] > 1023)
399 abort(
"Bad ADC data detected (3)");
408 usart.
receive(&aw, 0,
sizeof(aw));
419 static_cast<uint8_t>((freq >> 0) & 0xFF),
420 static_cast<uint8_t>((freq >> 8) & 0xFF),
421 static_cast<uint8_t>((freq >> 16) & 0xFF),
422 static_cast<uint8_t>((freq >> 24) & 0xFF)
425 assertRequestLength(rq, RQ_PWM_SET_FREQ);
426 usart.
transmit(&rq[0], 0,
sizeof(rq));
429 usart.
receive(&aw, 0,
sizeof(aw));
443 assertRequestLength(rq, RQ_PWM_SET_VALUE);
444 usart.
transmit(&rq[0], 0,
sizeof(rq));
447 usart.
receive(&aw, 0,
sizeof(aw));
458 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
459 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
463 assertRequestLength(rq, RQ_SET_MEM_8);
464 usart.
transmit(&rq[0], 0,
sizeof(rq));
467 usart.
receive(&aw, 0,
sizeof(aw));
478 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
479 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8)
482 assertRequestLength(rq, RQ_GET_MEM_8);
483 usart.
transmit(&rq[0], 0,
sizeof(rq));
486 usart.
receive(&aw, 0,
sizeof(aw));
497 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
498 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8),
499 static_cast<uint8_t >(val & 0xFF),
500 static_cast<uint8_t >(val >> 8)
503 assertRequestLength(rq, RQ_SET_MEM_16);
504 usart.
transmit(&rq[0], 0,
sizeof(rq));
507 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
518 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) & 0xFF),
519 static_cast<uint8_t >(reinterpret_cast<size_t>(adr) >> 8)
522 assertRequestLength(rq, RQ_GET_MEM_16);
523 usart.
transmit(&rq[0], 0,
sizeof(rq));
526 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
549 assertRequestLength(rq, RQ_COUNTER_OFFSET);
550 usart.
transmit(&rq[0], 0,
sizeof(rq));
553 usart.
receive(reinterpret_cast<uint8_t *>(&aw), 0,
sizeof(aw));
554 return reinterpret_cast<uint16_t*>(aw);
566 assertRequestLength(rq, RQ_SERVO_ENABLE);
567 usart.
transmit(&rq[0], 0,
sizeof(rq));
570 usart.
receive(&aw, 0,
sizeof(aw));
583 assertRequestLength(rq, RQ_SERVO_DISABLE);
584 usart.
transmit(&rq[0], 0,
sizeof(rq));
587 usart.
receive(&aw, 0,
sizeof(aw));
594 throw DriverException(
"Impulslänge ist zu lang: " + std::to_string(pos));
601 static_cast<uint8_t >(pos & 0xFF),
602 static_cast<uint8_t >(pos >> 8)
605 assertRequestLength(rq, RQ_SERVO_SET_POS);
606 usart.
transmit(&rq[0], 0,
sizeof(rq));
609 usart.
receive(&aw, 0,
sizeof(aw));
631 std::string device =
exec(
"bash -c 'ls /dev/ttyAMA* 2> /dev/null'");
634 std::string device =
exec(
"bash -c 'ls /dev/ttyUSB* 2> /dev/null'");
637 while (device.find(
' ') != std::string::npos || device.find(
'\n') != std::string::npos ||
638 device.find(
'\t') != std::string::npos)
641 if (device.length() == 0)
642 abort(
"Adapter nicht gefunden");
644 std::cout <<
PRE <<
"Verwende Adapter: " << device << std::endl;
647 std::cout <<
PRE <<
"Stelle Verbindung mit Adapter her... " << std::flush;
650 std::cout <<
"OK" << std::endl;
653 std::cout <<
PRE <<
"Teste Verbindung... " << std::flush;
680 abort(
"Verbindungstest fehlgeschlagen. Neueste Version im Einsatz?");
682 std::cout <<
"OK" << std::endl;
687 std::cout <<
PRE <<
"AVR Firmware Version: " << info[0] <<
" um " << info[1] <<
" Uhr (" << info[2] <<
")" 691 std::string& avr_commit_hash = info[3];
692 if(avr_commit_hash.compare(COMMIT_HASH))
694 std::cout <<
PRE <<
"Unterschiedliche commit hashes: " << std::endl;
695 std::cout << std::string(
PRE.length(),
' ') <<
"AVR: " << avr_commit_hash << std::endl;
696 std::cout << std::string(
PRE.length(),
' ') <<
"Control: " << COMMIT_HASH << std::endl << std::endl;
697 abort(
"Versionen inkompatibel. Bitte Software aktualisieren!");