aboutsummaryrefslogtreecommitdiffstats
path: root/fw/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/main.c')
-rw-r--r--fw/main.c68
1 files changed, 24 insertions, 44 deletions
diff --git a/fw/main.c b/fw/main.c
index d8856b5..c88b713 100644
--- a/fw/main.c
+++ b/fw/main.c
@@ -93,26 +93,12 @@ loadSigFmts(void) {
U8 oldGie, k;
Status status;
- // TODO:
- // This is a stub to load hard-coded SigFmts until the serialization format is finalized.
- for (k = 0u; k < NSIG; k++) {
- sigFmts[k] = (SigFmt) {
- .id = {
- .isExt = true,
- .eid = 2365480958},
- .start = 24u,
- .size = 16u,
- .order = LITTLE_ENDIAN,
- .isSigned = false,
- }; // J1939 EngineSpeed
- }
-
// Disable interrupts so the volatile address pointers can be passed safely
oldGie = INTCONbits.GIE;
INTCONbits.GIE = 0;
for (k = 0u; k < NSIG; k++) {
- status = serReadSigFmt(sigFmtAddrs[k], (SigFmt*)&sigFmts[k]);
+ status = serReadSigFmt(sigFmtAddrs[k], (SigFmt *)&sigFmts[k]);
if (status != OK) {
INTCONbits.GIE = oldGie; // restore previous interrupt setting
return ERR;
@@ -121,9 +107,23 @@ loadSigFmts(void) {
// Restore previous interrupt setting
INTCONbits.GIE = oldGie;
+
return OK;
}
+// Transmit an error code (typically a line number) to the CAN bus.
+static void
+txErrFrame(Status err) {
+ CanFrame frame;
+
+ frame.id = (CanId){.isExt = true, .eid = ERR_CAN_ID};
+ frame.rtr = false;
+ frame.dlc = 2u;
+ frame.data[0u] = (err >> 8u) & 0xFF;
+ frame.data[1u] = (err >> 0u) & 0xFF;
+ (void)canTx(&frame);
+}
+
static void
reset(void) {
_delay(100000);
@@ -136,15 +136,9 @@ main(void) {
sysInit();
spiInit();
- eepromInit();
- dacInit();
canInit();
-
- // Load signals' encoding formats and CAN IDs from EEPROM
- status = loadSigFmts();
- if (status != OK) {
- // TODO reset();
- }
+ dacInit();
+ eepromInit();
// Setup MCP2515 CAN controller
canSetBitTiming(CAN_TIMING);
@@ -156,6 +150,13 @@ main(void) {
canIE(true); // enable interrupts on MCP2515's INT pin
canSetMode(CAN_MODE_NORMAL);
+ // Load signals' encoding formats and CAN IDs from EEPROM
+ status = loadSigFmts();
+ if (status != OK) {
+ txErrFrame(status);
+ reset();
+ }
+
// TODO: remove
// Setup TMR1
T1CON = 0x31; // Fosc/4, 1:8 prescaler
@@ -231,15 +232,6 @@ setSigFmt(const CanFrame *frame) {
SigFmt sigFmt;
Status status;
- // TODO:remove
- CanFrame response;
- response.id = (CanId){.isExt=true, .eid = 0xDEF};
- response.rtr = false;
- response.dlc = 2u;
- response.data[0u] = 0xDE;
- response.data[1u] = 0xFA;
- canTx(&response);
-
// Extract signal number from ID
sig = frame->id.eid & 0xF;
if (sig >= NSIG) {
@@ -378,18 +370,6 @@ handleSigFrame(const CanFrame *frame) {
return result;
}
-static void
-txErrFrame(Status err) {
- CanFrame frame;
-
- frame.id = (CanId){.isExt = true, .eid = ERR_CAN_ID};
- frame.rtr = false;
- frame.dlc = 2u;
- frame.data[0u] = (err >> 8u) & 0xFF;
- frame.data[1u] = (err >> 0u) & 0xFF;
- (void)canTx(&frame);
-}
-
void
__interrupt() isr(void) {
U8 rxStatus;