Skip to content

Commit

Permalink
Improve remote handling
Browse files Browse the repository at this point in the history
  • Loading branch information
WiseLord committed Feb 11, 2019
1 parent 9678911 commit e656c3c
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 31 deletions.
62 changes: 51 additions & 11 deletions actions.c
Expand Up @@ -172,26 +172,66 @@ static void actionGetEncoder(void)
}
}

static bool isRemoteCmdRepeatable(RcCmd cmd)
{
Screen screen = screenGet();

switch (cmd) {
case RC_CMD_VOL_UP:
case RC_CMD_VOL_DOWN:
return true;
case RC_CMD_NAV_UP:
case RC_CMD_NAV_DOWN:
switch (screen) {
case SCREEN_AUDIO_PARAM:
case SCREEN_AUDIO_INPUT:
return true;
}
case RC_CMD_NAV_LEFT:
case RC_CMD_NAV_RIGHT:
switch (screen) {
case SCREEN_TUNER:
return true;
}
break;
}

return false;
}

static void actionGetRemote(void)
{
RcData rcData = rcRead(true);
static RcCmd cmdPrev = RC_CMD_END;

if (rcData.ready) {
swTimSet(SW_TIM_RC_NOACION, 200);

RcCmd cmd = rcGetCmd(&rcData);
if (rcData.repeat) {
// Allow repeat only following commands
if (cmd == RC_CMD_VOL_UP ||
cmd == RC_CMD_VOL_DOWN) {
if (swTimGet(SW_TIM_RC_REPEAT) > 0)
return;
int32_t repTime = swTimGet(SW_TIM_RC_REPEAT);

if (cmd != cmdPrev) {
actionSet(ACTION_REMOTE, (int16_t)cmd);
swTimSet(SW_TIM_RC_REPEAT, 1000);
cmdPrev = cmd;
} else {
if (isRemoteCmdRepeatable(cmd)) {
if (repTime < 500) {
actionSet(ACTION_REMOTE, (int16_t)cmd);
}
} else {
return;
if (repTime == 0) {
actionSet(ACTION_REMOTE, (int16_t)cmd);
swTimSet(SW_TIM_RC_REPEAT, 1000);
}
}
} else {
swTimSet(SW_TIM_RC_REPEAT, 400); // Allow repeat after this time
}

actionSet(ACTION_REMOTE, (int16_t)cmd);
} else {
if (swTimGet(SW_TIM_RC_NOACION) == 0) {
swTimSet(SW_TIM_RC_NOACION, SW_TIM_OFF);
swTimSet(SW_TIM_RC_REPEAT, 0);
cmdPrev = RC_CMD_END;
}
}
}

Expand Down
1 change: 0 additions & 1 deletion handlers.h
Expand Up @@ -20,7 +20,6 @@ void PendSV_Handler(void);
void SysTick_Handler(void);
void RTC_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
void EXTI9_5_IRQHandler(void);

#ifdef __cplusplus
Expand Down
22 changes: 6 additions & 16 deletions rc.c
Expand Up @@ -9,12 +9,13 @@

static uint16_t rcCode[RC_CMD_END]; // Array with rc commands

typedef enum {
typedef uint8_t NecState;
enum {
STATE_NEC_IDLE = 0,
STATE_NEC_INIT,
STATE_NEC_REPEAT,
STATE_NEC_RECEIVE,
} NecState;
};

typedef struct {
union {
Expand Down Expand Up @@ -71,12 +72,13 @@ typedef struct {
#define RC6_MAX(delay) ((uint16_t)((delay) * RC6_DEV_MAX))
#define RC6_NEAR(value, delay) (value > RC6_MIN(delay) && value < RC6_MAX(delay))

typedef enum {
typedef uint8_t RC5State;
enum {
STATE_RC5_MID0 = 0,
STATE_RC5_MID1,
STATE_RC5_START0,
STATE_RC5_START1,
} RC5State;
};

static uint16_t ovfCnt;

Expand All @@ -95,7 +97,6 @@ static void rcDecodeNecSam (bool rc, uint16_t delay)
} else if (NEC_NEAR(delay, NEC_REPEAT) && ovfCnt < NEC_REPEAT_LIMIT) {
ovfCnt = 0;
// Ready repeated data
rcData.repeat = true;
rcData.ready = true;
}
} else if (seq.state == STATE_NEC_RECEIVE) {
Expand All @@ -115,7 +116,6 @@ static void rcDecodeNecSam (bool rc, uint16_t delay)
ovfCnt = 0;
// Ready new data
rcData.type = seq.type;
rcData.repeat = false;
if ((uint8_t)(~seq.haddr) == seq.laddr) {
rcData.addr = seq.laddr;
} else {
Expand Down Expand Up @@ -152,9 +152,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
static uint16_t rc6Cmd = 0; // RC6 command
static RC5State rc6State = STATE_RC5_START1; // RC6 decoding state

static uint8_t rc6TogBitOld = 0;
uint8_t rc6TogBit = 0;

if (rc) {
if (RC6_NEAR(delay, RC6_2T)) {
if (rc5State == STATE_RC5_START1) {
Expand All @@ -177,7 +174,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
if (rc6Cnt == 17) {
rc6State = STATE_RC5_MID0;
--rc6Cnt;
rc6TogBit = 0;
}
}
} else if (RC6_NEAR(delay, RC6_4T)) {
Expand All @@ -204,7 +200,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
if (rc6Cnt == 17) {
rc6State = STATE_RC5_MID0;
--rc6Cnt;
rc6TogBit = 0;
} else if (rc6Cnt == 21 || rc6Cnt == 16) {
rc6State = STATE_RC5_MID0;
if (--rc6Cnt < 16) {
Expand Down Expand Up @@ -236,7 +231,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
if (rc6Cnt == 17) {
rc6State = STATE_RC5_MID1;
--rc6Cnt;
rc6TogBit = 1;
}
}
if (rc5State == STATE_RC5_MID1) {
Expand Down Expand Up @@ -267,7 +261,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
if (rc6Cnt == 17) {
rc6State = STATE_RC5_MID1;
--rc6Cnt;
rc6TogBit = 1;
} else if (rc6Cnt == 16) {
rc6State = STATE_RC5_MID1;
rc6Cmd <<= 1;
Expand All @@ -286,7 +279,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)

if (rc5Cnt == 0 || rc6Cnt == 0) {
if (rc5Cnt == 0) {
rc6TogBit = (rc5Cmd & RC5_TOGB_MASK) != 0;
rcData.type = RC_TYPE_RC5;
rcData.addr = (rc5Cmd & RC5_ADDR_MASK) >> 6;
rcData.cmd = (rc5Cmd & RC5_COMM_MASK) | (rc5Cmd & RC5_FIBT_MASK ? 0x00 : 0x40);
Expand All @@ -298,8 +290,6 @@ static void rcDecodeRC56 (bool rc, uint16_t delay)
rc6Cnt = 22;
rc5Cnt = 13;
rcData.ready = true;
rcData.repeat = (rc6TogBit == rc6TogBitOld);
rc6TogBitOld = rc6TogBit;
}
}

Expand Down
6 changes: 3 additions & 3 deletions rc.h
Expand Up @@ -12,7 +12,8 @@ extern "C" {

#define GENERATE_RC_CMD(RC) RC_CMD_ ## RC,

typedef enum {
typedef uint8_t RcType;
enum {
RC_TYPE_NONE = 0,

RC_TYPE_NEC,
Expand All @@ -21,13 +22,12 @@ typedef enum {
RC_TYPE_RC6,

RC_TYPE_END
} RcType;
};

typedef struct {
RcType type;
uint16_t addr;
uint8_t cmd;
bool repeat;
bool ready;
} RcData;

Expand Down
1 change: 1 addition & 0 deletions swtimers.h
Expand Up @@ -16,6 +16,7 @@ enum {
SW_TIM_TUNER_POLL,
SW_TIM_INIT_HW,
SW_TIM_RC_REPEAT,
SW_TIM_RC_NOACION,

SW_TIM_END,
};
Expand Down

0 comments on commit e656c3c

Please sign in to comment.