changes
This commit is contained in:
@ -37,6 +37,7 @@ String MeterBusClientConfig::exec(String params) {
|
||||
Serial.print(getResource(MBC_MYFRAMES_KEY)); Serial.print(m_meterBusClient->m_myFrameCnt); Serial.println();
|
||||
Serial.print(getResource(MBC_INVALID_FRAMES_KEY)); Serial.print(m_meterBusClient->m_invalidFrameCnt); Serial.println();
|
||||
Serial.print(getResource(MBC_INVALID_CHECKSUM_CNT_KEY)); Serial.print(m_meterBusClient->m_invalidChecksum); Serial.println();
|
||||
Serial.print(getResource(MBC_COLLISION_CNT_KEY)); Serial.print(m_meterBusClient->m_collisionCnt); Serial.println();
|
||||
Serial.print(getResource(MBC_ADDRESS_LONG_KEY)); Serial.print(m_meterBusClient->getAddress()); Serial.println();
|
||||
} else {
|
||||
res = "subcommand not found";
|
||||
@ -49,7 +50,8 @@ String MeterBusClientConfig::exec(String params) {
|
||||
|
||||
|
||||
MeterBusClient::MeterBusClient() : m_meterBusClientConfig(this), m_address(0),
|
||||
m_frameCnt(0), m_myFrameCnt(0), m_invalidFrameCnt(0), m_invalidChecksum(0) {
|
||||
m_frameCnt(0), m_myFrameCnt(0), m_invalidFrameCnt(0), m_invalidChecksum(0),
|
||||
m_collisionCnt(0) {
|
||||
|
||||
}
|
||||
|
||||
@ -59,7 +61,11 @@ void MeterBusClient::begin(CmdServer *cmdServer, Thermometer *thermometer) {
|
||||
m_meterBusClientConfig.registerYourself(cmdServer);
|
||||
m_thermometer = thermometer;
|
||||
|
||||
Serial3.begin(1200);
|
||||
//Serial3.begin(1200);
|
||||
//Serial3.begin(2400, SERIAL_8E1);
|
||||
Serial3.begin(2400);
|
||||
UART2_C1 |= UART_C1_PE | UART_C1_M;
|
||||
|
||||
|
||||
|
||||
setAddress(Config::getUChar(Config::METERBUSCLIENT_ADDRESS));
|
||||
@ -147,7 +153,8 @@ bool isChecksumValid(MeterBusFrame frame) {
|
||||
|
||||
|
||||
|
||||
void MeterBusClient::handleFrame() {
|
||||
bool MeterBusClient::handleFrame() {
|
||||
bool res = false;
|
||||
m_frameCnt++;
|
||||
if (! isChecksumValid(m_frame)) {
|
||||
Serial.println(getResource(MBC_INVALID_CHECKSUM_KEY));
|
||||
@ -176,19 +183,22 @@ void MeterBusClient::handleFrame() {
|
||||
if (m_frame.startDelimiter == 0x10) {
|
||||
if (m_frame.cField == 0x40) {
|
||||
SND_NKE();
|
||||
res = true;
|
||||
} else if (m_frame.cField == 0x5b) {
|
||||
REQ_UD2();
|
||||
res = true;
|
||||
} else {
|
||||
Serial.println(getResource(MBC_UNHANDLED_FRAME_KEY));
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
typedef enum {
|
||||
STATE_START, STATE_IDLE, STATE_SHORT_FRAME, STATE_LONG_CTRL_FRAME, STATE_HANDLE, STATE_INVALID, STATE_DONE,
|
||||
STATE_DELAYED_HANDLE, STATE_DELAY
|
||||
STATE_DELAYED_RESPONSE, STATE_DELAY, STATE_RESPONSE, STATE_RECEIVE_ECHO
|
||||
} e_meterBusClientState;
|
||||
|
||||
typedef enum {
|
||||
@ -201,9 +211,13 @@ void MeterBusClient::exec() {
|
||||
static e_meterBusClientState state = STATE_IDLE;
|
||||
static e_meterBusClientSubState subState = SUBSTATE_LENGTH;
|
||||
static unsigned char userDataCnt = 0;
|
||||
static unsigned int echoReceiveCnt = 0;
|
||||
static unsigned long receivedDoneTimestamp;
|
||||
|
||||
int chi = Serial3.read();
|
||||
if (chi != -1) {
|
||||
Serial.print("Received: "); Serial.println(chi, 16);
|
||||
}
|
||||
char ch = (char) chi;
|
||||
|
||||
switch (state) {
|
||||
@ -312,28 +326,48 @@ void MeterBusClient::exec() {
|
||||
break;
|
||||
|
||||
case STATE_INVALID:
|
||||
Serial.println("INVALID FRAME");
|
||||
m_invalidFrameCnt++;
|
||||
state = STATE_START;
|
||||
break;
|
||||
|
||||
case STATE_HANDLE:
|
||||
state = STATE_DELAY;
|
||||
receivedDoneTimestamp = millis();
|
||||
state = STATE_DONE;
|
||||
if (m_frame.valid) {
|
||||
receivedDoneTimestamp = millis();
|
||||
if (handleFrame()) {
|
||||
state = STATE_DELAY;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_DELAY:
|
||||
if ((receivedDoneTimestamp + RESPONSE_DELAY) < millis()) {
|
||||
state = STATE_DELAYED_HANDLE;
|
||||
state = STATE_DELAYED_RESPONSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_DELAYED_HANDLE:
|
||||
if (m_frame.valid) {
|
||||
handleFrame();
|
||||
} else {
|
||||
Serial.println(getResource(MBC_NO_VALID_FRAME_KEY));
|
||||
case STATE_DELAYED_RESPONSE:
|
||||
for (unsigned int i = 0; i < sendBufferLen; i++) {
|
||||
Serial3.write(sendBuffer[i]);
|
||||
}
|
||||
echoReceiveCnt = 0;
|
||||
state = STATE_RECEIVE_ECHO;
|
||||
break;
|
||||
|
||||
case STATE_RECEIVE_ECHO:
|
||||
if (chi != -1) {
|
||||
Serial.println("echo character");
|
||||
if (ch == sendBuffer[echoReceiveCnt]) {
|
||||
echoReceiveCnt++;
|
||||
if (echoReceiveCnt == sendBufferLen) {
|
||||
state = STATE_DONE;
|
||||
}
|
||||
} else {
|
||||
m_collisionCnt++;
|
||||
state = STATE_DONE;
|
||||
}
|
||||
}
|
||||
state = STATE_DONE;
|
||||
break;
|
||||
|
||||
case STATE_DONE:
|
||||
|
Reference in New Issue
Block a user