float64 int32_to_float64 (int32 a) { flag zSign; uint32 absA; int8 shiftCount; bits64 zSig; if (a == 0) return 0; zSign = (a < 0); absA = zSign ? -a : a; shiftCount = countLeadingZeros32 (absA) + 21; zSig = absA; return packFloat64 (zSign, 0x432 - shiftCount, zSig << shiftCount); }
/*----------------------------------------------------------------------------*/ static void sendMessage(struct Can *interface, const struct CanMessage *message, uint32_t *status) { assert(message->length <= 8); uint32_t command = interface->mode != MODE_LOOPBACK ? CMR_TR : CMR_SRR; uint32_t information = TFI_DLC(message->length); if (message->flags & CAN_EXT_ID) { assert(message->id < (1UL << 29)); information |= TFI_FF; } else { assert(message->id < (1UL << 11)); } LPC_CAN_Type * const reg = interface->base.reg; const unsigned int position = countLeadingZeros32(reverseBits32(*status)); const unsigned int index = SR_TBS_VALUE_TO_CHANNEL(position); if (!(message->flags & CAN_RTR)) { uint32_t data[2]; memcpy(data, message->data, sizeof(data)); reg->TX[index].TDA = data[0]; reg->TX[index].TDB = data[1]; } else { information |= TFI_RTR; } reg->TX[index].TFI = information | TFI_PRIO(interface->sequence); reg->TX[index].TID = message->id; reg->CMR = command | CMR_STB(index); *status &= ~BIT(position); ++interface->sequence; }