54Q_DEFINE_THIS_MODULE(
"qs_rx")
56enum RxStateEnum : std::uint8_t {
96 WAIT4_TEST_SETUP_FRAME,
97 WAIT4_TEST_TEARDOWN_FRAME,
98 WAIT4_TEST_PROBE_DATA,
99 WAIT4_TEST_PROBE_ADDR,
100 WAIT4_TEST_PROBE_FRAME,
101 WAIT4_TEST_CONTINUE_FRAME
106static void rxParseData_(std::uint8_t
const b)
noexcept;
107static void rxHandleGoodFrame_(std::uint8_t
const state);
108static void rxHandleBadFrame_(std::uint8_t
const state)
noexcept;
109static void rxReportAck_(
enum QP::QSpyRxRecords
const recId)
noexcept;
110static void rxReportError_(std::uint8_t
const code)
noexcept;
111static void rxReportDone_(
enum QP::QSpyRxRecords
const recId)
noexcept;
112static void queryCurrObj_(std::uint8_t obj_kind)
noexcept;
113static void rxPoke_() noexcept;
116static inline
void tran_(RxStateEnum const target) noexcept {
117 QP::QS::rxPriv_.state =
static_cast<std::uint8_t
>(target);
122#ifndef QF_MEM_ISOLATE
135#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
136#error qpcpp version 7.3.0 or higher required
146 std::uint8_t *
const sto,
147 std::uint16_t
const stoSize)
noexcept
149 rxPriv_.buf = &sto[0];
150 rxPriv_.end =
static_cast<QSCtr
>(stoSize);
162 QP::QS::rxPriv_.esc = 0U;
163 QP::QS::rxPriv_.seq = 0U;
164 QP::QS::rxPriv_.chksum = 0U;
166 beginRec_(
static_cast<std::uint_fast8_t
>(
QS_OBJ_DICT));
167 QS_OBJ_PRE_(&rxPriv_);
168 QS_STR_PRE_(
"QS_RX");
174 tstPriv_.testTime = 0U;
180 QSCtr tail = rxPriv_.tail;
181 while (rxPriv_.head != tail) {
182 std::uint8_t b = rxPriv_.buf[tail];
185 if (tail == rxPriv_.end) {
190 if (QP::QS::rxPriv_.esc != 0U) {
191 QP::QS::rxPriv_.esc = 0U;
194 QP::QS::rxPriv_.chksum += b;
197 else if (b == QS_ESC) {
198 QP::QS::rxPriv_.esc = 1U;
200 else if (b == QS_FRAME) {
202 b = QP::QS::rxPriv_.state;
203 QP::QS::rxPriv_.esc = 0U;
206 if (QP::QS::rxPriv_.chksum == QS_GOOD_CHKSUM) {
207 QP::QS::rxPriv_.chksum = 0U;
208 rxHandleGoodFrame_(b);
211 QP::QS::rxPriv_.chksum = 0U;
212 rxReportError_(0x41U);
213 rxHandleBadFrame_(b);
217 QP::QS::rxPriv_.chksum += b;
225 std::uint8_t
const obj_kind,
226 void *
const obj_ptr)
234 rxPriv_.currObj[obj_kind] = obj_ptr;
245 QSCtr
const head = rxPriv_.head;
247 if (head == rxPriv_.tail) {
248 nFree =
static_cast<std::uint16_t
>(rxPriv_.end - 1U);
250 else if (head < rxPriv_.tail) {
251 nFree =
static_cast<std::uint16_t
>(rxPriv_.tail - head - 1U);
254 nFree =
static_cast<std::uint16_t
>(rxPriv_.end + rxPriv_.tail
269static void rxParseData_(std::uint8_t
const b)
noexcept {
270 switch (QP::QS::rxPriv_.state) {
272 ++QP::QS::rxPriv_.seq;
273 if (QP::QS::rxPriv_.seq != b) {
274 rxReportError_(0x42U);
275 QP::QS::rxPriv_.seq = b;
283 tran_(WAIT4_INFO_FRAME);
285 case QP::QS_RX_COMMAND:
288 case QP::QS_RX_RESET:
289 tran_(WAIT4_RESET_FRAME);
292 tran_(WAIT4_TICK_RATE);
296 QP::QS::rxPriv_.var.peek.offs = 0U;
297 QP::QS::rxPriv_.var.peek.idx = 0U;
298 tran_(WAIT4_PEEK_OFFS);
302 static_cast<std::uint8_t
>(QP::QS_RX_PEEK));
308 QP::QS::rxPriv_.var.poke.fill =
309 (b ==
static_cast<std::uint8_t
>(QP::QS_RX_FILL))
312 QP::QS::rxPriv_.var.poke.offs = 0U;
313 QP::QS::rxPriv_.var.poke.idx = 0U;
314 tran_(WAIT4_POKE_OFFS);
318 (QP::QS::rxPriv_.var.poke.fill != 0U)
319 ?
static_cast<std::uint8_t
>(QP::QS_RX_FILL)
320 : static_cast<std::uint8_t>(
QP::QS_RX_POKE));
324 case QP::QS_RX_GLB_FILTER:
325 case QP::QS_RX_LOC_FILTER:
326 QP::QS::rxPriv_.var.flt.recId = b;
327 tran_(WAIT4_FILTER_LEN);
329 case QP::QS_RX_AO_FILTER:
330 case QP::QS_RX_CURR_OBJ:
331 QP::QS::rxPriv_.var.obj.recId = b;
332 tran_(WAIT4_OBJ_KIND);
334 case QP::QS_RX_QUERY_CURR:
335 QP::QS::rxPriv_.var.obj.recId =
336 static_cast<std::uint8_t
>(QP::QS_RX_QUERY_CURR);
337 tran_(WAIT4_QUERY_KIND);
339 case QP::QS_RX_EVENT:
340 tran_(WAIT4_EVT_PRIO);
344 case QP::QS_RX_TEST_SETUP:
345 tran_(WAIT4_TEST_SETUP_FRAME);
347 case QP::QS_RX_TEST_TEARDOWN:
348 tran_(WAIT4_TEST_TEARDOWN_FRAME);
350 case QP::QS_RX_TEST_CONTINUE:
351 tran_(WAIT4_TEST_CONTINUE_FRAME);
353 case QP::QS_RX_TEST_PROBE:
354 if (QP::QS::tstPriv_.tpNum
355 <
static_cast<std::uint8_t
>(
356 (
sizeof(QP::QS::tstPriv_.tpBuf)
357 /
sizeof(QP::QS::tstPriv_.tpBuf[0]))))
359 QP::QS::rxPriv_.var.tp.data = 0U;
360 QP::QS::rxPriv_.var.tp.idx = 0U;
361 tran_(WAIT4_TEST_PROBE_DATA);
365 static_cast<std::uint8_t
>(QP::QS_RX_TEST_PROBE));
372 rxReportError_(0x43U);
378 case WAIT4_INFO_FRAME: {
383 QP::QS::rxPriv_.var.cmd.cmdId = b;
384 QP::QS::rxPriv_.var.cmd.idx = 0U;
385 QP::QS::rxPriv_.var.cmd.param1 = 0U;
386 QP::QS::rxPriv_.var.cmd.param2 = 0U;
387 QP::QS::rxPriv_.var.cmd.param3 = 0U;
388 tran_(WAIT4_CMD_PARAM1);
391 case WAIT4_CMD_PARAM1: {
392 QP::QS::rxPriv_.var.cmd.param1 |=
393 (
static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.cmd.idx);
394 QP::QS::rxPriv_.var.cmd.idx += 8U;
395 if (QP::QS::rxPriv_.var.cmd.idx == (8U * 4U)) {
396 QP::QS::rxPriv_.var.cmd.idx = 0U;
397 tran_(WAIT4_CMD_PARAM2);
401 case WAIT4_CMD_PARAM2: {
402 QP::QS::rxPriv_.var.cmd.param2 |=
403 static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.cmd.idx;
404 QP::QS::rxPriv_.var.cmd.idx += 8U;
405 if (QP::QS::rxPriv_.var.cmd.idx == (8U * 4U)) {
406 QP::QS::rxPriv_.var.cmd.idx = 0U;
407 tran_(WAIT4_CMD_PARAM3);
411 case WAIT4_CMD_PARAM3: {
412 QP::QS::rxPriv_.var.cmd.param3 |=
413 static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.cmd.idx;
414 QP::QS::rxPriv_.var.cmd.idx += 8U;
415 if (QP::QS::rxPriv_.var.cmd.idx == (8U * 4U)) {
416 QP::QS::rxPriv_.var.cmd.idx = 0U;
417 tran_(WAIT4_CMD_FRAME);
421 case WAIT4_CMD_FRAME: {
425 case WAIT4_RESET_FRAME: {
429 case WAIT4_TICK_RATE: {
430 QP::QS::rxPriv_.var.tick.rate =
static_cast<std::uint_fast8_t
>(b);
431 tran_(WAIT4_TICK_FRAME);
434 case WAIT4_TICK_FRAME: {
438 case WAIT4_PEEK_OFFS: {
439 if (QP::QS::rxPriv_.var.peek.idx == 0U) {
440 QP::QS::rxPriv_.var.peek.offs =
static_cast<std::uint16_t
>(b);
441 QP::QS::rxPriv_.var.peek.idx += 8U;
444 QP::QS::rxPriv_.var.peek.offs |=
static_cast<std::uint16_t
>(
445 static_cast<std::uint16_t
>(b) << 8U);
446 tran_(WAIT4_PEEK_SIZE);
450 case WAIT4_PEEK_SIZE: {
451 if ((b == 1U) || (b == 2U) || (b == 4U)) {
452 QP::QS::rxPriv_.var.peek.size = b;
453 tran_(WAIT4_PEEK_NUM);
456 rxReportError_(
static_cast<std::uint8_t
>(QP::QS_RX_PEEK));
461 case WAIT4_PEEK_NUM: {
462 QP::QS::rxPriv_.var.peek.num = b;
463 tran_(WAIT4_PEEK_FRAME);
466 case WAIT4_PEEK_FRAME: {
470 case WAIT4_POKE_OFFS: {
471 if (QP::QS::rxPriv_.var.poke.idx == 0U) {
472 QP::QS::rxPriv_.var.poke.offs =
static_cast<std::uint16_t
>(b);
473 QP::QS::rxPriv_.var.poke.idx = 1U;
476 QP::QS::rxPriv_.var.poke.offs |=
static_cast<std::uint16_t
>(
477 static_cast<std::uint16_t
>(b) << 8U);
478 tran_(WAIT4_POKE_SIZE);
482 case WAIT4_POKE_SIZE: {
483 if ((b == 1U) || (b == 2U) || (b == 4U)) {
484 QP::QS::rxPriv_.var.poke.size = b;
485 tran_(WAIT4_POKE_NUM);
488 rxReportError_((QP::QS::rxPriv_.var.poke.fill != 0U)
489 ?
static_cast<std::uint8_t
>(QP::QS_RX_FILL)
490 : static_cast<std::uint8_t>(
QP::QS_RX_POKE));
495 case WAIT4_POKE_NUM: {
497 QP::QS::rxPriv_.var.poke.num = b;
498 QP::QS::rxPriv_.var.poke.data = 0U;
499 QP::QS::rxPriv_.var.poke.idx = 0U;
500 tran_((QP::QS::rxPriv_.var.poke.fill != 0U)
505 rxReportError_((QP::QS::rxPriv_.var.poke.fill != 0U)
506 ?
static_cast<std::uint8_t
>(QP::QS_RX_FILL)
507 : static_cast<std::uint8_t>(
QP::QS_RX_POKE));
512 case WAIT4_FILL_DATA: {
513 QP::QS::rxPriv_.var.poke.data |=
514 static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.poke.idx;
515 QP::QS::rxPriv_.var.poke.idx += 8U;
516 if ((QP::QS::rxPriv_.var.poke.idx >> 3U) == QP::QS::rxPriv_.var.poke.size) {
517 tran_(WAIT4_FILL_FRAME);
521 case WAIT4_POKE_DATA: {
522 QP::QS::rxPriv_.var.poke.data |=
523 static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.poke.idx;
524 QP::QS::rxPriv_.var.poke.idx += 8U;
525 if ((QP::QS::rxPriv_.var.poke.idx >> 3U) == QP::QS::rxPriv_.var.poke.size) {
527 --QP::QS::rxPriv_.var.poke.num;
528 if (QP::QS::rxPriv_.var.poke.num == 0U) {
529 tran_(WAIT4_POKE_FRAME);
534 case WAIT4_FILL_FRAME: {
538 case WAIT4_POKE_FRAME: {
542 case WAIT4_FILTER_LEN: {
543 if (b ==
static_cast<std::uint8_t
>(
sizeof(QP::QS::rxPriv_.var.flt.data))) {
544 QP::QS::rxPriv_.var.flt.idx = 0U;
545 tran_(WAIT4_FILTER_DATA);
548 rxReportError_(QP::QS::rxPriv_.var.flt.recId);
553 case WAIT4_FILTER_DATA: {
554 QP::QS::rxPriv_.var.flt.data[QP::QS::rxPriv_.var.flt.idx] = b;
555 ++QP::QS::rxPriv_.var.flt.idx;
556 if (QP::QS::rxPriv_.var.flt.idx ==
sizeof(QP::QS::rxPriv_.var.flt.data)) {
557 tran_(WAIT4_FILTER_FRAME);
561 case WAIT4_FILTER_FRAME: {
565 case WAIT4_OBJ_KIND: {
567 QP::QS::rxPriv_.var.obj.kind = b;
568 QP::QS::rxPriv_.var.obj.addr = 0U;
569 QP::QS::rxPriv_.var.obj.idx = 0U;
570 tran_(WAIT4_OBJ_ADDR);
573 rxReportError_(QP::QS::rxPriv_.var.obj.recId);
578 case WAIT4_OBJ_ADDR: {
579 QP::QS::rxPriv_.var.obj.addr |=
580 static_cast<QP::QSObj
>(b) << QP::QS::rxPriv_.var.obj.idx;
581 QP::QS::rxPriv_.var.obj.idx += 8U;
582 if (QP::QS::rxPriv_.var.obj.idx
585 tran_(WAIT4_OBJ_FRAME);
589 case WAIT4_OBJ_FRAME: {
593 case WAIT4_QUERY_KIND: {
595 QP::QS::rxPriv_.var.obj.kind = b;
596 tran_(WAIT4_QUERY_FRAME);
599 rxReportError_(QP::QS::rxPriv_.var.obj.recId);
604 case WAIT4_QUERY_FRAME: {
608 case WAIT4_EVT_PRIO: {
609 QP::QS::rxPriv_.var.evt.prio = b;
610 QP::QS::rxPriv_.var.evt.sig = 0U;
611 QP::QS::rxPriv_.var.evt.idx = 0U;
612 tran_(WAIT4_EVT_SIG);
615 case WAIT4_EVT_SIG: {
616 QP::QS::rxPriv_.var.evt.sig |=
static_cast<QP::QSignal>(
617 static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.evt.idx);
618 QP::QS::rxPriv_.var.evt.idx += 8U;
619 if (QP::QS::rxPriv_.var.evt.idx
622 QP::QS::rxPriv_.var.evt.len = 0U;
623 QP::QS::rxPriv_.var.evt.idx = 0U;
624 tran_(WAIT4_EVT_LEN);
628 case WAIT4_EVT_LEN: {
629 QP::QS::rxPriv_.var.evt.len |=
static_cast<std::uint16_t
>(
630 static_cast<unsigned>(b) << QP::QS::rxPriv_.var.evt.idx);
631 QP::QS::rxPriv_.var.evt.idx += 8U;
632 if (QP::QS::rxPriv_.var.evt.idx == (8U * 2U)) {
633 if ((QP::QS::rxPriv_.var.evt.len +
sizeof(
QP::QEvt))
637 rxReportAck_(QP::QS_RX_EVENT);
640 (
static_cast<std::uint_fast16_t
>(QP::QS::rxPriv_.var.evt.len)
643 static_cast<enum_t>(QP::QS::rxPriv_.var.evt.sig));
645 if (QP::QS::rxPriv_.var.evt.e !=
nullptr) {
646 QP::QS::rxPriv_.var.evt.p =
647 reinterpret_cast<std::uint8_t *
>(QP::QS::rxPriv_.var.evt.e);
648 QP::QS::rxPriv_.var.evt.p = &QP::QS::rxPriv_.var.evt.p[
sizeof(
QP::QEvt)];
649 if (QP::QS::rxPriv_.var.evt.len > 0U) {
650 tran_(WAIT4_EVT_PAR);
653 tran_(WAIT4_EVT_FRAME);
658 static_cast<std::uint8_t
>(QP::QS_RX_EVENT));
664 static_cast<std::uint8_t
>(QP::QS_RX_EVENT));
670 case WAIT4_EVT_PAR: {
671 *QP::QS::rxPriv_.var.evt.p = b;
672 ++QP::QS::rxPriv_.var.evt.p;
673 --QP::QS::rxPriv_.var.evt.len;
674 if (QP::QS::rxPriv_.var.evt.len == 0U) {
675 tran_(WAIT4_EVT_FRAME);
679 case WAIT4_EVT_FRAME: {
685 case WAIT4_TEST_SETUP_FRAME: {
689 case WAIT4_TEST_TEARDOWN_FRAME: {
693 case WAIT4_TEST_CONTINUE_FRAME: {
697 case WAIT4_TEST_PROBE_DATA: {
698 QP::QS::rxPriv_.var.tp.data |=
699 (
static_cast<QP::QSFun
>(b) << QP::QS::rxPriv_.var.tp.idx);
700 QP::QS::rxPriv_.var.tp.idx += 8U;
701 if (QP::QS::rxPriv_.var.tp.idx == (8U *
sizeof(std::uint32_t))) {
702 QP::QS::rxPriv_.var.tp.addr = 0U;
703 QP::QS::rxPriv_.var.tp.idx = 0U;
704 tran_(WAIT4_TEST_PROBE_ADDR);
708 case WAIT4_TEST_PROBE_ADDR: {
709 QP::QS::rxPriv_.var.tp.addr |=
710 (
static_cast<std::uint32_t
>(b) << QP::QS::rxPriv_.var.tp.idx);
711 QP::QS::rxPriv_.var.tp.idx += 8U;
712 if (QP::QS::rxPriv_.var.tp.idx
715 tran_(WAIT4_TEST_PROBE_FRAME);
719 case WAIT4_TEST_PROBE_FRAME: {
730 rxReportError_(0x45U);
738void rxHandleGoodFrame_(std::uint8_t
const state) {
744 case WAIT4_INFO_FRAME: {
748 QP::QS::target_info_pre_(0U);
753 case WAIT4_RESET_FRAME: {
758 case WAIT4_CMD_PARAM1:
759 case WAIT4_CMD_PARAM2:
760 case WAIT4_CMD_PARAM3:
761 case WAIT4_CMD_FRAME: {
762 rxReportAck_(QP::QS_RX_COMMAND);
764 QP::QS::rxPriv_.var.cmd.param2, QP::QS::rxPriv_.var.cmd.param3);
770 rxReportDone_(QP::QS_RX_COMMAND);
773 case WAIT4_TICK_FRAME: {
774 rxReportAck_(QP::QS_RX_TICK);
777 static_cast<std::uint_fast8_t
>(QP::QS::rxPriv_.var.tick.rate),
784 static_cast<std::uint_fast8_t
>(QP::QS::rxPriv_.var.tick.rate),
787 rxReportDone_(QP::QS_RX_TICK);
790 case WAIT4_PEEK_FRAME: {
794 QP::QS::beginRec_(
static_cast<std::uint_fast8_t
>(
796 ptr =
static_cast<std::uint8_t*
>(
798 ptr = &ptr[QP::QS::rxPriv_.var.peek.offs];
800 QS_U16_PRE_(QP::QS::rxPriv_.var.peek.offs);
801 QS_U8_PRE_(QP::QS::rxPriv_.var.peek.size);
802 QS_U8_PRE_(QP::QS::rxPriv_.var.peek.num);
803 for (i = 0U; i < QP::QS::rxPriv_.var.peek.num; ++i) {
804 switch (QP::QS::rxPriv_.var.peek.size) {
810 reinterpret_cast<std::uint16_t*
>(ptr)[i]);
814 reinterpret_cast<std::uint32_t*
>(ptr)[i]);
828 case WAIT4_POKE_DATA: {
830 rxReportError_(
static_cast<std::uint8_t
>(QP::QS_RX_POKE));
833 case WAIT4_POKE_FRAME: {
834 rxReportAck_(QP::QS_RX_POKE);
838 case WAIT4_FILL_FRAME: {
839 rxReportAck_(QP::QS_RX_FILL);
840 ptr =
static_cast<std::uint8_t *
>(
842 ptr = &ptr[QP::QS::rxPriv_.var.poke.offs];
843 for (i = 0U; i < QP::QS::rxPriv_.var.poke.num; ++i) {
844 switch (QP::QS::rxPriv_.var.poke.size) {
847 static_cast<std::uint8_t
>(QP::QS::rxPriv_.var.poke.data);
850 reinterpret_cast<std::uint16_t *
>(ptr)[i] =
851 static_cast<std::uint16_t
>(QP::QS::rxPriv_.var.poke.data);
854 reinterpret_cast<std::uint32_t *
>(ptr)[i] =
855 QP::QS::rxPriv_.var.poke.data;
864 case WAIT4_FILTER_FRAME: {
865 rxReportAck_(
static_cast<enum QP::QSpyRxRecords
>(
866 QP::QS::rxPriv_.var.flt.recId));
869 if (QP::QS::rxPriv_.var.flt.recId
870 ==
static_cast<std::uint8_t
>(QP::QS_RX_GLB_FILTER))
887 else if (QP::QS::rxPriv_.var.flt.recId
888 ==
static_cast<std::uint8_t
>(QP::QS_RX_LOC_FILTER))
897 rxReportError_(QP::QS::rxPriv_.var.flt.recId);
902 case WAIT4_OBJ_FRAME: {
903 i = QP::QS::rxPriv_.var.obj.kind;
905 if (QP::QS::rxPriv_.var.obj.recId
906 ==
static_cast<std::uint8_t
>(QP::QS_RX_CURR_OBJ))
908 QP::QS::rxPriv_.currObj[i] =
909 reinterpret_cast<void *
>(QP::QS::rxPriv_.var.obj.addr);
910 rxReportAck_(QP::QS_RX_CURR_OBJ);
912 else if (QP::QS::rxPriv_.var.obj.recId
913 ==
static_cast<std::uint8_t
>(QP::QS_RX_AO_FILTER))
915 if (QP::QS::rxPriv_.var.obj.addr != 0U) {
916 std::int_fast16_t
const filter =
917 static_cast<std::int_fast16_t
>(
919 QP::QS::rxPriv_.var.obj.addr)->getPrio());
920 QP::QS::locFilter_((i == 0)
923 rxReportAck_(QP::QS_RX_AO_FILTER);
926 rxReportError_(
static_cast<enum_t>(
927 QP::QS_RX_AO_FILTER));
931 rxReportError_(QP::QS::rxPriv_.var.obj.recId);
936 if (QP::QS::rxPriv_.var.obj.recId
937 ==
static_cast<std::uint8_t
>(QP::QS_RX_CURR_OBJ))
940 =
reinterpret_cast<void *
>(QP::QS::rxPriv_.var.obj.addr);
942 =
reinterpret_cast<void *
>(QP::QS::rxPriv_.var.obj.addr);
945 static_cast<enum QP::QSpyRxRecords
>(QP::QS::rxPriv_.var.obj.recId));
948 rxReportError_(QP::QS::rxPriv_.var.obj.recId);
952 case WAIT4_QUERY_FRAME: {
953 queryCurrObj_(QP::QS::rxPriv_.var.obj.kind);
956 case WAIT4_EVT_FRAME: {
964 if (QP::QS::rxPriv_.var.evt.prio == 0U) {
969 QP::QS::rxPriv_.var.evt.e,
977 else if (QP::QS::rxPriv_.var.evt.prio == 255U) {
987 ->dispatch(QP::QS::rxPriv_.var.evt.e, 0U);
994 else if (QP::QS::rxPriv_.var.evt.prio == 254U) {
1004 ->
init(QP::QS::rxPriv_.var.evt.e, 0U);
1011 else if (QP::QS::rxPriv_.var.evt.prio == 253U) {
1016 QP::QS::rxPriv_.var.evt.e,
1032#if (QF_MAX_EPOOL > 0U)
1034 if ((i & 1U) != 0U) {
1039 if ((i & 0x80U) != 0U) {
1040 rxReportError_(
static_cast<std::uint8_t
>(QP::QS_RX_EVENT));
1048 rxReportDone_(QP::QS_RX_EVENT);
1054 case WAIT4_TEST_SETUP_FRAME: {
1055 rxReportAck_(QP::QS_RX_TEST_SETUP);
1056 QP::QS::tstPriv_.tpNum = 0U;
1057 QP::QS::tstPriv_.testTime = 0U;
1063 case WAIT4_TEST_TEARDOWN_FRAME: {
1064 rxReportAck_(QP::QS_RX_TEST_TEARDOWN);
1069 case WAIT4_TEST_CONTINUE_FRAME: {
1070 rxReportAck_(QP::QS_RX_TEST_CONTINUE);
1071 QP::QS::rxPriv_.inTestLoop =
false;
1075 case WAIT4_TEST_PROBE_FRAME: {
1076 rxReportAck_(QP::QS_RX_TEST_PROBE);
1078 QP::QS::tstPriv_.tpNum
1079 < (
sizeof(QP::QS::tstPriv_.tpBuf)
1080 /
sizeof(QP::QS::tstPriv_.tpBuf[0])));
1081 QP::QS::tstPriv_.tpBuf[QP::QS::tstPriv_.tpNum] = QP::QS::rxPriv_.var.tp;
1082 ++QP::QS::tstPriv_.tpNum;
1093 rxReportError_(0x47U);
1100static void rxHandleBadFrame_(std::uint8_t
const state)
noexcept {
1101 rxReportError_(0x50U);
1103 case WAIT4_EVT_FRAME: {
1108#if (QF_MAX_EPOOL > 0U)
1121static void rxReportAck_(
enum QP::QSpyRxRecords
const recId)
noexcept {
1134static void rxReportError_(std::uint8_t
const code)
noexcept {
1139 QS_U8_PRE_(0x80U | code);
1147static void rxReportDone_(
enum QP::QSpyRxRecords
const recId)
noexcept {
1161static void queryCurrObj_(std::uint8_t obj_kind)
noexcept {
1167 if (QP::QS::rxPriv_.currObj[obj_kind] !=
nullptr) {
1172 QS_U8_PRE_(obj_kind);
1173 QS_OBJ_PRE_(QP::QS::rxPriv_.currObj[obj_kind]);
1177 QS_FUN_PRE_(
reinterpret_cast<QP::QHsm *
>(
1178 QP::QS::rxPriv_.currObj[obj_kind])->getStateHandler());
1182 QP::QS::rxPriv_.currObj[obj_kind])->getNFree());
1184 QP::QS::rxPriv_.currObj[obj_kind])->getNMin());
1188 QP::QS::rxPriv_.currObj[obj_kind])->getNFree());
1190 QP::QS::rxPriv_.currObj[obj_kind])->getNMin());
1194 QP::QS::rxPriv_.currObj[obj_kind])->getAct());
1196 QP::QS::rxPriv_.currObj[obj_kind])->getCtr());
1198 QP::QS::rxPriv_.currObj[obj_kind])->getInterval());
1200 QP::QS::rxPriv_.currObj[obj_kind])->sig);
1202 QP::QS::rxPriv_.currObj[obj_kind])->refCtr_);
1214 rxReportError_(
static_cast<std::uint8_t
>(QP::QS_RX_AO_FILTER));
1219static void rxPoke_() noexcept {
1220 std::uint8_t * ptr =
1221 static_cast<std::uint8_t *
>(QP::QS::rxPriv_.currObj[
QP::QS::AP_OBJ]);
1222 ptr = &ptr[QP::QS::rxPriv_.var.poke.offs];
1223 switch (QP::QS::rxPriv_.var.poke.size) {
1225 *ptr =
static_cast<std::uint8_t
>(QP::QS::rxPriv_.var.poke.data);
1228 *
reinterpret_cast<std::uint16_t *
>(ptr)
1229 =
static_cast<std::uint16_t
>(QP::QS::rxPriv_.var.poke.data);
1232 *
reinterpret_cast<std::uint32_t *
>(ptr) = QP::QS::rxPriv_.var.poke.data;
1239 QP::QS::rxPriv_.var.poke.data = 0U;
1240 QP::QS::rxPriv_.var.poke.idx = 0U;
1241 QP::QS::rxPriv_.var.poke.offs +=
static_cast<std::uint16_t
>(QP::QS::rxPriv_.var.poke.size);
Active object class (based on the QHsm implementation strategy)
static void publish_(QEvt const *const e, void const *const sender, std::uint_fast8_t const qsId) noexcept
static QActive * registry_[QF_MAX_ACTIVE+1U]
Abstract State Machine class (state machine interface)
Hierarchical State Machine class (QHsm-style state machine implementation strategy)
static void tick1_(std::uint_fast8_t const tickRate, void const *const sender)
static void tick(std::uint_fast8_t const tickRate, void const *const sender) noexcept
std::uint_fast16_t poolGetMaxBlockSize() noexcept
QEvt * newX_(std::uint_fast16_t const evtSize, std::uint_fast16_t const margin, enum_t const sig) noexcept
void gc(QEvt const *const e) noexcept
void rxInitBuf(std::uint8_t *const sto, std::uint16_t const stoSize) noexcept
std::uint16_t rxGetNfree() noexcept
@ SM_AO_OBJ
combination of SM and AO
void setCurrObj(std::uint8_t const obj_kind, void *const obj_ptr)
void onCommand(std::uint8_t cmdId, std::uint32_t param1, std::uint32_t param2, std::uint32_t param3)
@ SM_OBJ
state machine object
@ TE_OBJ
time event object
@ AP_OBJ
generic Application-specific object
@ MP_OBJ
event pool object
void QEvt_refCtr_inc_(QEvt const *const e) noexcept
@ QS_TARGET_DONE
reports completion of a user callback
@ QS_QUERY_DATA
reports the data from "current object" query
@ QS_RX_STATUS
reports QS data receive status
@ QS_PEEK_DATA
reports the data from the PEEK query
@ QS_OBJ_DICT
object dictionary entry
Internal (package scope) QP/C++ interface.
QS/C++ package-scope interface.
QS/C++ port to a 32-bit CPU, generic C++ compiler.
QP Functional Safety (FuSa) Subsystem.
#define Q_ASSERT_INCRIT(id_, expr_)
#define Q_REQUIRE_INCRIT(id_, expr_)