📄 command.c
字号:
/*Slave*/ // txUserDataArray[2] = MyAddr - high
/*Slave*/ // txUserDataArray[3] = MyAddr - low
/*Slave*/ // txUserDataArray[4] = SUCCESS
/*Slave*/ //==============================================================================
/*Slave*/ // No command to execute. Just respond if we get to this point.
/*Slave*/
/*Slave*/ // Fill User Data buffer with zeroes
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0]));
/*Slave*/
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS; // command status
/*Slave*/ uTransmitPacketReady = 1;
/*Slave*/ uPlcState = PLC_RECEIVE_COMMAND;
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_READ_BLOCK:
/*Slave*/ //==============================================================================
/*Slave*/ // Command: Read Block.
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/ // rxUserDataCopy[4] = command number
/*Slave*/ // rxUserDataCopy[5] = starting address
/*Slave*/ // rxUserDataCopy[6] = block length (words). <= 60
/*Slave*/ //
/*Slave*/ // Return:
/*Slave*/ // txUserDataArray[0] = Master addr - high
/*Slave*/ // txUserDataArray[1] = Master addr - low
/*Slave*/ // txUserDataArray[2] = MyAddr - high
/*Slave*/ // txUserDataArray[3] = MyAddr - low
/*Slave*/ // txUserDataArray[4] = Status / Error
/*Slave*/ // txUserDataArray[5-] = data
/*Slave*/ //
/*Slave*/ // return:
/*Slave*/ // If the requested configuration parameter is valid, SUCCESS is returned
/*Slave*/ // for an acknowledge followed by the status array values.
/*Slave*/ //==============================================================================
/*Slave*/ // Fill User Data buffer with zeroes
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0]));
/*Slave*/
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS; // command status
/*Slave*/
/*Slave*/ // return parms 5-34
/*Slave*/ for(i=0; i<rxUserDataCopy[6]; i++) // 16-bit parms
/*Slave*/ {
/*Slave*/ txUserDataArray[5+i] = *(u16*)(rxUserDataCopy[5]+i);
/*Slave*/ }
/*Slave*/
/*Slave*/ uTransmitPacketReady = 1;
/*Slave*/ uPlcState = PLC_RECEIVE_COMMAND;
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_ERASE_FLASH:
/*Slave*/ //==============================================================================
/*Slave*/ // Command: Erase Flash
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/ // rxUserDataCopy[4] = command number
/*Slave*/ //
/*Slave*/ // Only option for target on slave is log space.
/*Slave*/ //
/*Slave*/ // return:
/*Slave*/ // Nothing here. The return is send in dsp_modem.c
/*Slave*/ //==============================================================================
/*Slave*/ // Fill User Data buffer with zeroes
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0]));
/*Slave*/
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS; // command status
/*Slave*/ uTransmitPacketReady = 1;
/*Slave*/ uPlcState = PLC_RECEIVE_COMMAND;
/*Slave*/ uFlashTarget = 2; // 2 = log space
/*Slave*/ uFlashWriteStatus = FLASH_STATUS_ERASING;
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_READ_FLASH:
/*Slave*/ //==============================================================================
/*Slave*/ // Command: Read Flash
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/ // rxUserDataCopy[4] = command number
/*Slave*/ // rxUserDataCopy[5] = starting address - high
/*Slave*/ // rxUserDataCopy[6] = starting address - low
/*Slave*/ // rxUserDataCopy[7] = block length (words). <= 60
/*Slave*/ //
/*Slave*/ // Return:
/*Slave*/ // txUserDataArray[0] = Master addr - high
/*Slave*/ // txUserDataArray[1] = Master addr - low
/*Slave*/ // txUserDataArray[2] = MyAddr - high
/*Slave*/ // txUserDataArray[3] = MyAddr - low
/*Slave*/ // txUserDataArray[4] = Status / Error
/*Slave*/ // txUserDataArray[5-] = data
/*Slave*/ //==============================================================================
/*Slave*/ // Fill User Data buffer with zeroes
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0]));
/*Slave*/
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS; // command status
/*Slave*/
/*Slave*/ // return parms 5-34
/*Slave*/ ulAddr = (u32)rxUserDataCopy[5]*65536L + (u32)rxUserDataCopy[6];
/*Slave*/ for(i=0; i<rxUserDataCopy[7]; i++)
/*Slave*/ {
/*Slave*/ txUserDataArray[5+i] = ReadFlash(ulAddr++);
/*Slave*/ }
/*Slave*/
/*Slave*/ uTransmitPacketReady = 1;
/*Slave*/ uPlcState = PLC_RECEIVE_COMMAND;
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_RESET_MSP:
/*Slave*/ //==============================================================================
/*Slave*/ // Reset the MSP.
/*Slave*/ //
/*Slave*/ // NOTE: There is a fairly long time lag before the MSP comes back!
/*Slave*/ // The host code must wait, or poll for completion.
/*Slave*/ //
/*Slave*/ // return:
/*Slave*/ // Command acknowledge.
/*Slave*/ //==============================================================================
/*Slave*/ ResetEMeter();
/*Slave*/
/*Slave*/ // Fill User Data buffer with zeroes
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0]));
/*Slave*/
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS; // command status
/*Slave*/ uTransmitPacketReady = 1;
/*Slave*/ uPlcState = PLC_RECEIVE_COMMAND;
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_EMETER_CMD:
/*Slave*/ //==============================================================================
/*Slave*/ // Command: Emeter command
/*Slave*/ //
/*Slave*/ // This is a command to the emeter which does NOT expect a reply.
/*Slave*/ // ex:
/*Slave*/ // 'W' Write string to LCD
/*Slave*/ // 'D' Display mode
/*Slave*/ // +/- Adjust calibration values
/*Slave*/ // 'S' Set time/date
/*Slave*/ //
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/ // rxUserDataCopy[4] = command number
/*Slave*/ // rxUserDataCopy[5-9] = String containing command.
/*Slave*/ //
/*Slave*/ // txUserDataArray[0] = Master addr - high
/*Slave*/ // txUserDataArray[1] = Master addr - low
/*Slave*/ // txUserDataArray[2] = MyAddr - high
/*Slave*/ // txUserDataArray[3] = MyAddr - low
/*Slave*/ // txUserDataArray[4] = SUCCESS
/*Slave*/ // txUserDataArray[5-61] = Return data.
/*Slave*/ //
/*Slave*/ // NOTE: Most changes to this function should have corresponding changes made
/*Slave*/ // in the MC_EMETER_CMD case above.
/*Slave*/ //==============================================================================
/*Slave*/ emeterStringIndex = 0;
/*Slave*/ for(i=5; i<=9; i++)
/*Slave*/ {
/*Slave*/ emeterMsgString[emeterStringIndex++] = (rxUserDataCopy[i]&0xFF00)>>8;
/*Slave*/ emeterMsgString[emeterStringIndex++] = (rxUserDataCopy[i]&0x00FF);
/*Slave*/ }
/*Slave*/ emeterMsgString[emeterStringIndex] = 0; // Add a null in case the received string didn't have one.
/*Slave*/ WriteUARTString(emeterMsgString); // send command to emeter.
/*Slave*/
/*Slave*/ // This is an emeter command which does not return anything.
/*Slave*/ // A fake return of all zeros will sent after the 485 communication is done
/*Slave*/ // if this is sent to a specific slave. If it is a broadcast message the
/*Slave*/ // Master will have already taken care of the acknowledge, so don't return
/*Slave*/ // anything.
/*Slave*/ if(*(u32*)&rxUserDataArray[0] == 1L) // This was a broadcast command. Don't respond.
/*Slave*/ {
/*Slave*/ uAckAfter485 = 0; // Don't send ack.
/*Slave*/ uCommandBlock = 0; // Re-enable packet reception.
/*Slave*/ // This gets re-enabled in SendPLC() for most other
/*Slave*/ // commands.
/*Slave*/ }
/*Slave*/ else
/*Slave*/ {
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0])); // Fill User Data buffer with zeroes
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS;
/*Slave*/ uAckAfter485 = 1; // Set flag to send ack after 485 traffic.
/*Slave*/ }
/*Slave*/ break;
/*Slave*/
/*Slave*/ case SC_EMETER_REQ:
/*Slave*/ //==============================================================================
/*Slave*/ // Command: Emeter request
/*Slave*/ //
/*Slave*/ // This is a command to the emeter which DOES expect a reply.
/*Slave*/ //
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/ // rxUserDataCopy[4] = command number
/*Slave*/ // rxUserDataCopy[5-9] = String containing command.
/*Slave*/ //
/*Slave*/ // txUserDataArray[0] = Master addr - high
/*Slave*/ // txUserDataArray[1] = Master addr - low
/*Slave*/ // txUserDataArray[2] = MyAddr - high
/*Slave*/ // txUserDataArray[3] = MyAddr - low
/*Slave*/ // txUserDataArray[4] = SUCCESS
/*Slave*/ // txUserDataArray[5-61] = Return data.
/*Slave*/ //
/*Slave*/ // NOTE: Most changes to this function should have corresponding changes made
/*Slave*/ // in the MC_EMETER_CMD case above.
/*Slave*/ //==============================================================================
/*Slave*/ emeterStringIndex = 0;
/*Slave*/ for(i=5; i<=9; i++)
/*Slave*/ {
/*Slave*/ emeterMsgString[emeterStringIndex++] = (rxUserDataCopy[i]&0xFF00)>>8;
/*Slave*/ emeterMsgString[emeterStringIndex++] = (rxUserDataCopy[i]&0x00FF);
/*Slave*/ }
/*Slave*/ emeterMsgString[emeterStringIndex] = 0; // Add a null in case the received string didn't have one.
/*Slave*/ WriteUARTString(emeterMsgString);
/*Slave*/
/*Slave*/ memset(txUserDataArray, 0, DATA_BUFFER_LEN*sizeof(txUserDataArray[0])); // Fill User Data buffer with zeroes
/*Slave*/ txUserDataArray[0] = rxUserDataCopy[2]; // Master address
/*Slave*/ txUserDataArray[1] = rxUserDataCopy[3]; // Master address
/*Slave*/ *(u32*)&txUserDataArray[2] = ulMyAddr;
/*Slave*/ txUserDataArray[4] = SUCCESS;
/*Slave*/
/*Slave*/ uUartResponseIndex = 10; // Offset in bytes!
/*Slave*/ uUartState = UART_RECEIVE_RESPONSE;
/*Slave*/ memset(upUartResponseBuffer, 0, 61*sizeof(upUartResponseBuffer[0]));
/*Slave*/ ulUartCounter = 0L; // Reset counter used for timeout detection.
/*Slave*/ break;
/*Slave*/
/*Slave*/ default:
/*Slave*/ //==============================================================================
/*Slave*/ // Unrecognized command
/*Slave*/ // rxUserDataCopy[0] = dest addr - high
/*Slave*/ // rxUserDataCopy[1] = dest addr - low
/*Slave*/ // rxUserDataCopy[2] = source addr - high
/*Slave*/ // rxUserDataCopy[3] = source addr - low
/*Slave*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -