modified: plan_manage_main/ewp/plan_manage_main.dep

modified:   plan_manage_main/ewp/settings/plan_manage_main.dbgdt
	modified:   plan_manage_main/ewp/settings/plan_manage_main.dni
	modified:   plan_manage_main/src/app/debug.c
	modified:   plan_manage_main/src/app/include/config.h
	modified:   plan_manage_main/src/app/include/debug.h
	modified:   plan_manage_main/src/app/include/input.h
	modified:   plan_manage_main/src/app/include/key.h
	modified:   plan_manage_main/src/app/include/knob.h
	modified:   plan_manage_main/src/app/include/pm_init.h
	modified:   plan_manage_main/src/app/include/simulat_timer.h
	modified:   plan_manage_main/src/app/include/tft.h
	modified:   plan_manage_main/src/app/include/time.h
	modified:   plan_manage_main/src/app/key.c
	modified:   plan_manage_main/src/app/knob.c
	modified:   plan_manage_main/src/app/main.c
	modified:   plan_manage_main/src/app/pm_init.c
	modified:   plan_manage_main/src/app/simulat_timer.c
	modified:   plan_manage_main/src/app/tft.c
	modified:   plan_manage_main/src/app/time.c
	modified:   settings/plan_manage.wsdt

完成tft基础功能
This commit is contained in:
forbelief 2016-04-17 10:30:23 +08:00
parent 91399c2e8f
commit e9d7d4dfbc
21 changed files with 1036 additions and 480 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -9,7 +9,7 @@ TriggerName=main
LimitSize=0
ByteLimit=50
[DebugChecksum]
Checksum=-1423666763
Checksum=2065568720
[CodeCoverage]
Enabled=_ 0
[Exceptions]
@ -47,7 +47,7 @@ MultiCoreRunAll=1
CStepIntDis=_ 0
TraceBufferSize=0x00010000
TraceStallIfFIFOFull=0x00000000
TracePortSize=0x00000000
TracePortSize=0x00000004
[Log file]
LoggingEnabled=_ 0
LogFile=_ ""
@ -66,7 +66,8 @@ Exclusions=
[Disassemble mode]
mode=0
[Breakpoints2]
Count=0
Bp0=_ 0 "EMUL_CODE" "{$PROJ_DIR$\..\src\app\main.c}.81.13" 0 0 1 "" 0 "" 0
Count=1
[Aliases]
Count=0
SuppressDialog=0

View file

@ -1,5 +1,5 @@
/*
* debug.c -
* debug.c -
*/
#include <stdint.h>
@ -15,7 +15,7 @@ volatile float recval_debug_uart[26];
/*
* debug_init() -
* debug_init() -
*/
void debug_init(void)
{
@ -24,11 +24,11 @@ void debug_init(void)
}
/*
* str_to_fp() -
* @str:
* @len:
* str_to_fp() -
* @str:
* @len:
*
* c语言标准浮点格式'\0'
* c语言标准浮点格式'\0'
*/
float str_to_fp(char str[], uint8_t len)
{
@ -57,7 +57,7 @@ float str_to_fp(char str[], uint8_t len)
}
/*
* rec_debug_uart() - uart传入的调试信息
* rec_debug_uart() - uart传入的调试信息
*
*/
void rec_debug_uart(void)
@ -190,11 +190,11 @@ void rec_debug_uart(void)
index = 0;
if (ch == '#')
{
printf("清除缓存成功\n");
printf("清除缓存成功\n");
}
else
{
printf("设置%c为%s\n", ch, str_log);
printf("设置%c为%s\n", ch, str_log);
}
}
return;

View file

@ -1,5 +1,5 @@
/*
* config.h -
* config.h -
*
*/
@ -10,20 +10,20 @@
/*
* 使
* 使
*/
#define SIMULAT_TIMER_PITX PIT1
/*
*
*
*/
#define DEBUG_UARTX UART1
/*
*
*
*/
#define UP_KEY_PINX PTE20
#define DOWN_KEY_PINX PTA17
@ -35,16 +35,16 @@
#define MB_KEY_PINX PTA16
#define MUVB_KEY_PINX PTD6
#define KNOB_A_PINX PTD3
#define KNOB_B_PINX PTD4
#define KNOB_KEY_PINX PTD5
#define KNOB_A_PINX PTD6
#define KNOB_B_PINX PTD7
#define KNOB_KEY_PINX PTD4 // PTD5
/*
*
*
*/
#define TFT_UARTX UART2
#define TFT_UARTX UART2 // PTD2,PTD3

View file

@ -1,5 +1,5 @@
/*
* debug.h -
* debug.h -
*/
#ifndef DEBUG_H
@ -23,21 +23,21 @@ extern volatile float recval_debug_uart[26];
/*
* debug_init() -
* debug_init() -
*/
void debug_init(void);
/*
* str_to_fp() -
* @str:
* @len:
* str_to_fp() -
* @str:
* @len:
*
* c语言标准浮点格式'\0'
* c语言标准浮点格式'\0'
*/
float str_to_fp(char str[], uint8_t len);
/*
* rec_debug_uart() - uart传入的调试信息
* rec_debug_uart() - uart传入的调试信息
*
*/
void rec_debug_uart(void);

View file

@ -1,6 +1,6 @@
/*
* input.h
*
* input.h
*
*/
#ifndef INPUT_H

View file

@ -1,6 +1,6 @@
/* key.h - 监测并采集按键的输入
*
* 使10ms采集一次io状态来实现的
/* key.h - 监测并采集按键的输入
*
* 使10ms采集一次io状态来实现的
*/
#ifndef KEY_H
@ -15,7 +15,7 @@ typedef enum key_mean_
/*
* key_type -
* key_type -
*/
typedef enum key_type_
{
@ -25,31 +25,32 @@ typedef enum key_type_
/*
* key_init() -
* key_init() -
*
*/
void key_init(void);
/*
* key_detect() -
* key_detect() -
*
* 10ms调用一次
* 10ms调用一次
*/
void key_detect(void);
/*
* get_key_mean() -
* get_key_mean() -
*
* N_KEY
* N_KEY
*/
key_mean get_key_mean(key_type key_t);
void clear_key_m(void);

View file

@ -1,7 +1,7 @@
/*
* knob.h -
* knob.h -
*
* 使
* 使
*/
#ifndef KNOB_H
@ -14,41 +14,41 @@
/*
* knob_init() -
* knob_init() -
*
*
*
*/
void knob_init(void);
/*
* knob_enable() - 使
* knob_enable() - 使
*/
void knob_enable(void);
/*
* knob_disable() -
* knob_disable() -
*/
void knob_disable(void);
/*
* knob_clear() -
* knob_clear() -
*/
void knob_clear(void);
/*
* get_knob_val() -
* get_knob_val() -
*/
int32_t get_knob_val(void);
/*
* knob_detect() -
* knob_detect() -
*
* A相输出发生沿跳变时调用沿
* A相输出发生沿跳变时调用沿
*/
void knob_detect(void);

View file

@ -1,9 +1,9 @@
/*
* pm_init.h -
* pm_init.h -
*/
/*
* pm_init() -
* pm_init() -
*/
void pm_init(void);

View file

@ -1,5 +1,5 @@
/*
* simulat_timer.h -
* simulat_timer.h -
*/
#ifndef SIMULAT_TIMER_H
@ -8,7 +8,7 @@
#include <stdint.h>
/*
*
*
*/
#define SIMULAT_TIMER_NUM 3
@ -16,14 +16,14 @@
typedef struct st_register_
{
uint8_t count; // 定时器计数
uint32_t cmr; // 比较寄存器
uint8_t count; // 定时器计数
uint32_t cmr; // 比较寄存器
struct
{
uint8_t ten : 1; // 使能标志
uint8_t tov : 1; // 溢出标志
uint8_t tfc : 1; // 自由运行标志
uint8_t tcf : 1; // 比较标志
uint8_t ten : 1; // 使能标志
uint8_t tov : 1; // 溢出标志
uint8_t tfc : 1; // 自由运行标志
uint8_t tcf : 1; // 比较标志
} flag;
} st_register;
@ -35,55 +35,55 @@ typedef enum st_mode_
} st_mode;
/*
* st_init() - pit定时器
* st_init() - pit定时器
*
* 1ms
* 1ms
*/
void st_base_init(void);
/*
* st_init() -
* @n:
* @st_m:
* @cmr_v:
* st_init() -
* @n:
* @st_m:
* @cmr_v:
*
* 0~0
* 0~0
*/
uint8_t st_init(uint8_t n, st_mode st_m, uint32_t cmr_v);
/*
* st_close() -
* @n:
* st_close() -
* @n:
*/
void st_close(uint8_t n);
/*
* st_tcf() - tcf位返回
* @n:
* st_tcf() - tcf位返回
* @n:
*
* 01
* 01
*/
uint8_t st_tcf(uint8_t n);
/*
* st_tov() - tov位返回
* @n:
* st_tov() - tov位返回
* @n:
*
* 01
* 01
*/
uint8_t st_tov(uint8_t n);
/*
* st_count() -
* @n:
* st_count() -
* @n:
*
*
*
*/
uint32_t st_count(uint8_t n);
@ -92,9 +92,9 @@ uint32_t st_count(uint8_t n);
/********************ISR******************/
/*
* st_base() -N路定时器
* st_base() -N路定时器
*
*
*
*/
void st_base(void);

View file

@ -1,5 +1,5 @@
/*
* tft.h - tft接口
* tft.h - tft½Ó¿Ú
*/
@ -7,8 +7,20 @@
#define TFT_H
typedef struct input_limit_
{
int16_t max;
int16_t min;
} input_limit;
void tft_init(void);
void tft_send_cmd(const char *cmd);
void tft_left(void);
void tft_right(void);
void tft_up(void);
void tft_down(void);
@ -18,6 +30,10 @@ void tft_ok(void);
void tft_ret(void);
int16_t get_value_of_kvp(char *name);
input_limit tft_input_limit(char *name);

View file

@ -0,0 +1,11 @@
/*
* time.h -
*/
#include <stdint.h>
uint8_t is_leapyear(uint16_t year);
uint8_t get_month_days(uint16_t year, uint8_t month);

View file

@ -1,17 +1,17 @@
/*
* key.c -
* key.c -
*
*
* 10ms需要采集一次io状态
* :
*
* 10ms需要采集一次io状态
* :
*
* key_type枚举类型中对应的枚举元素
* key_type枚举类型中对应的枚举元素
*
* key_infomation变量
* key_infomation变量
*
* key_init()
* key_detect()
* get_key_mean()
* key_init()
* key_detect()
* get_key_mean()
*/
@ -24,11 +24,11 @@
/*
* key_state -
* key_state_0
* key_state_1
* key_state_2
* key_state_3
* key_state -
* key_state_0
* key_state_1
* key_state_2
* key_state_3
*/
typedef enum key_state_
{
@ -36,7 +36,7 @@ typedef enum key_state_
} key_state;
/*
* IO状态符号定义
* IO状态符号定义
*/
typedef enum state_sign_
{
@ -101,7 +101,7 @@ static volatile key_infomation
/*
* key_init() -
* key_init() -
*
*/
void key_init(void)
@ -118,7 +118,7 @@ void key_init(void)
/*
* 10ms定时中断
* 10ms定时中断
*/
@ -127,32 +127,32 @@ void key_init(void)
/*
* key_read_base -
* @key_info: ,
* key_read_base -
* @key_info: ,
*
* N_KEY,S_KEY,L_KEY三种情况
* N_KEY,S_KEY,L_KEY三种情况
*/
key_mean key_read_base(volatile key_infomation *key_info)
{
state_sign key_state_io;
key_mean key_m = N_KEY;
key_state_io = (*((*key_info).get_state_io))(); // 获取io状态
key_state_io = (*((*key_info).get_state_io))(); // 获取io状态
switch((*key_info).state_base)
{
case key_state_0:
if (key_state_io == VALID)
{
(*key_info).state_base = key_state_1; // 按键按下后首先进入消抖和按键确
// 认状态
(*key_info).state_base = key_state_1; // 按键按下后首先进入消抖和按键确
// 认状态
}
break;
case key_state_1:
if (key_state_io == VALID)
{
(*key_info).time_base = 0;
(*key_info).state_base = key_state_2; // 按键如果仍然按下,则消抖完成,
// 状态转换,此时返回无按键事件
(*key_info).state_base = key_state_2; // 按键如果仍然按下,则消抖完成,
// 状态转换,此时返回无按键事件
}
else
{
@ -162,20 +162,20 @@ key_mean key_read_base(volatile key_infomation *key_info)
case key_state_2:
if (key_state_io == INVALID)
{
key_m = S_KEY; // 此时按键释放说明为一次短操作
key_m = S_KEY; // 此时按键释放说明为一次短操作
(*key_info).state_base = key_state_0;
}
else if (++(*key_info).time_base > 100) // 继续按下计时加10ms即本函
// 数调用周期
else if (++(*key_info).time_base > 100) // 继续按下计时加10ms即本函
// 数调用周期
{
key_m = L_KEY; // 按下时间大于1s返回 长按键
(*key_info).state_base = key_state_3; // 转换为等待按键释放状态
key_m = L_KEY; // 按下时间大于1s返回 长按键
(*key_info).state_base = key_state_3; // 转换为等待按键释放状态
}
break;
case key_state_3:
if (key_state_io == INVALID)
{
(*key_info).state_base = key_state_0; // 按键此时已释放,转换为初始状态
(*key_info).state_base = key_state_0; // 按键此时已释放,转换为初始状态
}
break;
default:
@ -185,10 +185,10 @@ key_mean key_read_base(volatile key_infomation *key_info)
}
/*
* key_read -
* @key_info:
* key_read -
* @key_info:
*
* N_KEY,S_KEY,D_KEYL_KEY四情况
* N_KEY,S_KEY,D_KEYL_KEY四情况
*/
key_mean key_read(volatile key_infomation *key_info)
{
@ -201,17 +201,17 @@ key_mean key_read(volatile key_infomation *key_info)
case key_state_0:
if (key_m_temp == S_KEY)
{
(*key_info).time = 0; // 第一次单击状态,仍然返回无键,到下个周期
// 判断是否出现双击
(*key_info).time = 0; // 第一次单击状态,仍然返回无键,到下个周期
// 判断是否出现双击
(*key_info).state = key_state_1;
}
else
{
key_m = key_m_temp; // 对于非单击,返回原事件
key_m = key_m_temp; // 对于非单击,返回原事件
}
break;
case key_state_1:
if (key_m_temp == S_KEY) // 又一次单击,间隔 < 300ms
if (key_m_temp == S_KEY) // 又一次单击,间隔 < 300ms
{
key_m = D_KEY;
(*key_info).state = key_state_0;
@ -220,8 +220,8 @@ key_mean key_read(volatile key_infomation *key_info)
{
if (++(*key_info).time > 30)
{
key_m = S_KEY; // 300ms内没有再出现单击事件则返回上一次单
// 击事件
key_m = S_KEY; // 300ms内没有再出现单击事件则返回上一次单
// 击事件
(*key_info).state = key_state_0;
}
}
@ -234,11 +234,11 @@ key_mean key_read(volatile key_infomation *key_info)
/*
* key_detect() -
* key_detect() -
*
* N_KEY状态时记录按键信息N_KEY是在应用程序获取按键信息的时候同时被设
*
* 10ms调用一次
* N_KEY状态时记录按键信息N_KEY是在应用程序获取按键信息的时候同时被设
*
* 10ms调用一次
*/
void key_detect(void)
{
@ -285,9 +285,9 @@ void key_detect(void)
/*
* get_key_mean() -
* get_key_mean() -
*
* N_KEY
* N_KEY
*/
key_mean get_key_mean(key_type key_t)
{
@ -336,3 +336,17 @@ key_mean get_key_mean(key_type key_t)
}
return key_m;
}
void clear_key_m(void)
{
down_key_info.key_m = N_KEY;
up_key_info.key_m = N_KEY;
ok_key_info.key_m = N_KEY;
ret_key_info.key_m = N_KEY;
ams_key_info.key_m = N_KEY;
wifi_key_info.key_m = N_KEY;
mr_key_info.key_m = N_KEY;
mb_key_info.key_m = N_KEY;
muvb_key_info.key_m = N_KEY;
}

View file

@ -1,7 +1,7 @@
/*
* knob.c -
* knob.c -
*
* 使
* 使
*/
#include <stdint.h>
@ -20,9 +20,9 @@ static volatile int32_t knob_val;
/*
* knob_init() -
* knob_init() -
*
*
*
*/
void knob_init(void)
{
@ -35,7 +35,7 @@ void knob_init(void)
/*
* knob_enable() - 使
* knob_enable() - 使
*/
void knob_enable(void)
{
@ -44,7 +44,7 @@ void knob_enable(void)
}
/*
* knob_disable() -
* knob_disable() -
*/
void knob_disable(void)
{
@ -55,7 +55,7 @@ void knob_disable(void)
/*
* knob_clear() -
* knob_clear() -
*/
void knob_clear(void)
{
@ -64,7 +64,7 @@ void knob_clear(void)
}
/*
* get_knob_val() -
* get_knob_val() -
*/
int32_t get_knob_val(void)
{
@ -73,9 +73,9 @@ int32_t get_knob_val(void)
/*
* knob_detect() -
* knob_detect() -
*
* A相输出发生沿跳变时调用沿
* A相输出发生沿跳变时调用沿
*/
void knob_detect(void)
{
@ -87,7 +87,7 @@ void knob_detect(void)
{
knob_val++;
}
else // 即if ((knob_A == 0 && knob_B == 0) || (knob_A == 1 && knob_B == 1))
else // 即if ((knob_A == 0 && knob_B == 0) || (knob_A == 1 && knob_B == 1))
{
knob_val--;
}

View file

@ -6,6 +6,7 @@
#include "include/simulat_timer.h"
#include "include/key.h"
#include "include/knob.h"
#include "include/tft.h"
void main(void)
@ -21,10 +22,7 @@ void main(void)
while (1)
{
if (st_tcf(0) == 1)
{
key_detect();
}
if (st_tcf(1) == 1)
{
if (log != (knob_v = get_knob_val()))
@ -34,6 +32,45 @@ void main(void)
}
}
switch (get_key_mean(UP_KEY))
{
case N_KEY:
//printf("轟숩\n");
break;
case S_KEY:
printf("데샌\n");
tft_left();
break;
case D_KEY:
printf("崗샌\n");
tft_up();
break;
case L_KEY:
printf("낀객\n");
break;
default:
break;
}
switch (get_key_mean(DOWN_KEY))
{
case N_KEY:
//printf("轟숩\n");
break;
case S_KEY:
printf("데샌\n");
tft_right();
break;
case D_KEY:
printf("崗샌\n");
tft_down();
break;
case L_KEY:
printf("낀객\n");
break;
default:
break;
}
switch (get_key_mean(OK_KEY))
{
case N_KEY:
@ -41,6 +78,25 @@ void main(void)
break;
case S_KEY:
printf("µ¥»÷\n");
tft_ok();
break;
case D_KEY:
printf("崗샌\n");
break;
case L_KEY:
printf("낀객\n");
break;
default:
break;
}
switch (get_key_mean(RET_KEY))
{
case N_KEY:
//printf("轟숩\n");
break;
case S_KEY:
printf("데샌\n");
tft_ret();
break;
case D_KEY:
printf("Ë«»÷\n");

View file

@ -1,15 +1,16 @@
/*
* pm_init.c -
* pm_init.c -
*/
#include "include/simulat_timer.h"
#include "include/key.h"
#include "include/knob.h"
#include "include/debug.h"
#include "include/tft.h"
/*
* pm_init() -
* pm_init() -
*/
void pm_init(void)
{
@ -17,4 +18,6 @@ void pm_init(void)
key_init();
knob_init();
st_base_init();
tft_init();
return;
}

View file

@ -1,38 +1,39 @@
/*
* simulat_timer.h -
* simulat_timer.h -
*/
#include "include.h"
#include "include/simulat_timer.h"
#include "include/config.h"
#include "include/key.h"
static volatile st_register st_r[SIMULAT_TIMER_NUM];
/*
* st_init() - pit定时器
* st_init() - pit定时器
*
* 1ms
* 1ms
*/
void st_base_init(void)
{
uint32_t cnt;
cnt = bus_clk_khz * 1;
pit_init(SIMULAT_TIMER_PITX, cnt); // 1ms硬件定时中断周期
pit_init(SIMULAT_TIMER_PITX, cnt); // 1ms硬件定时中断周期
return;
}
/*
* st_init() -
* @n:
* @st_m:
* @cmr_v:
* st_init() -
* @n:
* @st_m:
* @cmr_v:
*
* 0~0
* 0~0
*/
uint8_t st_init(uint8_t n, st_mode st_m, uint32_t cmr_v)
{
@ -58,8 +59,8 @@ uint8_t st_init(uint8_t n, st_mode st_m, uint32_t cmr_v)
/*
* st_close() -
* @n:
* st_close() -
* @n:
*/
void st_close(uint8_t n)
{
@ -68,10 +69,10 @@ void st_close(uint8_t n)
}
/*
* st_tcf() - tcf位返回
* @n:
* st_tcf() - tcf位返回
* @n:
*
* 01
* 01
*/
uint8_t st_tcf(uint8_t n)
{
@ -90,10 +91,10 @@ uint8_t st_tcf(uint8_t n)
}
/*
* st_tov() - tov位返回
* @n:
* st_tov() - tov位返回
* @n:
*
* 01
* 01
*/
uint8_t st_tov(uint8_t n)
{
@ -111,10 +112,10 @@ uint8_t st_tov(uint8_t n)
}
/*
* st_count() -
* @n:
* st_count() -
* @n:
*
*
*
*/
uint32_t st_count(uint8_t n)
{
@ -123,9 +124,9 @@ uint32_t st_count(uint8_t n)
/*
* st_base() -N路定时器
* st_base() -N路定时器
*
*
*
*/
void st_base(void)
{
@ -133,21 +134,27 @@ void st_base(void)
for (i = 0; i < SIMULAT_TIMER_NUM; i++)
{
if (st_r[i].flag.ten == 1) // 使能
if (st_r[i].flag.ten == 1) // 使能
{
if (++st_r[i].count == 0) // 溢出
if (++st_r[i].count == 0) // 溢出
{
st_r[i].flag.tov = 1;
} // 溢出
if (st_r[i].flag.tfc == 1) // 比较
} // 溢出
if (st_r[i].flag.tfc == 1) // 比较
{
if (st_r[i].count == st_r[i].cmr)
{
st_r[i].count = 0;
st_r[i].flag.tcf = 1;
}
} // 比较
} // 使能
} // 比较
} // 使能
}
if (st_tcf(0) == 1)
{
key_detect();
}
return;
}

View file

@ -1,7 +1,7 @@
/*
* tft.c - tft
* tft.c - tft ÏÔʾÆÁµÄ½Ó¿Ú
*
* uart hmi方式
* uart hmi·½Ê½
*/
#include <stdint.h>
@ -14,6 +14,7 @@
#include "include/knob.h"
#include "include/key.h"
#include "include/config.h"
#include "include/time.h"
typedef struct kv_pair_
@ -41,47 +42,96 @@ typedef enum entry_attr_
R_NUM = 0, RW_NUM, RW_PIC, SW_PAGE
} entry_attr;
typedef enum tft_colour_
{
TFT_BACK = 65535, TFT_RED = 63488, TFT_PURPLE = 31
} tft_colour;
static tft_state tft_stt = { 0, 0, 0, 0 };
static uint8_t original_lyt[] = { 0, 1 };
static uint8_t menu_lyt[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11 };
static uint8_t obj_set_lyt[] = { 0, 4, 8, 12, 13, 16, 18, 19 };
static uint8_t menu_lyt[] = { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
static uint8_t obj_set_lyt[] = { 0, 4, 7, 11, 13};
kv_pair kvp_menu[] = {
{ "st_y", 2016, RW_NUM }, { "st_mo", 4, RW_NUM }, { "st_d", 14, RW_NUM }, { "st_mi", 0, RW_NUM },
{ "p1", 0, RW_PIC },
{ "p2", 0, RW_PIC },
{ "p3", 0, RW_PIC },
{ "p4", 0, RW_PIC },
{ "p5", 0, RW_PIC },
{ "st_y", 2016, RW_NUM }, { "st_mo", 4, RW_NUM }, { "st_d", 14, RW_NUM }, { "st_h", 0, RW_NUM }, { "st_mi", 0, RW_NUM },
{ "obj0", 0, SW_PAGE },
{ "obj1", 0, SW_PAGE },
{ "obj2", 0, SW_PAGE },
{ "obj3", 0, SW_PAGE },
{ "obj4", 0, SW_PAGE },
{ "obj5", 0, SW_PAGE },
{ "obj6", 0, SW_PAGE },
{ "obj7", 0, SW_PAGE },
{ "note", 0, RW_NUM }
};
kv_pair kvp_obj_set[][19] =
{
{
{ "st_y", 2016, RW_NUM }, { "st_mo", 4, RW_NUM }, { "st_d", 14, RW_NUM }, { "st_mi", 0, RW_NUM },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_mi", 0, RW_NUM },
{ "ed_y", 2016, RW_NUM }, { "ed_mo", 4, RW_NUM }, { "ed_d", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "pd", 3, RW_NUM },
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC },
{ "lg_cnt", 0, RW_NUM }, { "wt_cnt", 0, RW_NUM },
{ "note", 0, RW_NUM }
},
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM },
{ "bg_h", 14, RW_NUM }, { "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 0
{
{ "st_y", 2016, RW_NUM }, { "st_mo", 4, RW_NUM }, { "st_d", 14, RW_NUM }, { "st_mi", 0, RW_NUM },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_mi", 0, RW_NUM },
{ "ed_y", 2016, RW_NUM }, { "ed_mo", 4, RW_NUM }, { "ed_d", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "pd", 3, RW_NUM },
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC },
{ "lg_cnt", 0, RW_NUM }, { "wt_cnt", 0, RW_NUM },
{ "note", 0, RW_NUM }
}
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM },
{ "bg_h", 14, RW_NUM }, { "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 1
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM },
{ "bg_h", 14, RW_NUM }, { "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 2
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_h", 14, RW_NUM },
{ "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 3
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_h", 14, RW_NUM },
{ "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 4
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_h", 14, RW_NUM },
{ "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 5
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_h", 14, RW_NUM },
{ "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 6
{
{ "lg_r", 0, RW_PIC}, { "lg_b", 0, RW_PIC }, { "lg_uvb", 0, RW_PIC }, { "water", 0, RW_PIC },
{ "bg_y", 2016, RW_NUM }, { "bg_mo", 4, RW_NUM }, { "bg_d", 14, RW_NUM }, { "bg_h", 14, RW_NUM },
{ "bg_mi", 0, RW_NUM },
{ "ed_h", 14, RW_NUM }, { "ed_mi", 0, RW_NUM },
{ "lg_pd", 3, RW_NUM }, { "lg_cnt", 0, RW_NUM },
}, // 7
};
static char tft_cmd_str[10];
static char tft_cmd_str[20];
/*
*
@ -89,6 +139,7 @@ static char tft_cmd_str[10];
void tft_init(void)
{
uart_init(TFT_UARTX, 9600);
tft_send_cmd("page original");
return;
}
@ -104,11 +155,67 @@ void tft_send_cmd(const char *cmd)
uart_putchar(TFT_UARTX, 0xff);
}
void tft_set_color(uint8_t etn, tft_colour tft_col)
{
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
break;
case MENU_PG:
switch (kvp_menu[etn].attr)
{
case R_NUM:
case RW_NUM:
sprintf(tft_cmd_str, "%s.bco=%d", kvp_menu[etn].key, tft_col);
tft_send_cmd(tft_cmd_str);
sprintf(tft_cmd_str, "ref %s", kvp_menu[etn].key);
tft_send_cmd(tft_cmd_str);
break;
case RW_PIC:
case SW_PAGE:
sprintf(tft_cmd_str, "%s_sg.bco=%d", kvp_menu[etn].key, tft_col);
tft_send_cmd(tft_cmd_str);
sprintf(tft_cmd_str, "ref %s_sg", kvp_menu[etn].key);
tft_send_cmd(tft_cmd_str);
break;
default:
break;
}
break;
case OBJ_SET_PG:
switch (kvp_obj_set[tft_stt.objn][etn].attr)
{
case R_NUM:
case RW_NUM:
sprintf(tft_cmd_str, "%s.bco=%d", kvp_obj_set[tft_stt.objn][etn].key, tft_col);
tft_send_cmd(tft_cmd_str);
sprintf(tft_cmd_str, "ref %s", kvp_obj_set[tft_stt.objn][etn].key);
tft_send_cmd(tft_cmd_str);
break;
case RW_PIC:
case SW_PAGE:
sprintf(tft_cmd_str, "%s_sg.bco=%d", kvp_obj_set[tft_stt.objn][etn].key, tft_col);
tft_send_cmd(tft_cmd_str);
sprintf(tft_cmd_str, "ref %s_sg", kvp_obj_set[tft_stt.objn][etn].key);
tft_send_cmd(tft_cmd_str);
break;
default:
break;
}
break;
default:
break;
}
return;
}
/*
*
*/
void tft_up(void)
{
uint8_t etn_log = tft_stt.etn;
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
@ -124,6 +231,19 @@ void tft_up(void)
tft_stt.ln--;
}
tft_stt.etn = menu_lyt[tft_stt.ln];
switch (kvp_menu[tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
case OBJ_SET_PG:
if (tft_stt.ln > 0)
@ -131,6 +251,20 @@ void tft_up(void)
tft_stt.ln--;
}
tft_stt.etn = obj_set_lyt[tft_stt.ln];
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
default:
break;
@ -140,36 +274,67 @@ void tft_up(void)
void tft_down(void)
{
uint8_t etn_log = tft_stt.etn;
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
if (tft_stt.ln < sizeof(original_lyt) / sizeof(uint8_t) - 1)
if (tft_stt.ln < sizeof(original_lyt) / sizeof(uint8_t) - 2)
{
tft_stt.ln++;
}
tft_stt.etn = original_lyt[tft_stt.ln];
break;
case MENU_PG:
if (tft_stt.ln < sizeof(menu_lyt) / sizeof(uint8_t) - 1)
if (tft_stt.ln < sizeof(menu_lyt) / sizeof(uint8_t) - 2)
{
tft_stt.ln++;
}
tft_stt.etn = menu_lyt[tft_stt.ln];
switch (kvp_menu[tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
case OBJ_SET_PG:
if (tft_stt.ln < sizeof(obj_set_lyt) / sizeof(uint8_t) - 1)
if (tft_stt.ln < sizeof(obj_set_lyt) / sizeof(uint8_t) - 2)
{
tft_stt.ln++;
}
tft_stt.etn = obj_set_lyt[tft_stt.ln];
break;
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
default:
break;
}
return;
}
void tft_left(void)
{
uint8_t etn_log = tft_stt.etn;
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
@ -189,6 +354,18 @@ void tft_left(void)
tft_stt.ln--;
}
}
switch (kvp_menu[tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
case OBJ_SET_PG:
if (tft_stt.etn > 0)
@ -198,6 +375,18 @@ void tft_left(void)
tft_stt.ln--;
}
}
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
default:
break;
@ -207,6 +396,8 @@ void tft_left(void)
void tft_right(void)
{
uint8_t etn_log = tft_stt.etn;
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
@ -226,6 +417,19 @@ void tft_right(void)
tft_stt.ln++;
}
}
switch (kvp_menu[tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
case OBJ_SET_PG:
if (tft_stt.etn < obj_set_lyt[sizeof(obj_set_lyt) / sizeof(uint8_t) - 1] - 1)
@ -235,6 +439,19 @@ void tft_right(void)
tft_stt.ln++;
}
}
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
case RW_NUM:
case RW_PIC:
case SW_PAGE:
tft_set_color(etn_log, TFT_BACK);
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
default:
break;
@ -249,13 +466,13 @@ void refrush_obj(void)
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
sprintf(tft_cmd_str,"%s.txt=\"%d\"",
sprintf(tft_cmd_str,"%s.val=%d",
kvp_obj_set[tft_stt.objn][tft_stt.etn].key,
kvp_obj_set[tft_stt.objn][tft_stt.etn].value);
tft_send_cmd(tft_cmd_str);
break;
case RW_NUM:
sprintf(tft_cmd_str,"%s.txt=\"%d\"",
sprintf(tft_cmd_str,"%s.val=%d",
kvp_obj_set[tft_stt.objn][tft_stt.etn].key,
kvp_obj_set[tft_stt.objn][tft_stt.etn].value);
tft_send_cmd(tft_cmd_str);
@ -295,6 +512,7 @@ void tft_ret(void)
tft_stt.ln = 0;
tft_stt.etn = 0;
tft_send_cmd("page original");
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
case OBJ_SET_PG:
tft_stt.pgn = MENU_PG;
@ -302,6 +520,7 @@ void tft_ret(void)
tft_stt.etn = 0;
tft_send_cmd("page menu");
refrush_menu();
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
@ -310,28 +529,13 @@ void tft_ret(void)
}
void tft_ok(void)
void tft_input(void)
{
input_limit in_lmt;
int16_t in_v, bg_v;
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
break;
case RW_NUM:
break;
case RW_PIC:
break;
case SW_PAGE:
tft_stt.pgn = MENU_PG;
tft_stt.ln = 0;
tft_stt.etn = 0;
tft_send_cmd("page menu");
break;
default:
break;
}
break;
case MENU_PG:
switch (kvp_menu[tft_stt.etn].attr)
@ -339,17 +543,40 @@ void tft_ok(void)
case R_NUM:
break;
case RW_NUM:
tft_set_color(tft_stt.etn, TFT_RED);
in_lmt = tft_input_limit(kvp_menu[tft_stt.etn].key);
bg_v = kvp_menu[tft_stt.etn].value;
knob_enable();
while (get_key_mean(RET_KEY) == N_KEY)
{
kvp_menu[tft_stt.etn].value += get_knob_val();
sprintf(tft_cmd_str, "%s.txt=\"%d\"", kvp_menu[tft_stt.etn].key,
in_v = bg_v + get_knob_val();
if (in_v < in_lmt.min)
{
kvp_menu[tft_stt.etn].value = in_lmt.min;
bg_v = in_lmt.min;
knob_clear();
}
else if (in_v > in_lmt.max)
{
kvp_menu[tft_stt.etn].value = in_lmt.max;
bg_v = in_lmt.max;
knob_clear();
}
else
{
kvp_menu[tft_stt.etn].value = in_v;
}
sprintf(tft_cmd_str, "%s.val=%d", kvp_menu[tft_stt.etn].key,
kvp_menu[tft_stt.etn].value);
tft_send_cmd(tft_cmd_str);
}
knob_disable();
tft_set_color(tft_stt.etn, TFT_PURPLE);
clear_key_m();
break;
case RW_PIC:
tft_set_color(tft_stt.etn, TFT_RED);
while (get_key_mean(RET_KEY) == N_KEY)
{
if (get_key_mean(UP_KEY) == S_KEY || get_key_mean(DOWN_KEY) == S_KEY)
@ -360,36 +587,55 @@ void tft_ok(void)
tft_send_cmd(tft_cmd_str);
}
}
tft_set_color(tft_stt.etn, TFT_PURPLE);
clear_key_m();
break;
case SW_PAGE:
tft_stt.pgn = OBJ_SET_PG;
tft_stt.objn = kvp_menu[tft_stt.etn].value;
tft_stt.ln = 0;
tft_stt.etn = 0;
tft_send_cmd("page obj_set");
refrush_obj();
break;
default:
break;
}
break;
case OBJ_SET_PG:
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
break;
case RW_NUM:
tft_set_color(tft_stt.etn, TFT_RED);
in_lmt = tft_input_limit(kvp_obj_set[tft_stt.objn][tft_stt.etn].key);
bg_v = kvp_obj_set[tft_stt.objn][tft_stt.etn].value;
knob_enable();
while (get_key_mean(RET_KEY) == N_KEY)
{
kvp_obj_set[tft_stt.objn][tft_stt.etn].value += get_knob_val();
sprintf(tft_cmd_str,"%s.txt=\"%d\"",
kvp_obj_set[tft_stt.objn][tft_stt.etn].key,
in_v = bg_v + get_knob_val();
if (in_v < in_lmt.min)
{
kvp_obj_set[tft_stt.objn][tft_stt.etn].value = in_lmt.min;
bg_v = in_lmt.min;
knob_clear();
}
else if (in_v > in_lmt.max)
{
kvp_obj_set[tft_stt.objn][tft_stt.etn].value = in_lmt.max;
bg_v = in_lmt.max;
knob_clear();
}
else
{
kvp_obj_set[tft_stt.objn][tft_stt.etn].value = in_v;
}
sprintf(tft_cmd_str, "%s.val=%d", kvp_obj_set[tft_stt.objn][tft_stt.etn].key,
kvp_obj_set[tft_stt.objn][tft_stt.etn].value);
tft_send_cmd(tft_cmd_str);
}
knob_disable();
tft_set_color(tft_stt.etn, TFT_PURPLE);
clear_key_m();
break;
case RW_PIC:
tft_set_color(tft_stt.etn, TFT_RED);
while (get_key_mean(RET_KEY) == N_KEY)
{
if (get_key_mean(UP_KEY) == S_KEY || get_key_mean(DOWN_KEY))
@ -402,6 +648,79 @@ void tft_ok(void)
tft_send_cmd(tft_cmd_str);
}
}
tft_set_color(tft_stt.etn, TFT_PURPLE);
clear_key_m();
break;
case SW_PAGE:
break;
default:
break;
}
break;
default:
break;
}
}
void tft_ok(void)
{
switch (tft_stt.pgn)
{
case ORIGINAL_PG:
switch (SW_PAGE)
{
case R_NUM:
break;
case RW_NUM:
break;
case RW_PIC:
break;
case SW_PAGE:
tft_stt.pgn = MENU_PG;
tft_stt.ln = 0;
tft_stt.etn = 0;
tft_send_cmd("page menu");
tft_set_color(tft_stt.etn, TFT_PURPLE);
break;
default:
break;
}
break;
case MENU_PG:
switch (kvp_menu[tft_stt.etn].attr)
{
case R_NUM:
break;
case RW_NUM:
tft_input();
break;
case RW_PIC:
tft_input();
break;
case SW_PAGE:
tft_stt.pgn = OBJ_SET_PG;
tft_stt.objn = kvp_menu[tft_stt.etn].value;
tft_stt.ln = 0;
tft_stt.etn = 0;
tft_send_cmd("page obj_set");
tft_set_color(tft_stt.etn, TFT_PURPLE);
//refrush_obj();
break;
default:
break;
}
break;
case OBJ_SET_PG:
switch (kvp_obj_set[tft_stt.objn][tft_stt.etn].attr)
{
case R_NUM:
break;
case RW_NUM:
tft_input();
break;
case RW_PIC:
tft_input();
break;
case SW_PAGE:
break;
@ -415,3 +734,100 @@ void tft_ok(void)
return;
}
int16_t get_value_of_kvp(char *name)
{
for (int i = 0; i < sizeof(kvp_menu) / sizeof(kv_pair); i++)
{
if (strcmp(name, kvp_menu[i].key) == 0)
{
return kvp_menu[i].value;
}
}
for (int i = 0; i < sizeof(kvp_obj_set[0]) / sizeof(kv_pair); i++)
{
if (strcmp(name, kvp_obj_set[0][i].key) == 0);
{
return kvp_obj_set[0][i].value;
}
}
return ~0;
}
input_limit tft_input_limit(char *name)
{
input_limit in_lmt;
if (strcmp(name, "st_y") == 0)
{
in_lmt.min = 1970;
in_lmt.max = 2100;
}
else if (strcmp(name, "st_mo") == 0)
{
in_lmt.min = 1;
in_lmt.max = 12;
}
else if (strcmp(name, "st_d") == 0)
{
in_lmt.min = 1;
in_lmt.max = get_month_days(get_value_of_kvp("st_y"), get_value_of_kvp("st_mo"));
}
else if (strcmp(name, "st_h") == 0)
{
in_lmt.min = 0;
in_lmt.max = 23;
}
else if (strcmp(name, "st_mi") == 0)
{
in_lmt.min = 0;
in_lmt.max = 59;
}
else if (strcmp(name, "bg_y") == 0)
{
in_lmt.min = 1970;
in_lmt.max = 2100;
}
else if (strcmp(name, "bg_mo") == 0)
{
in_lmt.min = 1;
in_lmt.max = 12;
}
else if (strcmp(name, "bg_d") == 0)
{
in_lmt.min = 1;
in_lmt.max = get_month_days(get_value_of_kvp("bg_y"), get_value_of_kvp("bg_mo"));
}
else if (strcmp(name, "bg_h") == 0)
{
in_lmt.min = 0;
in_lmt.max = 23;
}
else if (strcmp(name, "bg_mi") == 0)
{
in_lmt.min = 0;
in_lmt.max = 59;
}
else if (strcmp(name, "bg_mi") == 0)
{
in_lmt.min = 0;
in_lmt.max = 59;
}
else if (strcmp(name, "ed_h") == 0)
{
in_lmt.min = 0;
in_lmt.max = 23;
}
else if (strcmp(name, "ed_mi") == 0)
{
in_lmt.min = 0;
in_lmt.max = 59;
}
else
{
in_lmt.min = 0;
in_lmt.max = 0;
}
return in_lmt;
}

View file

@ -0,0 +1,31 @@
/*
* time.c -
*/
#include "include/time.h"
uint8_t is_leapyear(uint16_t year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
uint8_t get_month_days(uint16_t year, uint8_t month)
{
switch (month)
{
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (is_leapyear(year))
return 29;
else
return 28;
default:
return 31;
}
}