This commit is contained in:
hg
2014-04-02 22:50:17 +02:00
parent 26b47b1159
commit db5cb1829a
8 changed files with 90 additions and 16 deletions

View File

@ -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: