PRT_VALUE *P_FUN_CommanderMachine_SendCommandToPx4_IMPL(PRT_MACHINEINST *context) { PRT_MACHINEINST_PRIV *p_tmp_mach_priv = (PRT_MACHINEINST_PRIV *)context; PRT_FUNSTACK_INFO p_tmp_frame; PrtPopFrame(p_tmp_mach_priv, &p_tmp_frame); PRT_VALUE* caller = p_tmp_frame.locals[0]; PRT_VALUE* cmdId = p_tmp_frame.locals[2]; int cmd = 0; if (cmdId->discriminator == PRT_VALUE_KIND_INT) { cmd = PrtPrimGetInt(cmdId); } PRT_VALUE* confirmValue = p_tmp_frame.locals[1]; bool confirm = false; if (confirmValue->discriminator == PRT_VALUE_KIND_BOOL) { confirm = (PrtPrimGetBool(confirmValue) == PRT_TRUE); } float floats[7] = { 0,0,0,0,0,0,0 }; // gray the remaining 7 arguments and convert them to float values. for (int i = 3; i < 3 + 7; i++) { PRT_VALUE* arg = p_tmp_frame.locals[i]; float value = PrtGetFloat32(arg); floats[i - 3] = value; } EventTrace(PProgram, 0, "Sending command: %d, with args (%f,%f,%f,%f,%f,%f,%f)\n", cmd, floats[0], floats[1], floats[2], floats[3], floats[4], floats[5], floats[6]); SendCommand(cmd, confirm, floats[0], floats[1], floats[2], floats[3], floats[4], floats[5], floats[6]); PrtFreeLocals(p_tmp_mach_priv, &p_tmp_frame); return NULL; }
static void PrtUserPrintValue(_In_ PRT_VALUE *value, _Inout_ char **buffer, _Inout_ PRT_UINT32 *bufferSize, _Inout_ PRT_UINT32 *numCharsWritten) { PRT_STRING frgnStr; PRT_VALUE_KIND kind = value->discriminator; switch (kind) { case PRT_VALUE_KIND_NULL: PrtUserPrintString("null", buffer, bufferSize, numCharsWritten); break; case PRT_VALUE_KIND_BOOL: PrtUserPrintString(PrtPrimGetBool(value) == PRT_TRUE ? "true" : "false", buffer, bufferSize, numCharsWritten); break; case PRT_VALUE_KIND_INT: PrtUserPrintInt32(PrtPrimGetInt(value), buffer, bufferSize, numCharsWritten); break; case PRT_VALUE_KIND_EVENT: PrtUserPrintString("<", buffer, bufferSize, numCharsWritten); PrtUserPrintUint32(PrtPrimGetEvent(value), buffer, bufferSize, numCharsWritten); PrtUserPrintString(">", buffer, bufferSize, numCharsWritten); break; case PRT_VALUE_KIND_MID: PrtUserPrintMachineId(PrtPrimGetMachine(value), buffer, bufferSize, numCharsWritten); break; case PRT_VALUE_KIND_FORGN: frgnStr = prtForeignTypeDecls[value->valueUnion.frgn->typeTag].toStringFun(value->valueUnion.frgn->value); PrtUserPrintString(frgnStr, buffer, bufferSize, numCharsWritten); PrtFree(frgnStr); break; case PRT_VALUE_KIND_MAP: { PRT_MAPVALUE *mval = value->valueUnion.map; PRT_MAPNODE *next = mval->first; PrtUserPrintString("{", buffer, bufferSize, numCharsWritten); while (next != NULL) { PrtUserPrintValue(next->key, buffer, bufferSize, numCharsWritten); PrtUserPrintString(" --> ", buffer, bufferSize, numCharsWritten); PrtUserPrintValue(next->value, buffer, bufferSize, numCharsWritten); if (next->bucketNext != NULL) { PrtUserPrintString("*", buffer, bufferSize, numCharsWritten); } if (next->insertNext != NULL) { PrtUserPrintString(", ", buffer, bufferSize, numCharsWritten); } next = next->insertNext; } PrtUserPrintString("} (", buffer, bufferSize, numCharsWritten); PrtUserPrintUint32(mval->size, buffer, bufferSize, numCharsWritten); PrtUserPrintString(" / ", buffer, bufferSize, numCharsWritten); PrtUserPrintUint32(PrtMapCapacity(value), buffer, bufferSize, numCharsWritten); PrtUserPrintString(")", buffer, bufferSize, numCharsWritten); break; } case PRT_VALUE_KIND_SEQ: { PRT_UINT32 i; PRT_SEQVALUE *sVal = value->valueUnion.seq; PrtUserPrintString("[", buffer, bufferSize, numCharsWritten); for (i = 0; i < sVal->size; ++i) { PrtUserPrintValue(sVal->values[i], buffer, bufferSize, numCharsWritten); if (i < sVal->size - 1) { PrtUserPrintString(", ", buffer, bufferSize, numCharsWritten); } } PrtUserPrintString("]", buffer, bufferSize, numCharsWritten); break; } case PRT_VALUE_KIND_TUPLE: { PRT_UINT32 i; PRT_TUPVALUE *tval = value->valueUnion.tuple; PrtUserPrintString("(", buffer, bufferSize, numCharsWritten); if (tval->size == 1) { PrtUserPrintValue(tval->values[0], buffer, bufferSize, numCharsWritten); PrtUserPrintString(",)", buffer, bufferSize, numCharsWritten); } else { for (i = 0; i < tval->size; ++i) { PrtUserPrintValue(tval->values[i], buffer, bufferSize, numCharsWritten); if (i < tval->size - 1) { PrtUserPrintString(", ", buffer, bufferSize, numCharsWritten); } else { PrtUserPrintString(")", buffer, bufferSize, numCharsWritten); } } } break; } default: PrtAssert(PRT_FALSE, "PrtUserPrintValue: Invalid value"); break; } }