Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Semerád Pavel
gt3b
Commits
925ef1c4
Commit
925ef1c4
authored
Apr 16, 2012
by
Pavel Semerad
Browse files
added timers, repaired BLS handling - only lap count now
parent
0f94b1bb
Changes
10
Hide whitespace changes
Inline
Side-by-side
.depend
View file @
925ef1c4
...
...
@@ -28,4 +28,6 @@ menu_mix.o: menu_mix.c menu.h gt3b.h stm8.h task.h \
config.h eeprom.h calc.h timer.h ppm.h lcd.h buzzer.h input.h
menu_key.o: menu_key.c menu.h gt3b.h stm8.h task.h \
config.h eeprom.h calc.h timer.h ppm.h lcd.h buzzer.h input.h
menu_timer.o: menu_timer.c menu.h gt3b.h stm8.h \
task.h lcd.h config.h eeprom.h
vector.o: vector.c
Makefile
View file @
925ef1c4
PROGRAM
=
gt3b
SRCC
=
task.c main.c ppm.c lcd.c input.c buzzer.c timer.c eeprom.c config.c calc.c menu_common.c menu.c menu_service.c menu_global.c menu_popup.c menu_mix.c menu_key.c
SRCC
=
task.c main.c ppm.c lcd.c input.c buzzer.c timer.c eeprom.c config.c calc.c menu_common.c menu.c menu_service.c menu_global.c menu_popup.c menu_mix.c menu_key.c
menu_timer.c
INTRS
=
vector.c
SMODE
=
#SMODE = l
...
...
compile.bat
View file @
925ef1c4
...
...
@@ -19,6 +19,7 @@
%TOOLSET%
/cxstm
8
+warn +proto +mods
0
+debug -i
.
-i
%TOOLSET%
/Hstm
8
-l -pxp -ac -dMAX
_CHANNELS
=
%CHANNELS%
menu_popup
.c
%TOOLSET%
/cxstm
8
+warn +proto +mods
0
+debug -i
.
-i
%TOOLSET%
/Hstm
8
-l -pxp -ac -dMAX
_CHANNELS
=
%CHANNELS%
menu_mix
.c
%TOOLSET%
/cxstm
8
+warn +proto +mods
0
+debug -i
.
-i
%TOOLSET%
/Hstm
8
-l -pxp -ac -dMAX
_CHANNELS
=
%CHANNELS%
menu_key
.c
%TOOLSET%
/cxstm
8
+warn +proto +mods
0
+debug -i
.
-i
%TOOLSET%
/Hstm
8
-l -pxp -ac -dMAX
_CHANNELS
=
%CHANNELS%
menu_timer
.c
%TOOLSET%
/cxstm
8
+warn +proto +mods
0
+debug -i
.
-i
%TOOLSET%
/Hstm
8
-l -pxp -ac -dMAX
_CHANNELS
=
%CHANNELS%
vector
.c
%TOOLSET%
/clnk -l
%TOOLSET%
/Lib -o
gt3b
.sm8
-mgt
3
b
.map
compile
.lkf
%TOOLSET%
/cvdwarf
gt3b
.sm8
...
...
compile.lkf
View file @
925ef1c4
...
...
@@ -8,7 +8,7 @@
+seg .data -b 0x100 -m 0x6ff+1-0x100 -n .data
+seg .bss -a .data -n .bss
crtsi0.sm8
task.o main.o ppm.o lcd.o input.o buzzer.o timer.o eeprom.o config.o calc.o menu_common.o menu.o menu_service.o menu_global.o menu_popup.o menu_mix.o menu_key.o
task.o main.o ppm.o lcd.o input.o buzzer.o timer.o eeprom.o config.o calc.o menu_common.o menu.o menu_service.o menu_global.o menu_popup.o menu_mix.o menu_key.o
menu_timer.o
libis0.sm8
libm0.sm8
...
...
config.c
View file @
925ef1c4
...
...
@@ -90,7 +90,7 @@ static const config_key_mapping_s default_key_mapping = {
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
// CH3 to nothing
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
// BACK to nothing
{
0
,
0
,
0
,
0
,
20
,
0
,
0
,
0
}
// END-long to battery low shutup
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
}
// END-long to battery low shutup
},
// trims: function, reverse, step, buttons
{
...
...
config.h
View file @
925ef1c4
...
...
@@ -126,7 +126,7 @@ typedef struct {
// change MAGIC number when changing model config
// also add code to setting default values
// 24 + 22(keys) + channels * 4 bytes
#define CONFIG_MODEL_MAGIC (0xf
9
20 | (MAX_CHANNELS - 1))
#define CONFIG_MODEL_MAGIC (0xf
8
20 | (MAX_CHANNELS - 1))
typedef
struct
{
u8
name
[
3
];
u8
reverse
;
// bit for each channel
...
...
menu.c
View file @
925ef1c4
...
...
@@ -36,12 +36,9 @@
// variables to be used in CALC task
u8
menu_force_value_channel
;
// set PPM value for this channel
s16
menu_force_value
;
// to this value (-500..500)
_Bool
menu_tmp_flag
;
//
u8
menu_lap_count
;
// lap count
...
...
@@ -49,6 +46,8 @@ u8 menu_lap_count; // lap count
_Bool
menu_wants_adc
;
// don't stop main loop and check keys
u8
menu_check_keys
;
// temporary flag used when doing reset (global/all models/model)
_Bool
menu_tmp_flag
;
...
...
@@ -66,18 +65,17 @@ static void show_model_number(u8 model) {
// show main screen (model number and name/battery/...)
static
void
main_screen
(
u8
item
)
{
lcd_segment
(
LS_SYM_MODELNO
,
LS_ON
);
lcd_segment
(
LS_SYM_CHANNEL
,
LS_OFF
);
lcd_segment
(
LS_SYM_PERCENT
,
LS_OFF
);
show_model_number
(
cg
.
model
);
menu_wants_adc
=
0
;
// chars is item dependent
if
(
item
==
MS_NAME
)
{
// model name
lcd_segment
(
LS_SYM_MODELNO
,
LS_ON
);
lcd_segment
(
LS_SYM_CHANNEL
,
LS_OFF
);
lcd_segment
(
LS_SYM_PERCENT
,
LS_OFF
);
lcd_segment
(
LS_SYM_DOT
,
LS_OFF
);
lcd_segment
(
LS_SYM_VOLTS
,
LS_OFF
);
show_model_number
(
cg
.
model
);
lcd_chars
(
cm
.
name
);
}
else
if
(
item
==
MS_BATTERY
)
{
...
...
@@ -85,8 +83,12 @@ static void main_screen(u8 item) {
static
u16
bat_time
;
// battery voltage
lcd_segment
(
LS_SYM_MODELNO
,
LS_ON
);
lcd_segment
(
LS_SYM_CHANNEL
,
LS_OFF
);
lcd_segment
(
LS_SYM_PERCENT
,
LS_OFF
);
lcd_segment
(
LS_SYM_DOT
,
LS_ON
);
lcd_segment
(
LS_SYM_VOLTS
,
LS_ON
);
show_model_number
(
cg
.
model
);
// calculate voltage from current raw value and calib value
if
(
time_sec
>=
bat_time
)
{
bat_time
=
time_sec
+
2
;
...
...
@@ -95,11 +97,9 @@ static void main_screen(u8 item) {
lcd_char_num3
(
bat_val
);
menu_wants_adc
=
1
;
}
else
if
(
item
==
MS_LAP_COUNT
)
{
lcd_segment
(
LS_SYM_DOT
,
LS_OFF
);
lcd_segment
(
LS_SYM_VOLTS
,
LS_OFF
);
lcd_segment
(
LS_SYM_PERCENT
,
LS_ON
);
lcd_char_num3
(
menu_lap_count
);
else
{
// timers
menu_timer_show
((
u8
)(
item
-
MS_TIMER1
));
}
lcd_update
();
}
...
...
@@ -662,10 +662,16 @@ static void menu_loop(void) {
// don't wanted in submenus, will be set back in main_screen()
menu_wants_adc
=
0
;
menu_timer_wakeup
=
0
;
// Enter long key - global/calibrate/key-test
if
(
btnl
(
BTN_ENTER
))
{
if
(
adc_steering_ovs
>
(
CALIB_ST_MID_HIGH
<<
ADC_OVS_SHIFT
))
if
(
menu_main_screen
>=
MS_TIMER1
)
{
key_beep
();
menu_timer_lap_times
((
u8
)(
menu_main_screen
-
MS_TIMER1
));
btnra
();
}
else
if
(
adc_steering_ovs
>
(
CALIB_ST_MID_HIGH
<<
ADC_OVS_SHIFT
))
menu_calibrate
(
0
);
else
if
(
adc_steering_ovs
<
(
CALIB_ST_LOW_MID
<<
ADC_OVS_SHIFT
))
menu_key_test
();
...
...
@@ -675,7 +681,9 @@ static void menu_loop(void) {
// Enter key - menu
else
if
(
btn
(
BTN_ENTER
))
{
key_beep
();
select_menu
();
if
(
menu_main_screen
>=
MS_TIMER1
)
menu_timer_setup
((
u8
)(
menu_main_screen
-
MS_TIMER1
));
else
select_menu
();
btnra
();
}
...
...
menu.h
View file @
925ef1c4
...
...
@@ -40,6 +40,7 @@
#define CHANNEL_FAST 5
#define MIX_FAST 5
#define SPEED_FAST 5
#define TIMER_ALARM_FAST 5
// delay in seconds of popup menu (trim, dualrate, ...)
#define POPUP_DELAY 5
...
...
@@ -66,11 +67,7 @@ extern s8 menu_4WS_mix; // mix -100..100
extern
_Bool
menu_4WS_crab
;
// when 1, crab steering
extern
s8
menu_DIG_mix
;
// mix -100..100
extern
u8
menu_MP_index
;
// index of MultiPosition channel
extern
_Bool
menu_tmp_flag
;
//
extern
u8
menu_lap_count
;
// lap count
...
...
@@ -89,6 +86,8 @@ extern _Bool battery_low_shutup; // stop bat low beeping
extern
u16
battery_low_raw
;
// don't stop main loop and check keys
extern
u8
menu_check_keys
;
// temporary flag used when doing reset (global/all models/model)
extern
_Bool
menu_tmp_flag
;
...
...
@@ -123,8 +122,9 @@ extern void menu_buttons_initialize(void);
extern
u8
menu_main_screen
;
#define MS_NAME 0
#define MS_BATTERY 1
#define MS_LAP_COUNT 2
#define MS_MAX 3
#define MS_TIMER1 2
#define MS_TIMER2 3
#define MS_MAX 4
// common menus, select item in 7SEG and then modify its setting at CHR3
// val_id: 1..num_values - which param of this item to change
// action: 0=show, 1=change, 2=get_next_val_id
...
...
@@ -132,5 +132,49 @@ typedef u8 (*menu_func_t)(u8 val_id, u8 action, u8 *chars_blink);
extern
void
menu_common
(
menu_func_t
*
menu_funcs
,
u8
menu_nitems
,
u8
use_stop
);
// timers
// types
#define TIMER_NUM 2
#define TIMER_OFF 0
#define TIMER_UP 1
#define TIMER_DOWN 2
#define TIMER_LAP 3
#define TIMER_LAPCNT 4
#define TIMER_TYPE_MAX 4
#define TIMER_TYPE(tid) ((u8)(tid ? cg.timer2_type : cg.timer1_type))
#define TIMER_TYPE_SET(tid, val) \
if (tid) cg.timer2_type = (u8)val; \
else cg.timer1_type = (u8)val;
#define TIMER_ALARM(tid) ((u8)(tid ? cg.timer2_alarm : cg.timer1_alarm))
#define TIMER_ALARM_SET(tid, val) \
if (tid) cg.timer2_alarm = (u8)val; \
else cg.timer1_alarm = (u8)val;
// menu task will be waked-up periodically to show timer value
extern
_Bool
menu_timer_wakeup
;
extern
u8
menu_timer_running
;
// running timers, one bit for one timer
extern
@
near
u8
menu_timer_throttle
;
// throttle start, one bit for one timer
typedef
struct
{
u16
sec
;
// timer seconds
u8
hdr
;
// timers 0.01 seconds
}
menu_timer_s
;
extern
@
near
menu_timer_s
menu_timer
[];
// actual timer values
#define TIMER_READ(pt, tsec, thdr) \
sim(); \
tsec = pt->sec; \
thdr = pt->hdr; \
rim();
void
menu_timer_show
(
u8
tid
);
void
menu_timer_setup
(
u8
tid
);
void
menu_timer_lap_times
(
u8
tid
);
void
kf_menu_timer_start
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
);
void
kf_menu_timer_reset
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
);
#endif
menu_popup.c
View file @
925ef1c4
...
...
@@ -619,7 +619,7 @@ typedef struct {
#define SF_ROTATE 1
// set channel value to one endpoint
// set channel value to one endpoint
(also to middle with 3-pos CH3)
static
void
kf_set_switch
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
prev_val
)
{
u8
*
name
=
param
?
param
:
id
;
et_functions_s
*
etf
=
menu_et_function_find_name
(
name
);
...
...
@@ -732,16 +732,6 @@ static void kf_multi_position_reset(u8 *id, u8 *param, u8 flags, s16 *pv) {
}
}
// lap counter
static
void
kf_lap_count
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
)
{
menu_lap_count
++
;
menu_main_screen
=
MS_LAP_COUNT
;
}
static
void
kf_lap_count_reset
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
)
{
menu_lap_count
=
0
;
menu_main_screen
=
MS_LAP_COUNT
;
}
// shut up battery low beeper
static
void
kf_battery_low_shutup
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
)
{
battery_low_shutup
=
1
;
...
...
@@ -754,6 +744,7 @@ static void kf_battery_low_shutup(u8 *id, u8 *param, u8 flags, s16 *pv) {
// table of key functions
static
const
key_functions_s
key_functions
[]
=
{
{
0
,
"OFF"
,
KF_NONE
,
NULL
,
NULL
,
0
},
{
22
,
"BLS"
,
KF_NOSHOW
,
kf_battery_low_shutup
,
NULL
,
0
},
// default END-long
{
1
,
"CH3"
,
KF_2STATE
,
kf_set_switch
,
NULL
,
3
},
{
7
,
"C3R"
,
KF_NONE
,
kf_reset
,
"CH3"
,
3
},
#if MAX_CHANNELS >= 4
...
...
@@ -781,9 +772,10 @@ static const key_functions_s key_functions[] = {
{
15
,
"DGR"
,
KF_NONE
,
kf_reset
,
"DIG"
,
3
},
{
16
,
"MPO"
,
KF_NONE
,
kf_multi_position
,
NULL
,
3
},
{
17
,
"MPR"
,
KF_NONE
,
kf_multi_position_reset
,
NULL
,
3
},
{
18
,
"LCI"
,
KF_NOSHOW
,
kf_lap_count
,
NULL
,
0
},
{
19
,
"LCR"
,
KF_NOSHOW
,
kf_lap_count_reset
,
NULL
,
0
},
{
20
,
"BLS"
,
KF_NOSHOW
,
kf_battery_low_shutup
,
NULL
,
0
},
// default END-long
{
18
,
"T1S"
,
KF_NOSHOW
,
kf_menu_timer_start
,
(
u8
*
)
0
,
0
},
{
19
,
"T1R"
,
KF_NOSHOW
,
kf_menu_timer_reset
,
(
u8
*
)
0
,
0
},
{
20
,
"T2S"
,
KF_NOSHOW
,
kf_menu_timer_start
,
(
u8
*
)
1
,
0
},
{
21
,
"T2R"
,
KF_NOSHOW
,
kf_menu_timer_reset
,
(
u8
*
)
1
,
0
},
};
#define KEY_FUNCTIONS_SIZE (sizeof(key_functions) / sizeof(key_functions_s))
...
...
menu_timer.c
0 → 100644
View file @
925ef1c4
/*
menu - handle popup menus
Copyright (C) 2011 Pavel Semerad
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
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.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include "menu.h"
#include "lcd.h"
#include "config.h"
// menu task will be waked-up peridodically to show timer value
_Bool
menu_timer_wakeup
;
// actual timer values
u8
menu_timer_running
;
// running timers
@
near
u8
menu_timer_throttle
;
// throttle start for each timer
@
near
menu_timer_s
menu_timer
[
TIMER_NUM
];
// actual timer values
// number of laps
static
@
near
u8
timer_lap_count
[
TIMER_NUM
];
// time for each lap
#define TIMER_MAX_LAPS 100
static
@
near
menu_timer_s
timer_lap_time
[
TIMER_NUM
][
TIMER_MAX_LAPS
];
// show actual timer value
void
menu_timer_show
(
u8
tid
)
{
u8
type
=
TIMER_TYPE
(
tid
);
menu_clear_symbols
();
lcd_7seg
((
u8
)(
tid
+
1
));
switch
(
type
)
{
case
TIMER_OFF
:
lcd_chars
(
"OFF"
);
break
;
case
TIMER_UP
:
lcd_chars
(
"NDY"
);
// XXX
break
;
case
TIMER_DOWN
:
lcd_chars
(
"NDY"
);
// XXX
break
;
case
TIMER_LAP
:
lcd_chars
(
"NDY"
);
// XXX
break
;
case
TIMER_LAPCNT
:
lcd_char_num3
(
timer_lap_count
[
tid
]);
break
;
}
}
// clear timer
static
void
timer_clear
(
u8
tid
)
{
menu_timer_s
*
pt
=
&
menu_timer
[
tid
];
pt
->
sec
=
0
;
pt
->
hdr
=
0
;
menu_timer_running
&=
(
u8
)
~
(
u8
)(
1
<<
tid
);
timer_lap_count
[
tid
]
=
0
;
memset
(
&
timer_lap_time
[
tid
],
0
,
TIMER_MAX_LAPS
*
sizeof
(
menu_timer_s
));
}
// setup timer
static
u8
timer_id
;
// for setup to know which timer to operate
static
u8
timer_setup_throttle
(
u8
val_id
,
u8
action
,
u8
*
chars_blink
)
{
// change value
if
(
action
==
1
)
menu_timer_throttle
^=
(
u8
)(
1
<<
timer_id
);
// select next value
else
if
(
action
==
2
)
timer_clear
(
timer_id
);
// show value
lcd_7seg
(
L7_H
);
lcd_chars
(
menu_timer_throttle
&
(
u8
)(
1
<<
timer_id
)
?
"ON "
:
"OFF"
);
return
1
;
// only one value
}
static
u8
timer_setup_alarm
(
u8
val_id
,
u8
action
,
u8
*
chars_blink
)
{
u8
val
=
TIMER_ALARM
(
timer_id
);
// change value
if
(
action
==
1
)
{
val
=
(
u8
)
menu_change_val
(
val
,
0
,
255
,
TIMER_ALARM_FAST
,
0
);
TIMER_ALARM_SET
(
timer_id
,
val
);
}
// select next value
else
if
(
action
==
2
)
timer_clear
(
timer_id
);
// show value
lcd_7seg
(
L7_A
);
lcd_char_num3
(
val
);
return
1
;
// only one value
}
static
const
u8
timer_type_labels
[][
5
]
=
{
"OFF"
,
"UP "
,
"DWN"
,
"LPT"
,
"LPC"
};
static
u8
timer_setup_type
(
u8
val_id
,
u8
action
,
u8
*
chars_blink
)
{
u8
val
=
TIMER_TYPE
(
timer_id
);
// change value
if
(
action
==
1
)
{
val
=
(
u8
)
menu_change_val
(
val
,
0
,
TIMER_TYPE_MAX
,
1
,
1
);
TIMER_TYPE_SET
(
timer_id
,
val
);
}
// select next value
else
if
(
action
==
2
)
timer_clear
(
timer_id
);
// show value
lcd_7seg
(
L7_P
);
lcd_chars
(
timer_type_labels
[
val
]);
return
1
;
// only one value
}
static
const
menu_func_t
timer_setup_funcs
[]
=
{
timer_setup_throttle
,
timer_setup_alarm
,
timer_setup_type
,
};
void
menu_timer_setup
(
u8
tid
)
{
timer_id
=
tid
;
menu_common
(
timer_setup_funcs
,
sizeof
(
timer_setup_funcs
)
/
sizeof
(
void
*
),
0
);
config_global_save
();
}
// show timer lap times
void
menu_timer_lap_times
(
u8
tid
)
{
u8
type
=
TIMER_TYPE
(
tid
);
switch
(
type
)
{
case
TIMER_OFF
:
case
TIMER_UP
:
case
TIMER_LAPCNT
:
// no lap times
return
;
break
;
case
TIMER_DOWN
:
case
TIMER_LAP
:
// show lap times XXX
break
;
}
}
// key functions
void
kf_menu_timer_start
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
)
{
u8
tid
=
(
u8
)(
u16
)
param
;
u8
type
=
TIMER_TYPE
(
tid
);
menu_timer_s
*
pt
=
&
menu_timer
[
tid
];
switch
(
type
)
{
case
TIMER_OFF
:
return
;
break
;
case
TIMER_UP
:
// XXX
break
;
case
TIMER_DOWN
:
// XXX
break
;
case
TIMER_LAP
:
// XXX
break
;
case
TIMER_LAPCNT
:
timer_lap_count
[
tid
]
++
;
break
;
}
menu_main_screen
=
(
u8
)(
MS_TIMER1
+
tid
);
}
void
kf_menu_timer_reset
(
u8
*
id
,
u8
*
param
,
u8
flags
,
s16
*
pv
)
{
u8
tid
=
(
u8
)(
u16
)
param
;
u8
type
=
TIMER_TYPE
(
tid
);
menu_timer_s
*
pt
=
&
menu_timer
[
tid
];
switch
(
type
)
{
case
TIMER_OFF
:
return
;
break
;
case
TIMER_UP
:
// XXX
break
;
case
TIMER_DOWN
:
// XXX
break
;
case
TIMER_LAP
:
// XXX
break
;
case
TIMER_LAPCNT
:
timer_lap_count
[
tid
]
=
0
;
break
;
}
menu_main_screen
=
(
u8
)(
MS_TIMER1
+
tid
);
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment