[Horus] Nothing on Heartbeat PIN

This commit is contained in:
Bertrand Songis
2016-06-24 21:45:49 +02:00
parent f697d36b1c
commit 80291c73c4
10 changed files with 64 additions and 132 deletions
+1 -1
View File
@@ -295,8 +295,8 @@ enum BeeperMode {
TRAINER_MODE_SLAVE,
#if defined(PCBTARANIS)
TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
#endif
TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
#endif
TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
};
#elif defined(PCBSKY9X)
+1 -4
View File
@@ -490,10 +490,7 @@ bool isRfProtocolAvailable(int protocol)
#if defined(PCBHORUS)
bool isTrainerModeAvailable(int mode)
{
if (IS_EXTERNAL_MODULE_PRESENT() && mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)
return false;
else
return true;
return true;
}
#elif defined(PCBTARANIS)
bool isTrainerModeAvailable(int mode)
+1 -1
View File
@@ -559,7 +559,7 @@ bool menuModelSetup(evt_t event)
case ITEM_MODEL_TRAINER_MODE:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE);
g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, 0, HAS_WIRELESS_TRAINER_HARDWARE() ? TRAINER_MODE_MASTER_BATTERY_COMPARTMENT : TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, attr, event);
g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, 0, HAS_WIRELESS_TRAINER_HARDWARE() ? TRAINER_MODE_MASTER_BATTERY_COMPARTMENT : TRAINER_MODE_SLAVE, attr, event);
break;
case ITEM_MODEL_EXTERNAL_MODULE_LABEL:
+3 -3
View File
@@ -48,9 +48,9 @@
#endif
#if defined(PCBSTD)
#define GVAR_VALUE(x, p) g_model.gvars[x]
#define GVAR_VALUE(x, p) g_model.gvars[x]
#else
#define GVAR_VALUE(gv, fm) g_model.flightModeData[fm].gvars[gv]
#define GVAR_VALUE(gv, fm) g_model.flightModeData[fm].gvars[gv]
#endif
#define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol
@@ -58,7 +58,7 @@
#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount)
#if defined(PCBHORUS)
#define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)
#define IS_TRAINER_EXTERNAL_MODULE() false
#define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER)
#elif defined(PCBTARANIS)
#define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)
+46 -53
View File
@@ -18,7 +18,7 @@
* GNU General Public License for more details.
*/
#include "../../opentx.h"
#include "opentx.h"
#if defined(__cplusplus) && !defined(SIMU)
extern "C" {
@@ -31,12 +31,12 @@ extern "C" {
void watchdogInit(unsigned int duration)
{
IWDG->KR = 0x5555 ; // Unlock registers
IWDG->PR = 3 ; // Divide by 32 => 1kHz clock
IWDG->KR = 0x5555 ; // Unlock registers
IWDG->RLR = duration ; // 1.5 seconds nominal
IWDG->KR = 0xAAAA ; // reload
IWDG->KR = 0xCCCC ; // start
IWDG->KR = 0x5555; // Unlock registers
IWDG->PR = 3; // Divide by 32 => 1kHz clock
IWDG->KR = 0x5555; // Unlock registers
IWDG->RLR = duration; // 1.5 seconds nominal
IWDG->KR = 0xAAAA; // reload
IWDG->KR = 0xCCCC; // start
}
void getCPUUniqueID(char * s)
@@ -52,7 +52,7 @@ void getCPUUniqueID(char * s)
// Start TIMER7 at 2000000Hz
void init2MhzTimer()
{
TIMER_2MHz_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1 ; // 0.5 uS, 2 MHz
TIMER_2MHz_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5 uS, 2 MHz
TIMER_2MHz_TIMER->ARR = 65535;
TIMER_2MHz_TIMER->CR2 = 0;
TIMER_2MHz_TIMER->CR1 = TIM_CR1_CEN;
@@ -61,21 +61,21 @@ void init2MhzTimer()
// Starts TIMER at 1000Hz
void init1msTimer()
{
INTERRUPT_5MS_TIMER->ARR = 999 ; // 1mS
INTERRUPT_5MS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1 ; // 1uS from 30MHz
INTERRUPT_5MS_TIMER->CCER = 0 ;
INTERRUPT_5MS_TIMER->CCMR1 = 0 ;
INTERRUPT_5MS_TIMER->EGR = 0 ;
INTERRUPT_5MS_TIMER->CR1 = 5 ;
INTERRUPT_5MS_TIMER->DIER |= 1 ;
NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn) ;
INTERRUPT_5MS_TIMER->ARR = 999; // 1mS
INTERRUPT_5MS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS from 30MHz
INTERRUPT_5MS_TIMER->CCER = 0;
INTERRUPT_5MS_TIMER->CCMR1 = 0;
INTERRUPT_5MS_TIMER->EGR = 0;
INTERRUPT_5MS_TIMER->CR1 = 5;
INTERRUPT_5MS_TIMER->DIER |= 1;
NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 7);
}
// TODO use the same than board_sky9x.cpp
void interrupt1ms()
{
static uint32_t pre_scale ; // Used to get 10 Hz counter
static uint32_t pre_scale; // Used to get 10 Hz counter
++pre_scale;
@@ -89,8 +89,8 @@ void interrupt1ms()
}
if ( pre_scale == 10 ) {
pre_scale = 0 ;
if (pre_scale == 10) {
pre_scale = 0;
DEBUG_TIMER_START(debugTimerPer10ms);
per10ms();
DEBUG_TIMER_STOP(debugTimerPer10ms);
@@ -104,40 +104,39 @@ void interrupt1ms()
#if !defined(SIMU)
extern "C" void TIM8_TRG_COM_TIM14_IRQHandler()
{
TIM14->SR &= ~TIM_SR_UIF ;
interrupt1ms() ;
TIM14->SR &= ~TIM_SR_UIF;
interrupt1ms();
DEBUG_INTERRUPT(INT_1MS);
}
void boardInit()
{
RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph |
LED_RCC_AHB1Periph |
LCD_RCC_AHB1Periph |
AUDIO_RCC_AHB1Periph |
KEYS_RCC_AHB1Periph_GPIO |
ADC_RCC_AHB1Periph |
SERIAL_RCC_AHB1Periph |
RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph |
LED_RCC_AHB1Periph |
LCD_RCC_AHB1Periph |
AUDIO_RCC_AHB1Periph |
KEYS_RCC_AHB1Periph_GPIO |
ADC_RCC_AHB1Periph |
SERIAL_RCC_AHB1Periph |
TELEMETRY_RCC_AHB1Periph |
TRAINER_RCC_AHB1Periph |
HEARTBEAT_RCC_AHB1Periph |
AUDIO_RCC_AHB1Periph |
HAPTIC_RCC_AHB1Periph |
INTMODULE_RCC_AHB1Periph |
EXTMODULE_RCC_AHB1Periph,
AUDIO_RCC_AHB1Periph |
HAPTIC_RCC_AHB1Periph |
INTMODULE_RCC_AHB1Periph |
EXTMODULE_RCC_AHB1Periph,
ENABLE);
RCC_APB1PeriphClockCmd(INTERRUPT_5MS_APB1Periph |
TIMER_2MHz_APB1Periph |
AUDIO_RCC_APB1Periph |
SERIAL_RCC_APB1Periph |
RCC_APB1PeriphClockCmd(INTERRUPT_5MS_APB1Periph |
TIMER_2MHz_APB1Periph |
AUDIO_RCC_APB1Periph |
SERIAL_RCC_APB1Periph |
TELEMETRY_RCC_APB1Periph |
TRAINER_RCC_APB1Periph |
AUDIO_RCC_APB1Periph |
EXTMODULE_RCC_APB1Periph,
AUDIO_RCC_APB1Periph |
EXTMODULE_RCC_APB1Periph,
ENABLE);
RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph |
ADC_RCC_APB2Periph |
HAPTIC_RCC_APB2Periph |
RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph |
ADC_RCC_APB2Periph |
HAPTIC_RCC_APB2Periph |
INTMODULE_RCC_APB2Periph, ENABLE);
pwrInit();
@@ -201,7 +200,7 @@ void usbJoystickUpdate(void)
//buttons
HID_Buffer[0] = 0; //buttons
for (int i = 0; i < 8; ++i) {
if ( channelOutputs[i+8] > 0 ) {
if (channelOutputs[i+8] > 0) {
HID_Buffer[0] |= (1 << i);
}
}
@@ -210,12 +209,12 @@ void usbJoystickUpdate(void)
//uint8_t * p = HID_Buffer + 1;
for (int i = 0; i < 8; ++i) {
int16_t value = channelOutputs[i] / 8;
if ( value > 127 ) value = 127;
else if ( value < -127 ) value = -127;
if (value > 127) value = 127;
else if (value < -127) value = -127;
HID_Buffer[i+1] = static_cast<int8_t>(value);
}
USBD_HID_SendReport (&USB_OTG_dev, HID_Buffer, HID_IN_PACKET );
USBD_HID_SendReport (&USB_OTG_dev, HID_Buffer, HID_IN_PACKET);
}
#endif //#if defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU)
@@ -234,9 +233,6 @@ void checkTrainerSettings()
case TRAINER_MODE_SLAVE:
stop_trainer_ppm();
break;
case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE:
stop_cppm_on_heartbeat_capture() ;
break;
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
serial2Stop();
}
@@ -246,9 +242,6 @@ void checkTrainerSettings()
case TRAINER_MODE_SLAVE:
init_trainer_ppm();
break;
case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE:
init_cppm_on_heartbeat_capture() ;
break;
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
if (g_eeGeneral.serial2Mode == UART_MODE_SBUS_TRAINER) {
serial2SbusInit();
@@ -266,5 +259,5 @@ void checkTrainerSettings()
uint16_t getBatteryVoltage()
{
int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose
return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration) ) / 1629);
return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) / 1629);
}
+4 -6
View File
@@ -50,12 +50,12 @@ extern "C" {
#include "usbd_msc_core.h"
#include "usbd_hid_core.h"
#include "usbd_usr.h"
#include "../horus/usbd_desc.h"
#include "../horus/usb_conf.h"
#include "../horus/usbd_conf.h"
#include "usbd_desc.h"
#include "usb_conf.h"
#include "usbd_conf.h"
#endif
#include "../horus/hal.h"
#include "hal.h"
#if defined(__cplusplus) && !defined(SIMU)
}
@@ -179,8 +179,6 @@ void init_trainer_ppm(void);
void stop_trainer_ppm(void);
void init_trainer_capture(void);
void stop_trainer_capture(void);
void init_cppm_on_heartbeat_capture(void);
void stop_cppm_on_heartbeat_capture(void);
// Keys driver
void keysInit(void);
+2 -6
View File
@@ -31,16 +31,12 @@ void extmoduleStop()
EXTMODULE_TIMER->DIER &= ~(TIM_DIER_CC2IE | TIM_DIER_UDE);
EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
if (!IS_TRAINER_EXTERNAL_MODULE()) {
EXTERNAL_MODULE_OFF();
}
EXTERNAL_MODULE_OFF();
}
void extmoduleNoneStart()
{
if (!IS_TRAINER_EXTERNAL_MODULE()) {
EXTERNAL_MODULE_OFF();
}
EXTERNAL_MODULE_OFF();
GPIO_PinAFConfig(EXTMODULE_PPM_GPIO, EXTMODULE_PPM_GPIO_PinSource, 0);
+3 -10
View File
@@ -2,7 +2,7 @@
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
@@ -121,8 +121,8 @@
#define ADC_SPI_PIN_MOSI GPIO_Pin_6
#define ADC_SPI_PIN_MISO GPIO_Pin_5
#define ADC_SPI_PinSource_SCK GPIO_PinSource2
#define ADC_SPI_PinSource_MISO GPIO_PinSource5
#define ADC_SPI_PinSource_MOSI GPIO_PinSource6
#define ADC_SPI_PinSource_MISO GPIO_PinSource5
#define ADC_SPI_PinSource_MOSI GPIO_PinSource6
#define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.8 ADC3_IN6 J5 MOUSE_X
#define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.9 ADC3_IN7 J6 MOUSE_Y
#define ADC_IN_MOUSE1 6
@@ -326,13 +326,6 @@
#define TRAINER_DMA_FLAG_TC DMA_IT_TCIF2
#define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
// Heartbeat
#define HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD
#define HEARTBEAT_GPIO_PIN GPIO_Pin_12 // PD.12
#define HEARTBEAT_TIMER TIM4
#define HEARTBEAT_TIMER_IRQn TIM4_IRQn
#define HEARTBEAT_TIMER_IRQHandler TIM4_IRQHandler
// 5ms Interrupt
#define INTERRUPT_5MS_APB1Periph RCC_APB1Periph_TIM14
#define INTERRUPT_5MS_TIMER TIM14
@@ -152,50 +152,3 @@ extern "C" void TRAINER_TIMER_IRQHandler()
trainerSendNextFrame();
}
}
extern "C" void HEARTBEAT_TIMER_IRQHandler()
{
uint16_t capture = 0;
bool doCapture = false;
if ((HEARTBEAT_TIMER->DIER & TIM_DIER_CC2IE ) && (HEARTBEAT_TIMER->SR & TIM_SR_CC2IF)) {
// capture mode on heartbeat pin (external module)
capture = HEARTBEAT_TIMER->CCR2;
if (currentTrainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) {
doCapture = true;
}
}
if (doCapture) {
captureTrainerPulses(capture);
}
}
void init_cppm_on_heartbeat_capture(void)
{
EXTERNAL_MODULE_ON();
configure_pins(HEARTBEAT_GPIO_PIN, PIN_PERIPHERAL | PIN_PORTD | PIN_PER_2);
HEARTBEAT_TIMER->ARR = 0xFFFF;
HEARTBEAT_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5uS
HEARTBEAT_TIMER->CR2 = 0;
HEARTBEAT_TIMER->CCMR1 = TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0;
HEARTBEAT_TIMER->CCER = TIM_CCER_CC2E;
HEARTBEAT_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag
HEARTBEAT_TIMER->DIER |= TIM_DIER_CC2IE;
HEARTBEAT_TIMER->CR1 = TIM_CR1_CEN;
NVIC_SetPriority(HEARTBEAT_TIMER_IRQn, 7);
NVIC_EnableIRQ(HEARTBEAT_TIMER_IRQn);
}
void stop_cppm_on_heartbeat_capture(void)
{
HEARTBEAT_TIMER->DIER = 0;
HEARTBEAT_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop counter
NVIC_DisableIRQ(HEARTBEAT_TIMER_IRQn); // Stop Interrupt
if (!IS_EXTERNAL_MODULE_PRESENT()) {
EXTERNAL_MODULE_OFF();
}
}
+3 -1
View File
@@ -77,7 +77,9 @@
#define BUTTON(x) "[" x "]"
#endif
#if defined(PCBTARANIS)
#if defined(PCBHORUS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_BATTERY
#elif defined(PCBTARANIS)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY
#elif defined(CPUARM)
#define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY