📄 emeter-communication.c
字号:
flash_clr((int16_t *) next_flash_loc);
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
prepare_tx_message(2);
break;
case HOST_CMD_SET_FLASH_POINTER:
next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
prepare_tx_message(2);
break;
case HOST_CMD_FLASH_DOWNLOAD:
if (is_calibration_enabled())
{
next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
for (i = 2; i < (rx_len - 12) >> 1; i++)
flash_write_int16((int16_t *) next_flash_loc++, rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + i]);
flash_secure();
/* Return the next address to the host, so it can check for missed messages */
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = (uint16_t) next_flash_loc;
prepare_tx_message(4);
}
break;
case HOST_CMD_FLASH_UPLOAD:
if (is_calibration_enabled())
{
next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
for (i = 1; i < MAX_IEC1107_MSG_BODY/2; i++)
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + i] = *next_flash_loc++;
prepare_tx_message(MAX_IEC1107_MSG_BODY);
}
break;
case HOST_CMD_ZAP_MEMORY_AREA:
/* Zap memory area (usually this will be flash) */
if (is_calibration_enabled())
{
next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
last_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 2];
while (next_flash_loc < last_flash_loc)
flash_write_int16((int16_t *) next_flash_loc++, rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 3]);
flash_secure();
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = (uint16_t) next_flash_loc;
prepare_tx_message(4);
}
break;
case HOST_CMD_SUMCHECK_MEMORY:
/* Sumcheck a specified memory area, and return the sumcheck */
if (is_calibration_enabled())
{
next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
last_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 2];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = 0;
while (next_flash_loc < last_flash_loc)
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] += *next_flash_loc++;
flash_secure();
prepare_tx_message(4);
}
break;
case HOST_CMD_GET_RAW_POWER_PHASE_1:
#if !defined(SINGLE_PHASE)
case HOST_CMD_GET_RAW_POWER_PHASE_2:
case HOST_CMD_GET_RAW_POWER_PHASE_3:
phase = &chan[rx_msg->uint8[IEC1107_MSG_RX_START_BODY] - 0x91];
#endif
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->current.P_accum_logged[0][0];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->current.P_accum_logged[0][1];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->current.P_accum_logged[0][2];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
prepare_tx_message(10);
break;
#if REACTIVE_POWER_BY_QUADRATURE_SUPPORT
case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_1:
#if !defined(SINGLE_PHASE)
case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_2:
case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_3:
phase = &chan[rx_msg->uint8[IEC1107_MSG_RX_START_BODY] - 0x95];
#endif
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->current.P_reactive_accum_logged[0][0];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->current.P_reactive_accum_logged[0][1];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->current.P_reactive_accum_logged[0][2];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
prepare_tx_message(10);
break;
#endif
#if defined(SINGLE_PHASE) && defined(NEUTRAL_MONITOR_SUPPORT)
case HOST_CMD_GET_RAW_POWER_NEUTRAL:
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->neutral.P_accum_logged[0][0];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->neutral.P_accum_logged[0][1];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->neutral.P_accum_logged[0][2];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
prepare_tx_message(10);
break;
#if defined(REACTIVE_POWER_BY_QUADRATURE_SUPPORT)
case HOST_CMD_GET_RAW_REACTIVE_POWER_NEUTRAL:
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->neutral.P_reactive_accum_logged[0][0];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->neutral.P_reactive_accum_logged[0][1];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->neutral.P_reactive_accum_logged[0][2];
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
prepare_tx_message(10);
break;
#endif
#endif
case HOST_CMD_CHECK_RTC_ERROR:
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
#if defined(__MSP430_HAS_TA3__)
z = assess_rtc_speed();
#endif
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = z;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = z >> 16;
prepare_tx_message(6);
break;
#if defined(CORRECTED_RTC_SUPPORT)
case HOST_CMD_RTC_CORRECTION:
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = rtc_correction;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = rtc_correction >> 16;
prepare_tx_message(6);
break;
#endif
#if defined(MULTI_RATE_SUPPORT)
case HOST_CMD_MULTIRATE_SET_PARAMETERS:
i = multirate_put(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY]);
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = i;
prepare_tx_message(4);
break;
case HOST_CMD_MULTIRATE_GET_PARAMETERS:
i = multirate_get(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY], &tx_msg.uint8[IEC1107_MSG_TX_START_BODY]);
prepare_tx_message(i);
break;
case HOST_CMD_MULTIRATE_CLEAR_USAGE:
i = multirate_clear_usage(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY]);
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = i;
prepare_tx_message(4);
break;
case HOST_CMD_MULTIRATE_GET_USAGE:
i = multirate_get_usage(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY], &tx_msg.uint8[IEC1107_MSG_TX_START_BODY]);
prepare_tx_message(i);
break;
#endif
default:
/* For all other message types reply with type 0xFF - bad message type */
tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = 0xFF;
prepare_tx_message(2);
break;
}
}
#endif
#if defined(__MSP430__) && (defined(IEC1107_SUPPORT) || defined(SERIAL_CALIBRATION_SUPPORT)) && (defined(USART0RX_VECTOR) || defined(USART0RX_ISR))
/* Interrupt to accept IEC1107 messages. */
ISR(USART0RX, serial_rx_interrupt0)
{
uint8_t ch;
int i;
int sum;
ch = RXBUF0;
if (char_timeout_1107 == 0)
rx_msg_ptr = 0;
char_timeout_1107 = SAMPLES_PER_10_SECONDS/200;
if (rx_msg_ptr == 0)
{
if (ch == 0x68)
{
rx_msg.uint8[rx_msg_ptr++] = ch;
rx_msg_len = 12 + MAX_IEC1107_MSG_BODY;
}
}
else
{
if (rx_msg_ptr == 9)
{
if (ch <= MAX_IEC1107_MSG_BODY)
rx_msg_len = 12 + ch;
else
rx_msg_ptr = 0;
}
rx_msg.uint8[rx_msg_ptr++] = ch;
if (rx_msg_ptr == rx_msg_len)
{
/* End of message */
sum = rx_msg.uint8[0];
for (i = 1; i < rx_msg_len - 2; i++)
sum += rx_msg.uint8[i];
if (rx_msg.uint8[rx_msg_len - 2] == (sum & 0xFF)
&&
rx_msg.uint8[rx_msg_len - 1] == 0x16)
{
/* Good message received */
process_rx_message(&rx_msg, rx_msg_len);
}
rx_msg_ptr = 0;
}
}
}
#endif
#if defined(__MSP430__) && (defined(IEC1107_SUPPORT) || defined(SERIAL_CALIBRATION_SUPPORT)) && (defined(USART1RX_VECTOR) || defined(USART1RX_ISR))
/* Interrupt to accept IEC1107 messages. */
ISR(USART1RX, serial_rx_interrupt1)
{
uint8_t ch;
int i;
int sum;
ch = RXBUF1;
if (char_timeout_1107 == 0)
rx_msg_ptr = 0;
char_timeout_1107 = SAMPLES_PER_10_SECONDS/200;
if (rx_msg_ptr == 0)
{
if (ch == 0x68)
{
rx_msg.uint8[rx_msg_ptr++] = ch;
rx_msg_len = 12 + MAX_IEC1107_MSG_BODY;
}
}
else
{
if (rx_msg_ptr == 9)
{
if (ch <= MAX_IEC1107_MSG_BODY)
rx_msg_len = 12 + ch;
else
rx_msg_ptr = 0;
}
rx_msg.uint8[rx_msg_ptr++] = ch;
if (rx_msg_ptr == rx_msg_len)
{
/* End of message */
sum = rx_msg.uint8[0];
for (i = 1; i < rx_msg_len - 2; i++)
sum += rx_msg.uint8[i];
if (rx_msg.uint8[rx_msg_len - 2] == (sum & 0xFF)
&&
rx_msg.uint8[rx_msg_len - 1] == 0x16)
{
/* Good message received */
process_rx_message(&rx_msg, rx_msg_len);
}
rx_msg_ptr = 0;
}
}
}
#endif
/* Interrupt to send IEC1107 messages. */
#if defined(__MSP430__) && (defined(IEC1107_SUPPORT) || defined(SERIAL_CALIBRATION_SUPPORT)) && (defined(USART0TX_VECTOR) || defined(USART0TX_ISR))
ISR(USART0TX, serial_tx_interrupt0)
{
TXBUF0 = tx_msg.uint8[tx_msg_ptr++];
if (tx_msg_ptr >= tx_msg_len)
{
/* Stop transmission */
U0IE &= ~UTXIE0;
tx_msg_ptr = 0;
tx_msg_len = 0;
}
}
#endif
#if defined(__MSP430__) && (defined(IEC1107_SUPPORT) || defined(SERIAL_CALIBRATION_SUPPORT)) && (defined(USART1TX_VECTOR) || defined(USART1TX_ISR))
ISR(USART1TX, serial_tx_interrupt1)
{
TXBUF1 = tx_msg.uint8[tx_msg_ptr++];
if (tx_msg_ptr >= tx_msg_len)
{
/* Stop transmission */
IE2 &= ~UTXIE1;
tx_msg_ptr = 0;
tx_msg_len = 0;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -