public bool getVoltages(UInt32 CanID) { CAN.VCI_CAN_OBJ [] rx1, rx2 = {}, rx; byte[] txBuf = { (byte)CANCMD.CAN_CMD_SEND_VOLTAGES }; ctl.sendData(txBuf, 0xA, false, true); //Get the first can frame and determine the length ctl.getCanFrames(out rx1, 1); UInt16 cmd = (ushort)(rx1[0].Data[0] | rx1[0].Data[1] << 8); UInt16 voltageCount = (ushort)(rx1[0].Data[2] | rx1[0].Data[3] << 8); if (cmd != (byte)CANCMD.CAN_CMD_SEND_VOLTAGES) { return(false); } //Receive any more frames required int rxLen = (voltageCount - 2 + 3) / 4; if (rxLen > 0) { ctl.getCanFrames(out rx2, rxLen); } //Copy both receive arrays into one rx = new CAN.VCI_CAN_OBJ[rx1.Length + rx2.Length]; rx1.CopyTo(rx, 0); rx2.CopyTo(rx, rx1.Length); UInt16 [] voltages = new UInt16 [voltageCount]; //Get ushort data out of receive array for (int i = 0; i < voltageCount; i++) { voltages[i] = (ushort)(rx[2 * (i + 2) / 8].Data[2 * (i + 2) % 8] | rx[2 * (i + 2) / 8].Data[2 * (i + 2) % 8 + 1] << 8); } packData.voltages = new float[voltageCount]; //Convert to float for (int i = 0; i < voltageCount; i++) { packData.voltages[i] = (float)voltages[i] * VOLTS_PER_COUNT; } if (voltages.Length != config.cellCount) { return(false); } return(true); }
public bool getCanFrame(out CAN.VCI_CAN_OBJ frame) { if (rxFrameCount() > 0) { frame = rxBuffer[rxBufferRPos]; rxBufferRPos = (rxBufferRPos + 1) % RX_BUF_SIZE; return(true); } else { frame = new CAN.VCI_CAN_OBJ(); return(false); } }
public bool getLoadEn(UInt32 CanID) { CAN.VCI_CAN_OBJ[] rx1, rx2 = { }, rx; byte[] txBuf = { (byte)CANCMD.CAN_CMD_SEND_LOAD_EN }; ctl.sendData(txBuf, 0xA, false, true); //Get the first can frame and determine the length ctl.getCanFrames(out rx1, 1); UInt16 cmd = (ushort)(rx1[0].Data[0] | rx1[0].Data[1] << 8); UInt16 cellCount = (ushort)(rx1[0].Data[2] | rx1[0].Data[3] << 8); if (cmd != (byte)CANCMD.CAN_CMD_SEND_LOAD_EN) { return(false); } UInt16 bytes = (ushort)((cellCount + 7) / 8); //Number of bytes requred to hold cellCount bits //Receive any more frames required int rxLen = (bytes - 4 + 7) / 8; if (rxLen > 0) { ctl.getCanFrames(out rx2, rxLen); } //Copy both receive arrays into one rx = new CAN.VCI_CAN_OBJ[rx1.Length + rx2.Length]; rx1.CopyTo(rx, 0); rx2.CopyTo(rx, rx1.Length); packData.loadEn = new bool[cellCount]; //Extract the load enable bool array from the packed binary data received from the BMS, taking into account 4 byte header for (int i = 0; i < cellCount; i++) { packData.loadEn[i] = (rx[(i / 8 + 4) / 8].Data[(i / 8 + 4) % 8] & (1 << (i % 8))) != 0; } if (packData.loadEn.Length != config.cellCount) { return(false); } return(true); }
public ushort[] getLocalVoltages(UInt32 CanID) { UInt32 retval; CAN.VCI_CAN_OBJ[] send = new CAN.VCI_CAN_OBJ[1]; CAN.VCI_CAN_OBJ[] receive; VoltagesStr vStr; send[0].ID = CanID; send[0].TimeFlag = 0; send[0].SendType = 0; send[0].RemoteFlag = 0; send[0].ExternFlag = 1; send[0].DataLen = 1; send[0].Data = new byte[8]; send[0].Data[0] = (byte)CANCMD.CAN_CMD_GET_LOCAL_VOLTAGES; retval = CAN.VCI_Transmit(CAN.DEV_USBCAN2, 0, 0, send, 1); if (retval != CAN.STATUS_OK) { return(new ushort[0]); } ctl.getCanFrames(out receive, 2); byte[] buffer = new byte[Marshal.SizeOf(typeof(VoltagesStr))]; for (int i = 0; i < buffer.Length; i++) { buffer[i] = receive[i / 8].Data[i % 8]; } vStr = StructTools.byteArray2Struct <VoltagesStr>(buffer); return(vStr.voltages); }
private void cmdTx_Click(object sender, EventArgs e) { UInt32 retval; if (CANConnected) { CAN.VCI_CAN_OBJ[] send = new CAN.VCI_CAN_OBJ[1]; CAN.VCI_CAN_OBJ[] receive = new CAN.VCI_CAN_OBJ[3]; send[0].ID = 0xA; send[0].TimeFlag = 0; send[0].SendType = 0; send[0].RemoteFlag = 0; send[0].ExternFlag = 1; send[0].DataLen = 1; send[0].Data = new byte[8]; send[0].Data[0] = 0; retval = CAN.VCI_Transmit(CAN.DEV_USBCAN2, 0, 0, send, 1); receive[0].Data = new byte[8]; receive[1].Data = new byte[8]; receive[2].Data = new byte[8]; receive[0].Reserved = new byte[3]; receive[1].Reserved = new byte[3]; receive[2].Reserved = new byte[3]; retval = CAN.VCI_Receive(CAN.DEV_USBCAN2, 0, 0, receive, 50, 1000); //retval = CAN.VCI_Receive(CAN.DEV_USBCAN2, 0, 0, receive, 1, 1000); //retval = CAN.VCI_Receive(CAN.DEV_USBCAN2, 0, 0, receive, 1, 1000); int a; a = 0; } }
public bool saveCalibration(UInt32 CanID) { UInt32 retval; CAN.VCI_CAN_OBJ[] send = new CAN.VCI_CAN_OBJ[1]; CAN.VCI_CAN_OBJ[] receive; VoltagesStr vStr; send[0].ID = CanID; send[0].TimeFlag = 0; send[0].SendType = 0; send[0].RemoteFlag = 0; send[0].ExternFlag = 1; send[0].DataLen = 1; send[0].Data = new byte[8]; send[0].Data[0] = (byte)CANCMD.CAN_CMD_SAVE_CAL; retval = CAN.VCI_Transmit(CAN.DEV_USBCAN2, 0, 0, send, 1); if (retval != CAN.STATUS_OK) { return(false); } ctl.getCanFrames(out receive, 1); if (receive[0].Data[0] == (byte)CANCMD.CAN_CMD_SAVE_CAL) { return(true); } else { return(false); } }
public bool setPassthrough(UInt32 CanID, bool passthrough) { UInt32 retval; CAN.VCI_CAN_OBJ[] send = new CAN.VCI_CAN_OBJ[1]; send[0].ID = CanID; send[0].TimeFlag = 0; send[0].SendType = 0; send[0].RemoteFlag = 0; send[0].ExternFlag = 1; send[0].DataLen = 1; send[0].Data = new byte[8]; send[0].Data[0] = (byte)(passthrough ? CANCMD.CAN_CMD_SET_BALBUS_PASSTHROUGH : CANCMD.CAN_CMD_CLEAR_BALBUS_PASSTHROUGH); retval = CAN.VCI_Transmit(CAN.DEV_USBCAN2, 0, 0, send, 1); if (retval != CAN.STATUS_OK) { return(false); } return(true); }