first shunt integration (incomplete)
This commit is contained in:
parent
826318652d
commit
bbb2534987
@ -1,5 +1,5 @@
|
|||||||
export interface AMSMessage {
|
export interface AMSMessage {
|
||||||
type: 'error' | 'status' | 'slaveStatus' | 'slaveLog';
|
type: 'error' | 'status' | 'shunt' | 'slaveStatus' | 'slaveLog';
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AMSError extends AMSMessage {
|
export interface AMSError extends AMSMessage {
|
||||||
@ -29,6 +29,30 @@ export interface AMSStatus extends AMSMessage {
|
|||||||
// TODO: IMD state & R_iso
|
// TODO: IMD state & R_iso
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Shunt extends AMSMessage {
|
||||||
|
type: 'shunt';
|
||||||
|
|
||||||
|
logType: 'current' | 'voltage1' | 'voltage2';
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ShuntCurrent extends Shunt {
|
||||||
|
logType: 'current';
|
||||||
|
|
||||||
|
current: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ShuntVoltage1 extends Shunt {
|
||||||
|
logType: 'voltage1';
|
||||||
|
|
||||||
|
voltage: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ShuntVoltage2 extends Shunt {
|
||||||
|
logType: 'voltage2';
|
||||||
|
|
||||||
|
voltage: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface SlaveStatus extends AMSMessage {
|
export interface SlaveStatus extends AMSMessage {
|
||||||
type: 'slaveStatus';
|
type: 'slaveStatus';
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { AMSError, AMSMessage, AMSStatus, SlaveLog, SlaveStatus } from '$lib/messages';
|
import type { AMSError, AMSMessage, AMSStatus, Shunt, ShuntCurrent, ShuntVoltage1, ShuntVoltage2, SlaveLog, SlaveStatus } from '$lib/messages';
|
||||||
import { source } from 'sveltekit-sse';
|
import { source } from 'sveltekit-sse';
|
||||||
import MasterStatusDisplay from './master-status-display.svelte';
|
import MasterStatusDisplay from './master-status-display.svelte';
|
||||||
import SlaveStatusDisplay from './slave-status-display.svelte';
|
import SlaveStatusDisplay from './slave-status-display.svelte';
|
||||||
|
import ShuntStatusDisplay from './shunt-status-display.svelte';
|
||||||
import '../app.css';
|
import '../app.css';
|
||||||
import MasterErrorDisplay from './master-error-display.svelte';
|
import MasterErrorDisplay from './master-error-display.svelte';
|
||||||
import { SlaveLogData } from '$lib/slave-log';
|
import { SlaveLogData } from '$lib/slave-log';
|
||||||
@ -10,6 +11,10 @@
|
|||||||
|
|
||||||
let error: AMSError | undefined;
|
let error: AMSError | undefined;
|
||||||
let amsStatus: AMSStatus | undefined;
|
let amsStatus: AMSStatus | undefined;
|
||||||
|
let shunt: Shunt | undefined;
|
||||||
|
let shuntA: ShuntCurrent | undefined
|
||||||
|
let shuntV1: ShuntVoltage1 | undefined;
|
||||||
|
let shuntV2: ShuntVoltage2 | undefined;
|
||||||
let slaveStatus: Record<number, SlaveStatus> = {};
|
let slaveStatus: Record<number, SlaveStatus> = {};
|
||||||
let slaveLog: Record<number, SlaveLogData> = {};
|
let slaveLog: Record<number, SlaveLogData> = {};
|
||||||
|
|
||||||
@ -35,6 +40,9 @@
|
|||||||
case 'status':
|
case 'status':
|
||||||
amsStatus = msg as AMSStatus;
|
amsStatus = msg as AMSStatus;
|
||||||
break;
|
break;
|
||||||
|
case 'shunt':
|
||||||
|
shunt = msg as Shunt;
|
||||||
|
break;
|
||||||
case 'slaveStatus': {
|
case 'slaveStatus': {
|
||||||
const status = msg as SlaveStatus;
|
const status = msg as SlaveStatus;
|
||||||
slaveStatus[status.slaveId] = status;
|
slaveStatus[status.slaveId] = status;
|
||||||
|
@ -4,6 +4,10 @@ import type {
|
|||||||
AMSError,
|
AMSError,
|
||||||
AMSMessage,
|
AMSMessage,
|
||||||
AMSStatus,
|
AMSStatus,
|
||||||
|
Shunt,
|
||||||
|
ShuntCurrent,
|
||||||
|
ShuntVoltage1,
|
||||||
|
ShuntVoltage2,
|
||||||
SlaveLog,
|
SlaveLog,
|
||||||
SlaveLogLastCell,
|
SlaveLogLastCell,
|
||||||
SlaveLogTemperature,
|
SlaveLogTemperature,
|
||||||
@ -18,6 +22,8 @@ const CAN_ID_AMS_SLAVE_STATUS_BASE = 0x080;
|
|||||||
const CAN_ID_AMS_SLAVE_STATUS_MASK = 0xff0;
|
const CAN_ID_AMS_SLAVE_STATUS_MASK = 0xff0;
|
||||||
const CAN_ID_AMS_SLAVE_LOG_BASE = 0x600;
|
const CAN_ID_AMS_SLAVE_LOG_BASE = 0x600;
|
||||||
const CAN_ID_AMS_SLAVE_LOG_MASK = 0xf00;
|
const CAN_ID_AMS_SLAVE_LOG_MASK = 0xf00;
|
||||||
|
const CAN_ID_AMS_SHUNT_BASE = 0x520;
|
||||||
|
const CAN_ID_AMS_SHUNT_MASK = 0xff0;
|
||||||
|
|
||||||
type RawMessage = {
|
type RawMessage = {
|
||||||
ext?: boolean;
|
ext?: boolean;
|
||||||
@ -59,6 +65,45 @@ function decodeStatus(msg: RawMessage): AMSStatus | null {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function decodeShunt(msg: RawMessage): Shunt | null {
|
||||||
|
if (msg.data.length != 6) {
|
||||||
|
console.warn( 'invalid shunt frame', msg);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const index = msg.id & 0x00f;
|
||||||
|
const data = msg.data;
|
||||||
|
if (index == 1) {
|
||||||
|
const msg: ShuntCurrent = {
|
||||||
|
type: 'shunt',
|
||||||
|
|
||||||
|
logType: 'current',
|
||||||
|
current: data.readInt32BE(2) * 1e-3,
|
||||||
|
};
|
||||||
|
return msg;
|
||||||
|
} else if (index == 2) {
|
||||||
|
const msg: ShuntVoltage1 = {
|
||||||
|
type: 'shunt',
|
||||||
|
|
||||||
|
logType: 'voltage1',
|
||||||
|
voltage: data.readInt32BE(2) * 1e-3,
|
||||||
|
};
|
||||||
|
return msg;
|
||||||
|
} else if (index == 3) {
|
||||||
|
const msg: ShuntVoltage2 = {
|
||||||
|
type: 'shunt',
|
||||||
|
|
||||||
|
logType: 'voltage2',
|
||||||
|
voltage: data.readInt32BE(2) * 1e-3,
|
||||||
|
};
|
||||||
|
return msg;
|
||||||
|
} else {
|
||||||
|
console.warn('Unknown shunt index', msg.id);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function decodeSlaveStatus(msg: RawMessage): SlaveStatus | null {
|
function decodeSlaveStatus(msg: RawMessage): SlaveStatus | null {
|
||||||
if (msg.data.length != 8) {
|
if (msg.data.length != 8) {
|
||||||
console.warn('invalid slave status frame', msg);
|
console.warn('invalid slave status frame', msg);
|
||||||
@ -139,7 +184,9 @@ export function POST() {
|
|||||||
{ id: CAN_ID_AMS_ERROR, mask: 0xfff },
|
{ id: CAN_ID_AMS_ERROR, mask: 0xfff },
|
||||||
{ id: CAN_ID_AMS_STATUS, mask: 0xfff },
|
{ id: CAN_ID_AMS_STATUS, mask: 0xfff },
|
||||||
{ id: CAN_ID_AMS_SLAVE_STATUS_BASE, mask: CAN_ID_AMS_SLAVE_STATUS_MASK },
|
{ id: CAN_ID_AMS_SLAVE_STATUS_BASE, mask: CAN_ID_AMS_SLAVE_STATUS_MASK },
|
||||||
{ id: CAN_ID_AMS_SLAVE_LOG_BASE, mask: CAN_ID_AMS_SLAVE_LOG_MASK }
|
{ id: CAN_ID_AMS_SLAVE_LOG_BASE, mask: CAN_ID_AMS_SLAVE_LOG_MASK },
|
||||||
|
{ id: CAN_ID_AMS_SHUNT_BASE, mask:
|
||||||
|
CAN_ID_AMS_SHUNT_MASK }
|
||||||
]);
|
]);
|
||||||
|
|
||||||
network.addListener('onMessage', (msg: RawMessage) => {
|
network.addListener('onMessage', (msg: RawMessage) => {
|
||||||
@ -153,6 +200,8 @@ export function POST() {
|
|||||||
message = decodeSlaveStatus(msg);
|
message = decodeSlaveStatus(msg);
|
||||||
} else if ((msg.id & CAN_ID_AMS_SLAVE_LOG_MASK) == CAN_ID_AMS_SLAVE_LOG_BASE) {
|
} else if ((msg.id & CAN_ID_AMS_SLAVE_LOG_MASK) == CAN_ID_AMS_SLAVE_LOG_BASE) {
|
||||||
message = decodeSlaveLog(msg);
|
message = decodeSlaveLog(msg);
|
||||||
|
} else if ((msg.id & CAN_ID_AMS_SHUNT_MASK) == CAN_ID_AMS_SHUNT_BASE) {
|
||||||
|
message = decodeShunt(msg);
|
||||||
} else {
|
} else {
|
||||||
switch (msg.id) {
|
switch (msg.id) {
|
||||||
case CAN_ID_AMS_ERROR:
|
case CAN_ID_AMS_ERROR:
|
||||||
|
38
src/routes/shunt-status-display.svelte
Normal file
38
src/routes/shunt-status-display.svelte
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import type { Shunt, ShuntCurrent, ShuntVoltage1, ShuntVoltage2 } from "$lib/messages";
|
||||||
|
export let shuntData: Shunt | undefined;
|
||||||
|
export let shuntA: ShuntCurrent | undefined;
|
||||||
|
export let shuntV1: ShuntVoltage1 | undefined;
|
||||||
|
export let shuntV2: ShuntVoltage2 | undefined;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="shunt-content">
|
||||||
|
{#if shuntData}
|
||||||
|
<h2><b>Shunt Data</b></h2>
|
||||||
|
<div class="log-collumn">
|
||||||
|
<div>Current: {Math.round(shuntA.current * 100) / 100} </div>
|
||||||
|
<div>Battery side voltage: {Math.round(shuntV1.voltage * 100) / 100}</div>
|
||||||
|
<div>Vehicle side voltage: {Math.round(shuntV2.voltage * 100) / 100}</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.shunt-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 12vw;
|
||||||
|
border: 2px solid black;
|
||||||
|
padding: 2px;
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.log-collumn {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
x
Reference in New Issue
Block a user