Heartbeat displayed on X10

This commit is contained in:
Bertrand Songis
2019-07-15 17:49:43 +02:00
parent 2ed437f86c
commit b369971108
9 changed files with 211 additions and 17 deletions
+46 -5
View File
@@ -18,10 +18,10 @@
* GNU General Public License for more details.
*/
#include <inttypes.h>
#include "crc.h"
// CRC16 implementation according to CCITT standards
static const unsigned short crc16tab[256] = {
static const unsigned short crc16tab_1021[256] = {
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
@@ -56,11 +56,52 @@ static const unsigned short crc16tab[256] = {
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
};
uint16_t crc16(const uint8_t * buf, uint32_t len)
static const unsigned short crc16tab_1189[256] = {
0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf,
0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7,
0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e,
0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876,
0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd,
0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5,
0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c,
0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974,
0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb,
0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3,
0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a,
0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72,
0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9,
0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1,
0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738,
0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70,
0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7,
0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff,
0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036,
0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e,
0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5,
0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd,
0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134,
0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c,
0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3,
0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb,
0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232,
0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a,
0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1,
0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9,
0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330,
0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78
};
static const unsigned short * crc16tab[] = {
crc16tab_1021,
crc16tab_1189
};
uint16_t crc16(uint8_t index, const uint8_t * buf, uint32_t len, uint16_t start)
{
uint16_t crc = 0;
uint16_t crc = start;
const unsigned short * tab = crc16tab[index];
for (uint32_t i=0; i<len; i++) {
crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *buf++) & 0x00FF];
crc = (crc<<8) ^ tab[((crc>>8) ^ *buf++) & 0x00FF];
}
return crc;
}
+34
View File
@@ -0,0 +1,34 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __CRC_H__
#define __CRC_H__
#include <inttypes.h>
enum {
CRC_1021,
CRC_1189,
};
uint8_t crc8(const uint8_t * ptr, uint32_t len);
uint16_t crc16(uint8_t index, const uint8_t * buf, uint32_t len, uint16_t start = 0);
#endif
+12
View File
@@ -166,9 +166,21 @@ bool menuStatsDebug(event_t event)
y += FH;
#endif
#if defined(DEBUG_LATENCY)
lcdDrawText(MENUS_MARGIN_LEFT, y, "Hearbeat");
if (heartbeatCapture.valid)
lcdDrawNumber(MENU_STATS_COLUMN1, y, heartbeatCapture.count, LEFT);
else
lcdDrawText(MENU_STATS_COLUMN1, y, "---");
y += FH;
#endif
#if 0
// TODO in a debug mode?
lcdDrawText(MENUS_MARGIN_LEFT, y, "Telem RX Errs");
lcdDrawNumber(MENU_STATS_COLUMN1, y, telemetryErrors, LEFT);
y += FH;
#endif
#if defined(INTERNAL_GPS)
lcdDrawText(MENUS_MARGIN_LEFT, y, "Internal GPS");
+111 -6
View File
@@ -101,7 +101,7 @@ void FrskyDeviceFirmwareUpdate::startup()
switch(module) {
#if defined(INTMODULE_USART)
case INTERNAL_MODULE:
intmoduleSerialStart(57600, true);
intmoduleSerialStart(INTMODULE_FLASH_BAUDRATE, true);
break;
#endif
@@ -118,6 +118,36 @@ void FrskyDeviceFirmwareUpdate::startup()
SPORT_UPDATE_POWER_ON();
}
bool FrskyDeviceFirmwareUpdate::readBuffer(uint8_t * buffer, uint8_t count, uint32_t timeout)
{
uint32_t elapsed = 0;
uint8_t index = 0;
watchdogSuspend(timeout);
switch(module) {
#if defined(INTMODULE_USART)
case INTERNAL_MODULE:
while (index < count && elapsed < timeout) {
if (intmoduleFifo.pop(buffer[index])) {
++index;
}
else {
RTOS_WAIT_MS(1);
if (++elapsed == timeout)
return false;
}
}
break;
#endif
default:
break;
}
return true;
}
const uint8_t * FrskyDeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout)
{
uint8_t len = 0;
@@ -215,7 +245,7 @@ void FrskyDeviceFirmwareUpdate::sendFrame()
uint8_t * ptr = outputTelemetryBuffer.data;
*ptr++ = 0x7E;
*ptr++ = 0xFF;
frame[7] = crc16(frame, 7);
frame[7] = crc16(CRC_1021, frame, 7);
for (int i=0; i<8; i++) {
if (frame[i] == 0x7E || frame[i] == 0x7D) {
*ptr++ = 0x7D;
@@ -298,6 +328,61 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename)
}
}
#if defined(PCBHORUS)
uint8_t frame[8];
if (!readBuffer(frame, 8, 100) || frame[0] != 0x01) {
return TR("Not responding", "Device not responding");
}
intmoduleSendByte(0x81);
readBuffer(frame, 1, 100);
if (!readBuffer(frame, 8, 100) || frame[0] != 0x02) {
return TR("Not responding", "Device not responding");
}
intmoduleSendByte(0x82);
readBuffer(frame, 1, 100);
uint8_t index = 0;
while (1) {
drawProgressScreen(getBasename(filename), STR_WRITING, file.fptr, file.obj.objsize);
if (f_read(&file, buffer, 1024, &count) != FR_OK) {
f_close(&file);
return "Error reading file";
}
if (!readBuffer(frame, 2, 100))
return "Data refused";
if (frame[0] != 0x11 || frame[1] != index)
return "Wrong request";
if (count == 0) {
f_close(&file);
intmoduleSendByte(0xA1);
RTOS_WAIT_MS(50);
return nullptr;
}
if (count < 1024)
memset(((uint8_t *)buffer) + count, 0, 1024 - count);
intmoduleSendByte(frame[0] + 0x80);
intmoduleSendByte(frame[1]);
uint16_t crc_16 = crc16(CRC_1189, (uint8_t *)buffer, 1024, crc16(CRC_1189, &frame[1], 1));
for (unsigned i = 0; i < sizeof(buffer); i++) {
intmoduleSendByte(((uint8_t *)buffer)[i]);
}
intmoduleSendByte(crc_16 >> 8);
intmoduleSendByte(crc_16);
index++;
}
#else
RTOS_WAIT_MS(200);
telemetryClearFifo();
@@ -333,6 +418,7 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename)
return nullptr;
}
}
#endif
}
const char * FrskyDeviceFirmwareUpdate::endTransfer()
@@ -347,6 +433,28 @@ const char * FrskyDeviceFirmwareUpdate::endTransfer()
return nullptr;
}
const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename)
{
const char * result;
#if defined(PCBHORUS)
if (module == INTERNAL_MODULE) {
intmoduleSerialStart(38400, true);
GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN);
result = uploadFile(filename);
GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN);
return result;
}
#endif
result = sendPowerOn();
if (!result) result = sendReqVersion();
if (!result) result = uploadFile(filename);
if (!result) result = endTransfer();
return result;
}
const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename)
{
pausePulses();
@@ -369,10 +477,7 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename)
startup();
const char * result = sendPowerOn();
if (!result) result = sendReqVersion();
if (!result) result = uploadFile(filename);
if (!result) result = endTransfer();
const char * result = doFlashFirmware(filename);
AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 );
BACKLIGHT_ENABLE();
+2
View File
@@ -79,12 +79,14 @@ class FrskyDeviceFirmwareUpdate {
void startFrame(uint8_t command);
void sendFrame();
bool readBuffer(uint8_t * buffer, uint8_t count, uint32_t timeout);
const uint8_t * readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout);
const uint8_t * readHalfDuplexFrame(uint32_t timeout);
const uint8_t * readFrame(uint32_t timeout);
bool waitState(State state, uint32_t timeout);
void processFrame(const uint8_t * frame);
const char * doFlashFirmware(const char * filename);
const char * sendPowerOn();
const char * sendReqVersion();
const char * uploadFile(const char * filename);
+1 -3
View File
@@ -946,9 +946,7 @@ inline void customFunctionsReset()
}
#include "telemetry/telemetry.h"
uint8_t crc8(const uint8_t * ptr, uint32_t len);
uint16_t crc16(const uint8_t * ptr, uint32_t len);
#include "crc.h"
#define PLAY_REPEAT(x) (x) /* Range 0 to 15 */
#define PLAY_NOW 0x10
+1 -1
View File
@@ -190,7 +190,7 @@ set(SRC
telemetry/frsky_d.cpp
telemetry/frsky_sport.cpp
telemetry/frsky_pxx2.cpp
crc16.cpp
crc.cpp
vario.cpp
)
+1
View File
@@ -571,6 +571,7 @@
#define INTMODULE_BOOTCMD_GPIO GPIOI
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_9 // PI.09
#endif
#define INTMODULE_FLASH_BAUDRATE 38400
#if defined(PCBX10) || PCBREV >= 13
#define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
+3 -2
View File
@@ -864,9 +864,10 @@
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define INTMODULE_DMA_CHANNEL DMA_Channel_4
#if defined(PCBXLITES)
#define INTMODULE_BOOTCMD_GPIO GPIOC
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08
#define INTMODULE_BOOTCMD_GPIO GPIOC
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08
#endif
#define INTMODULE_FLASH_BAUDRATE 57600
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)