void setupIO(byte clr) { int idx = 0; // all digital I/O ADCON0 = 0x00; ADCON1 = 0x0F; TRISBbits.TRISB5 = 0; // LED1 cbus activity TRISBbits.TRISB7 = 0; // LED2 learning mode TRISBbits.TRISB6 = 0; // LED3 running TRISAbits.TRISA2 = 1; /* SW */ TRISCbits.TRISC0 = 1; /* RFID1 */ TRISCbits.TRISC1 = 1; /* RFID2 */ TRISCbits.TRISC2 = 1; /* RFID3 */ TRISCbits.TRISC3 = 1; /* RFID4 */ TRISCbits.TRISC4 = 1; /* RFID8 */ TRISCbits.TRISC5 = 1; /* RFID7 */ TRISCbits.TRISC6 = 1; /* RFID6 */ TRISCbits.TRISC7 = 1; /* RFID5 */ TRISAbits.TRISA0 = 1; /* SENS1 */ TRISAbits.TRISA1 = 1; /* SENS2 */ TRISAbits.TRISA3 = 1; /* SENS3 */ TRISAbits.TRISA4 = 1; /* SENS4 */ TRISAbits.TRISA5 = 1; /* SENS5 */ TRISBbits.TRISB0 = 1; /* SENS6 */ TRISBbits.TRISB4 = 1; /* SENS7 */ TRISBbits.TRISB1 = 1; /* SENS8 */ LED1 = PORT_OFF; LED2 = PORT_OFF; LED3 = PORT_OFF; if (checkFlimSwitch() || eeRead(EE_CLEAN) == 0xFF) { eeWrite(EE_CLEAN, 0); for (idx = 0; idx < 16; idx++) { eeWriteShort(EE_PORT_ADDR + 2 * idx, idx + 1); } for (idx = 0; idx < 5 * 5; idx++) { eeWrite(EE_RFID + idx, 0); } } for (idx = 0; idx < 8; idx++) { RFID[idx].addr = eeReadShort(EE_PORT_ADDR + 2 * idx); Sensor[idx].addr = eeReadShort(EE_PORT_ADDR + 16 + 2 * idx); // read rfid for SoD RFID[idx].data[0] = eeRead(EE_SCANRFID + idx * 5 + 0); RFID[idx].data[1] = eeRead(EE_SCANRFID + idx * 5 + 1); RFID[idx].data[2] = eeRead(EE_SCANRFID + idx * 5 + 2); RFID[idx].data[3] = eeRead(EE_SCANRFID + idx * 5 + 3); RFID[idx].data[4] = eeRead(EE_SCANRFID + idx * 5 + 4); } for (idx = 0; idx < 5; idx++) { AllowedRFID[idx].data[0] = eeRead(EE_RFID + idx * 5 + 0); AllowedRFID[idx].data[1] = eeRead(EE_RFID + idx * 5 + 1); AllowedRFID[idx].data[2] = eeRead(EE_RFID + idx * 5 + 2); AllowedRFID[idx].data[3] = eeRead(EE_RFID + idx * 5 + 3); AllowedRFID[idx].data[4] = eeRead(EE_RFID + idx * 5 + 4); } }
void setupIO(byte clr) { int idx = 0; byte firstTime = eeRead(EE_FIRSTTIME); // all digital I/O ADCON0 = 0x00; ADCON1 = 0x0F; TRISBbits.TRISB6 = 0; /* LED1 */ TRISBbits.TRISB7 = 0; /* LED2 */ TRISBbits.TRISB5 = 0; /* LED3 */ TRISAbits.TRISA2 = 1; /* Push button */ LED1 = 0; LED2 = 0; LED3 = 0; if (firstTime == 0xFF) { eeWrite(EE_FIRSTTIME, 0); clr = TRUE; } // following presets are written to eeprom if the flim switch is preshed at boot // preset port 1-8 as output for (idx = 0; idx < 8; idx++) { Ports[idx].cfg = PORTCFG_OUT; Ports[idx].status = 0; Ports[idx].timedoff = 0; Ports[idx].timer = 0; Ports[idx].evtnn = 0; Ports[idx].addr = idx + 1; if (clr) { eeWrite(EE_PORTCFG + idx, Ports[idx].cfg); eeWriteShort(EE_PORTNN + (2 * idx), Ports[idx].evtnn); eeWriteShort(EE_PORTADDR + (2 * idx), Ports[idx].addr); } } // preset port 9-16 as input with off delay for (idx = 8; idx < 16; idx++) { Ports[idx].cfg = PORTCFG_IN | PORTCFG_OFFDELAY; Ports[idx].status = 0; Ports[idx].timedoff = 0; Ports[idx].timer = 0; Ports[idx].evtnn = 0; Ports[idx].addr = idx + 1; if (clr) { eeWrite(EE_PORTCFG + idx, Ports[idx].cfg); eeWriteShort(EE_PORTNN + (2 * idx), Ports[idx].evtnn); eeWriteShort(EE_PORTADDR + (2 * idx), Ports[idx].addr); } } if (clr) { eeWrite(EE_PORTSTAT + 0, 0); eeWrite(EE_PORTSTAT + 1, 0); } for (idx = 0; idx < 16; idx++) { Ports[idx].cfg = eeRead(EE_PORTCFG + idx); if ((Ports[idx].cfg & PORTCFG_IO) == PORTCFG_OUT) Ports[idx].status = eeRead(EE_PORTSTAT + idx); Ports[idx].timedoff = 0; Ports[idx].timer = 0; Ports[idx].evtnn = eeReadShort(EE_PORTNN + (2 * idx)); Ports[idx].addr = eeReadShort(EE_PORTADDR + (2 * idx)); } for (idx = 0; idx < 16; idx++) configPort(idx); }
unsigned char parseCmd(CANMsg *cmsg) { unsigned char txed = 0; CANMsg canmsg; //mode_word.s_full = 0; if (!(NV1 & CFG_READONLY)) { send2LocoNet(cmsg); } switch (cmsg->b[d0]) { case OPC_ASRQ: { addr = cmsg->b[d3] * 256 + cmsg->b[d4]; if (SOD == addr && doSOD == 0) { ioIdx = 0; doSOD = 1; } break; } case OPC_WLNID: LNModule.id = cmsg->b[d1] * 256 + cmsg->b[d2]; LNModule.addr = cmsg->b[d3] * 256 + cmsg->b[d4]; if (LNModule.id > 9999) LNModule.id /= 10; break; case OPC_QLNID: canmsg.b[d0] = OPC_PLNID; canmsg.b[d1] = LNModule.id / 256; canmsg.b[d2] = LNModule.id % 256; canmsg.b[d3] = LNModule.addr / 256; canmsg.b[d4] = LNModule.addr % 256; canmsg.b[dlc] = 5; canbusSendExt(&canmsg); break; case OPC_QNN: canmsg.b[d0] = OPC_PNN; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = params[0]; canmsg.b[d4] = params[2]; canmsg.b[d5] = NV1; canmsg.b[dlc] = 6; canbusSend(&canmsg); txed = 1; break; case OPC_RQNPN: // Request to read a parameter if (thisNN(cmsg) == 1) { doRqnpn((unsigned int) cmsg->b[d3]); } break; case OPC_SNN: { if (Wait4NN) { nnH = cmsg->b[d1]; nnL = cmsg->b[d2]; NN_temp = nnH * 256 + nnL; eeWriteShort(EE_NN, NN_temp); Wait4NN = 0; } break; } case OPC_RQNP: if (Wait4NN) { canmsg.b[d0] = OPC_PARAMS; canmsg.b[d1] = params[0]; canmsg.b[d2] = params[1]; canmsg.b[d3] = params[2]; canmsg.b[d4] = params[3]; canmsg.b[d5] = params[4]; canmsg.b[d6] = params[5]; canmsg.b[d7] = params[6]; canmsg.b[dlc] = 8; canbusSend(&canmsg); txed = 1; } break; case OPC_BOOT: // Enter bootloader mode if NN matches if (thisNN(cmsg) == 1) { doSwSave = TRUE; while (doSwSave) SaveSwState(); eeWrite(EE_BOOT, 0xFF); Reset(); } break; case OPC_NVRD: if (thisNN(cmsg)) { byte nvnr = cmsg->b[d3]; if (nvnr == 1) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = NV1; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr == 2) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = CANID; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } } break; case OPC_NVSET: if (thisNN(cmsg)) { byte nvnr = cmsg->b[d3]; if (nvnr == 1) { NV1 = cmsg->b[d4]; eeWrite(EE_NV, NV1); } else if (nvnr == 2) { CANID = cmsg->b[d4]; eeWrite(EE_CANID, CANID); } } break; case OPC_NNLRN: if (thisNN(cmsg)) { isLearning = TRUE; } break; case OPC_NNULN: if (thisNN(cmsg)) { isLearning = FALSE; LED6_FLIM = PORT_OFF; } break; case OPC_EVLRN: if (isLearning) { nn = cmsg->b[d1] * 256 + cmsg->b[d2]; addr = cmsg->b[d3] * 256 + cmsg->b[d4]; idx = cmsg->b[d5]; var = cmsg->b[d6]; if (idx == 0) { SOD = addr; eeWriteShort(EE_SOD, addr); } else if (idx == 1) { SWStart = addr; eeWriteShort(EE_SWSTART, addr); } else if (idx == 2) { SWEnd = addr; eeWriteShort(EE_SWEND, addr); } else if (idx == 3) { FBStart = addr; eeWriteShort(EE_FBSTART, addr); } else if (idx == 4) { FBEnd = addr; eeWriteShort(EE_FBEND, addr); } } break; case OPC_NERD: if (thisNN(cmsg)) { doEV = 1; evIdx = 0; } break; default: break; } return txed; }
unsigned char parseCmd(CANMsg *cmsg) { unsigned char txed = 0; //mode_word.s_full = 0; switch (cmsg->b[d0]) { case OPC_ASRQ: { int addr = cmsg->b[d3] * 256 + cmsg->b[d4]; if (SOD == addr && doSOD == 0) { ioIdx = 0; doSOD = 1; } break; } case OPC_ACON: case OPC_ASON: { ushort nn = cmsg->b[d1] * 256 + cmsg->b[d2]; ushort addr = cmsg->b[d3] * 256 + cmsg->b[d4]; setOutput(nn, addr, 1); break; } case OPC_ACOF: case OPC_ASOF: { ushort nn = cmsg->b[d1] * 256 + cmsg->b[d2]; ushort addr = cmsg->b[d3] * 256 + cmsg->b[d4]; setOutput(nn, addr, 0); break; } case OPC_RQNPN: // Request to read a parameter if (thisNN(cmsg) == 1) { doRqnpn((unsigned int) cmsg->b[d3]); } break; case OPC_SNN: { if (Wait4NN) { unsigned char nnH = cmsg->b[d1]; unsigned char nnL = cmsg->b[d2]; NN_temp = nnH * 256 + nnL; eeWrite(EE_NN, nnH); eeWrite(EE_NN + 1, nnL); Wait4NN = 0; LED2 = 0; } break; } case OPC_RQNP: if (Wait4NN) { CANMsg canmsg; canmsg.b[d0] = OPC_PARAMS; canmsg.b[d1] = params[0]; canmsg.b[d2] = params[1]; canmsg.b[d3] = params[2]; canmsg.b[d4] = params[3]; canmsg.b[d5] = params[4]; canmsg.b[d6] = params[5]; canmsg.b[d7] = params[6]; canmsg.b[dlc] = 8; canbusSend(&canmsg); txed = 1; } break; case OPC_BOOT: // Enter bootloader mode if NN matches if (thisNN(cmsg) == 1) { eeWrite((unsigned char) (&bootflag), 0xFF); Reset(); } break; case OPC_RTOF: if (NV1 & CFG_SAVEOUTPUT) { saveOutputStates(); } break; case OPC_NNCLR: if (thisNN(cmsg) && isLearning) { setupIO(TRUE); } break; case OPC_QNN: { CANMsg canmsg; canmsg.b[d0] = OPC_PNN; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = params[0]; canmsg.b[d4] = params[2]; canmsg.b[d5] = NV1; canmsg.b[dlc] = 6; canbusSend(&canmsg); } //LED2 = 1; txed = 1; break; case OPC_RTON: pnnCount = 0; /* setOutput(0, 9, (pnnCount & 0x01) ? 1:0); setOutput(0, 10, (pnnCount & 0x02) ? 1:0); setOutput(0, 11, (pnnCount & 0x04) ? 1:0); setOutput(0, 12, (pnnCount & 0x08) ? 1:0); setOutput(0, 13, (pnnCount & 0x10) ? 1:0); setOutput(0, 14, (pnnCount & 0x20) ? 1:0); setOutput(0, 15, (pnnCount & 0x40) ? 1:0); setOutput(0, 16, (pnnCount & 0x80) ? 1:0); */ break; case OPC_PNN: pnnCount++; /* setOutput(0, 9, (pnnCount & 0x01) ? 1:0); setOutput(0, 10, (pnnCount & 0x02) ? 1:0); setOutput(0, 11, (pnnCount & 0x04) ? 1:0); setOutput(0, 12, (pnnCount & 0x08) ? 1:0); setOutput(0, 13, (pnnCount & 0x10) ? 1:0); setOutput(0, 14, (pnnCount & 0x20) ? 1:0); setOutput(0, 15, (pnnCount & 0x40) ? 1:0); setOutput(0, 16, (pnnCount & 0x80) ? 1:0); */ break; case OPC_NVRD: if (thisNN(cmsg)) { CANMsg canmsg; byte nvnr = cmsg->b[d3]; if (nvnr == 1) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = NV1; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr < 18) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = Ports[nvnr - 2].cfg; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr == 18) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = getPortStates(0); // port status 1-8 canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr == 19) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = getPortStates(1); // port status 9-16 canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr == 20) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = CANID; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } } break; case OPC_NVSET: if (thisNN(cmsg)) { byte nvnr = cmsg->b[d3]; if (nvnr == 1) { NV1 = cmsg->b[d4]; eeWrite(EE_NV, NV1); } else if (nvnr < 18) { Ports[nvnr - 2].cfg = cmsg->b[d4]; eeWrite(EE_PORTCFG + (nvnr - 2), Ports[nvnr - 2].cfg); configPort(nvnr - 2); } else if (nvnr == 20) { CANID = cmsg->b[d4]; eeWrite(EE_CANID, CANID); } } break; case OPC_NNLRN: if (thisNN(cmsg)) { isLearning = TRUE; } break; case OPC_NNULN: if (thisNN(cmsg)) { isLearning = FALSE; LED2 = PORT_OFF; } break; case OPC_EVLRN: if (isLearning) { ushort evtnn = cmsg->b[d1] * 256 + cmsg->b[d2]; ushort addr = cmsg->b[d3] * 256 + cmsg->b[d4]; byte idx = cmsg->b[d5]; byte val = cmsg->b[d6]; if (idx < 16) { Ports[idx].evtnn = evtnn; Ports[idx].addr = addr; eeWriteShort(EE_PORTNN + (2 * idx), evtnn); eeWriteShort(EE_PORTADDR + (2 * idx), addr); } if (idx == 16) { SOD = addr; eeWrite(EE_SOD, addr / 256); eeWrite(EE_SOD + 1, addr % 256); } } break; case OPC_NERD: if (thisNN(cmsg)) { doEV = 1; evIdx = 0; // start of day event { CANMsg canmsg; canmsg.b[d0] = OPC_ENRSP; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = (NN_temp % 256) & 0xFF; canmsg.b[d3] = 0; canmsg.b[d4] = 0; canmsg.b[d5] = SOD / 256; canmsg.b[d6] = SOD % 256; canmsg.b[d7] = 16; canmsg.b[dlc] = 8; canbusSend(&canmsg); } txed = 1; } break; default: break; } return txed; }
unsigned char parseCmd(CANMsg *cmsg) { unsigned char txed = 0; //mode_word.s_full = 0; switch (cmsg->b[d0]) { case OPC_ASRQ: { addr = cmsg->b[d3] * 256 + cmsg->b[d4]; if (SOD == addr && doSOD == 0) { ioIdx = 0; doSOD = 1; } break; } case OPC_ACON: case OPC_ASON: { nn = cmsg->b[d1] * 256 + cmsg->b[d2]; addr = cmsg->b[d3] * 256 + cmsg->b[d4]; setOutput(nn, addr, 1); break; } case OPC_ACOF: case OPC_ASOF: { nn = cmsg->b[d1] * 256 + cmsg->b[d2]; addr = cmsg->b[d3] * 256 + cmsg->b[d4]; setOutput(nn, addr, 0); break; } case OPC_BOOT: // Enter bootloader mode if NN matches if (thisNN(cmsg) == 1) { eeWrite((unsigned char) (&bootflag), 0xFF); Reset(); } break; case OPC_QNN: { CANMsg canmsg; canmsg.b[d0] = OPC_PNN; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = params[0]; canmsg.b[d4] = params[2]; canmsg.b[d5] = NV1; canmsg.b[dlc] = 6; canbusSend(&canmsg); //LED2 = 1; txed = 1; break; } case OPC_RQNPN: // Request to read a parameter if (thisNN(cmsg) == 1) { doRqnpn((unsigned int) cmsg->b[d3]); } break; case OPC_SNN: { if (Wait4NN) { nnH = cmsg->b[d1]; nnL = cmsg->b[d2]; NN_temp = nnH * 256 + nnL; eeWrite(EE_NN, nnH); eeWrite(EE_NN + 1, nnL); Wait4NN = 0; canmsg.b[d0] = OPC_NNACK; canmsg.b[d1] = nnH / 256; canmsg.b[d2] = nnL % 256; canmsg.b[dlc] = 3; canbusSend(&canmsg); } break; } case OPC_RQNP: if (Wait4NN) { CANMsg canmsg; canmsg.b[d0] = OPC_PARAMS; canmsg.b[d1] = params[0]; canmsg.b[d2] = params[1]; canmsg.b[d3] = params[2]; canmsg.b[d4] = params[3]; canmsg.b[d5] = params[4]; canmsg.b[d6] = params[5]; canmsg.b[d7] = params[6]; canmsg.b[dlc] = 8; canbusSend(&canmsg); txed = 1; } break; case OPC_RTOF: if (NV1 & CFG_SAVERFID) { byte i; for (i = 0; i < 8; i++) { // save rfid for SoD eeWrite(EE_SCANRFID + i * 5 + 0, RFID[i].data[0]); eeWrite(EE_SCANRFID + i * 5 + 1, RFID[i].data[1]); eeWrite(EE_SCANRFID + i * 5 + 2, RFID[i].data[2]); eeWrite(EE_SCANRFID + i * 5 + 3, RFID[i].data[3]); eeWrite(EE_SCANRFID + i * 5 + 4, RFID[i].data[4]); } } break; case OPC_NVRD: if (thisNN(cmsg)) { CANMsg canmsg; byte nvnr = cmsg->b[d3]; if (nvnr == 1) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = NV1; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr == 2) { canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = CANID; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } else if (nvnr > 2 && nvnr < 28) { // 5 x 8 = 40bit Allowed RFID idx = (nvnr - 3) / 5; var = (nvnr - 3) % 5; canmsg.b[d0] = OPC_NVANS; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = nvnr; canmsg.b[d4] = AllowedRFID[idx].data[var]; canmsg.b[dlc] = 5; canbusSend(&canmsg); txed = 1; } } break; case OPC_NVSET: if (thisNN(cmsg)) { byte nvnr = cmsg->b[d3]; if (nvnr == 1) { NV1 = cmsg->b[d4]; eeWrite(EE_NV, NV1); } else if (nvnr == 2) { CANID = cmsg->b[d4]; eeWrite(EE_CANID, CANID); } else if (nvnr > 2 && nvnr < 28) { // 5 x 40bit Allowed RFID byte idx = (nvnr - 3) / 5; byte var = (nvnr - 3) % 5; AllowedRFID[idx].data[var] = cmsg->b[d4]; eeWrite(EE_RFID + idx * 5 + (var), cmsg->b[d4]); } } break; case OPC_NNLRN: if (thisNN(cmsg)) { isLearning = TRUE; } break; case OPC_NNULN: if (thisNN(cmsg)) { isLearning = FALSE; LED2 = PORT_OFF; } break; case OPC_EVLRN: if (isLearning) { nn = cmsg->b[d1] * 256 + cmsg->b[d2]; addr = cmsg->b[d3] * 256 + cmsg->b[d4]; idx = cmsg->b[d5]; var = cmsg->b[d6]; if (idx < 8) { // RFID RFID[idx].addr = addr; eeWriteShort(EE_PORT_ADDR + 2 * idx, addr); } else if (idx > 7 && idx < 16) { // Block Sensor[idx - 8].addr = addr; eeWriteShort(EE_PORT_ADDR + 2 * idx, addr); } else if (idx == 16) { SOD = addr; eeWrite(EE_SOD, addr / 256); eeWrite(EE_SOD + 1, addr % 256); } } break; case OPC_NERD: if (thisNN(cmsg)) { CANMsg canmsg; doEV = 1; evIdx = 0; // start of day event canmsg.b[d0] = OPC_ENRSP; canmsg.b[d1] = (NN_temp / 256) & 0xFF; canmsg.b[d2] = NN_temp & 0xFF; canmsg.b[d3] = 0; canmsg.b[d4] = 0; canmsg.b[d5] = SOD / 256; canmsg.b[d6] = SOD % 256; canmsg.b[d7] = 16; canmsg.b[dlc] = 8; canbusSend(&canmsg); txed = 1; } break; default: break; } return txed; }