Last active
January 29, 2016 09:53
-
-
Save iamcc/7427247acd5ec1bba8fe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include "maibu_sdk.h" | |
#include "maibu_res.h" | |
static int32_t g_app_window_id = -1; | |
static int8_t g_year_layer_id = -1; | |
static int8_t g_nongli_layer_id = -1; | |
static int8_t g_time_layer_id = -1; | |
static int g_day = -1; | |
// time layer | |
#define TIME_ORIGIN_X 0 | |
#define TIME_ORIGIN_Y 10 | |
#define TIME_SIZE_H 30 | |
#define TIME_SIZE_W 128 | |
// year layer | |
#define YEAR_ORIGIN_X 0 | |
#define YEAR_ORIGIN_Y 58 | |
#define YEAR_SIZE_H 15 | |
#define YEAR_SIZE_W 128 | |
// nongli layer | |
#define NONG_LI_ORIGIN_X 0 | |
#define NONG_LI_ORIGIN_Y 41 | |
#define NONG_LI_SIZE_H 15 | |
#define NONG_LI_SIZE_W 128 | |
// week layer | |
#define WEEK_ORIGIN_X 0 | |
#define WEEK_ORIGIN_Y 76 | |
#define WEEK_SIZE_H 15 | |
#define WEEK_SIZE_W 128 | |
// date_1 layer | |
#define DATE_1_ORIGIN_X 0 | |
#define DATE_1_ORIGIN_Y 94 | |
#define DATE_1_SIZE_H 15 | |
#define DATE_1_SIZE_W 128 | |
// date_2 layer | |
#define DATE_2_ORIGIN_X 0 | |
#define DATE_2_ORIGIN_Y 112 | |
#define DATE_2_SIZE_H 15 | |
#define DATE_2_SIZE_W 128 | |
void init_year_layer(P_Window p_window) | |
{ | |
struct date_time t; | |
app_service_get_datetime(&t); | |
char str[20] = ""; | |
sprintf(str, "%d年%d月", t.year, t.mon); | |
GRect frame = {{YEAR_ORIGIN_X, YEAR_ORIGIN_Y}, {YEAR_SIZE_H, YEAR_SIZE_W}}; | |
LayerText layer_text = {str, frame, GAlignCenter, U_GBK_SIMSUNBD_12, 0}; | |
P_Layer layer = app_layer_create_text(&layer_text); | |
if (NULL != layer) | |
{ | |
g_year_layer_id = app_window_add_layer(p_window, layer); | |
} | |
} | |
void init_nongli_layer(P_Window p_window) | |
{ | |
char *tianGan[10] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}; | |
char *diZhi[12] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"}; | |
char *shuXiang[12] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"}; | |
char *dayName[31] = {"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"}; | |
char *monName[13] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"}; | |
//公历每月前面的天数 | |
int monthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334}; | |
//农历数据 | |
const int nongliData[100] = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438,3402,3749,331177,1453,694,201326,2350,465197,3221,3402 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413 ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031 ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222 ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709 ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877}; int gan,zhi; | |
struct date_time t; | |
app_service_get_datetime(&t); | |
//计算到初始时间1921年2月8日的天数:1921-2-8(正月初一) | |
int theDate = (t.year - 1921) * 365 + (t.year - 1921) / 4 + t.mday + monthAdd[t.mon - 1] - 38; | |
if((!(t.year % 4)) && (t.mon > 2)) | |
theDate++; | |
//计算农历天干、地支、月、日 | |
int nIsEnd = 0; | |
int m = 0, k, n; | |
while(nIsEnd != 1) | |
{ | |
if(nongliData[m] < 4095) k = 11; | |
else k = 12; | |
n = k; | |
while(n>=0) | |
{ | |
//获取nongliData(m)的第n个二进制位的值 | |
int nBit = nongliData[m]; | |
int i; | |
for(i=1;i<n+1;i++) | |
nBit = nBit/2; | |
nBit = nBit % 2; | |
if (theDate <= (29 + nBit)) | |
{ | |
nIsEnd = 1; | |
break; | |
} | |
theDate = theDate - 29 - nBit; | |
n = n - 1; | |
} | |
if(nIsEnd) break; | |
m = m + 1; | |
} | |
int year = 1921 + m; | |
int mon = k - n + 1; | |
int day = theDate; | |
if (k == 12) | |
{ | |
if (mon == nongliData[m] / 65536 + 1) | |
mon = 1 - mon; | |
else if (mon > nongliData[m] / 65536 + 1) | |
mon = mon - 1; | |
} | |
//生成农历天干、地支、属相 | |
char *sx = shuXiang[((year - 4) % 60) % 12]; | |
char nl[20] = ""; | |
sprintf(nl, "%s(%s%s)年", sx, tianGan[((year - 4) % 60) % 10], diZhi[((year - 4) % 60) %12]); | |
//生成农历月、日 | |
char nlDay[20] = ""; | |
if (mon < 1){ | |
sprintf(nlDay, "闰%s", monName[-1 * mon]); | |
} | |
else{ | |
sprintf(nlDay, "%s", monName[mon]); | |
} | |
char str[20] = "羊(乙未)年腊月二十八"; | |
sprintf(str, "%s%s月%s", nl, nlDay, dayName[day]); | |
GRect frame = {{NONG_LI_ORIGIN_X, NONG_LI_ORIGIN_Y}, {NONG_LI_SIZE_H, NONG_LI_SIZE_W}}; | |
LayerText layer_text = {str, frame, GAlignCenter, U_GBK_SIMSUN_12, 0}; | |
P_Layer layer = app_layer_create_text(&layer_text); | |
if (NULL != layer) | |
{ | |
g_nongli_layer_id = app_window_add_layer(p_window, layer); | |
} | |
} | |
void init_week_layer(P_Window p_window) | |
{ | |
char str[30] = ""; | |
sprintf(str, " %s%5s%5s%5s%5s%5s%5s", "日", "一", "二", "三", "四", "五", "六"); | |
GRect frame_week = {{WEEK_ORIGIN_X, WEEK_ORIGIN_Y}, {WEEK_SIZE_H, WEEK_SIZE_W}}; | |
LayerText lt_week = {str, frame_week, GAlignLeft, U_GBK_SIMSUN_12, 0}; | |
P_Layer pl_week = app_layer_create_text(<_week); | |
if (NULL != pl_week) | |
{ | |
app_layer_set_bg_color(pl_week, GColorBlack); | |
app_window_add_layer(p_window, pl_week); | |
} | |
} | |
void init_date_layer(P_Window p_window) | |
{ | |
struct date_time t; | |
app_service_get_datetime(&t); | |
int sd = t.mday - t.wday; | |
int mday; | |
if (t.mon == 1 || t.mon == 3 || t.mon == 5 || t.mon == 7 || t.mon == 8 || t.mon == 10 || t.mon == 12) | |
{ | |
mday = 31; | |
} | |
else if (t.mon == 2) | |
{ | |
mday = 28; | |
if (t.year % 4 == 0 && t.year % 100 != 0 || t.year % 400 == 0) | |
{ | |
mday = 29; | |
} | |
} else | |
{ | |
mday = 30; | |
} | |
if (sd < 1) | |
{ | |
sd += mday; | |
} | |
int days[7], i; | |
for (i = 0; i < 7; i++) | |
{ | |
if (sd + i > mday) | |
{ | |
sd = -1 * i + 1; | |
} | |
days[i] = sd + i; | |
} | |
char date1[20] = ""; | |
sprintf(date1, " %02d %02d %02d %02d %02d %02d %02d", days[0], days[1], days[2], days[3], days[4], days[5], days[6]); | |
GRect frame_date_1 = {{DATE_1_ORIGIN_X, DATE_1_ORIGIN_Y}, {DATE_1_SIZE_H, DATE_1_SIZE_W}}; | |
LayerText lt_date_1 = {date1, frame_date_1, GAlignLeft, U_ASCII_ARIAL_12, 0}; | |
P_Layer pl_date_1 = app_layer_create_text(<_date_1); | |
if (NULL != pl_date_1) | |
{ | |
app_layer_set_bg_color(pl_date_1, GColorBlack); | |
app_window_add_layer(p_window, pl_date_1); | |
} | |
int curX[7] = {2, 19, 38, 57, 74, 91, 109}; | |
char curDay[2] = ""; | |
sprintf(curDay, "%02d", t.mday); | |
GRect frame_cur = {{curX[t.wday], DATE_1_ORIGIN_Y}, {15, 15}}; | |
LayerText lt_cur = {curDay, frame_cur, GAlignCenter, U_ASCII_ARIALBD_12, 0}; | |
P_Layer l_cur = app_layer_create_text(<_cur); | |
app_window_add_layer(p_window, l_cur); | |
sd = days[6] + 1; | |
for (i = 0; i < 7; i++) | |
{ | |
if (sd + i > mday) | |
{ | |
sd = -1 * i + 1; | |
} | |
days[i] = sd + i; | |
} | |
char date2[20] = ""; | |
sprintf(date2, " %02d %02d %02d %02d %02d %02d %02d", days[0], days[1], days[2], days[3], days[4], days[5], days[6]); | |
GRect frame_date_2 = {{DATE_2_ORIGIN_X, DATE_2_ORIGIN_Y}, {DATE_2_SIZE_H, DATE_2_SIZE_W}}; | |
LayerText lt_date_2 = {date2, frame_date_2, GAlignLeft, U_ASCII_ARIAL_12, 0}; | |
P_Layer pl_date_2 = app_layer_create_text(<_date_2); | |
if (NULL != pl_date_2) | |
{ | |
app_layer_set_bg_color(pl_date_2, GColorBlack); | |
app_window_add_layer(p_window, pl_date_2); | |
} | |
} | |
void init_time_layer(P_Window p_window) | |
{ | |
struct date_time t; | |
app_service_get_datetime(&t); | |
char str[20] = ""; | |
sprintf(str, "%02d:%02d", t.hour, t.min); | |
GRect frame_time = {{TIME_ORIGIN_X, TIME_ORIGIN_Y}, {TIME_SIZE_H, TIME_SIZE_W}}; | |
LayerText lt_time = {str, frame_time, GAlignCenter, U_ASCII_ARIALBD_30, 0}; | |
P_Layer pl_time = app_layer_create_text(<_time); | |
if (NULL != pl_time) | |
{ | |
g_day = t.mday; | |
g_time_layer_id = app_window_add_layer(p_window, pl_time); | |
} | |
} | |
void update_layer_time(P_Window p_window) | |
{ | |
struct date_time t; | |
app_service_get_datetime(&t); | |
char str[20] = ""; | |
sprintf(str, "%02d:%02d", t.hour, t.min); | |
P_Layer pl_time = app_window_get_layer_by_id(p_window, g_time_layer_id); | |
if (NULL != pl_time) | |
{ | |
app_layer_set_text_text(pl_time, str); | |
} | |
} | |
void init_bg_layer(P_Window p_window) | |
{ | |
GRect frame = {{0, 0}, {128, 128}}; | |
GBitmap bitmap; | |
res_get_user_bitmap(RES_BITMAP_DEMO, &bitmap); | |
LayerBitmap layer_bitmap = {bitmap, frame, GAlignCenter}; | |
P_Layer layer = app_layer_create_bitmap(&layer_bitmap); | |
app_window_add_layer(p_window, layer); | |
} | |
void init_status_bar(P_Window p_window) | |
{ | |
app_plug_status_bar_create(p_window, NULL, NULL, NULL); | |
// app_plug_status_bar_add_time(p_window); /*状态栏中添加时间*/ | |
app_plug_status_bar_add_ble(p_window); /*状态栏中添加蓝牙状态*/ | |
app_plug_status_bar_add_battery(p_window); /*状态栏中添加电量状态*/ | |
} | |
P_Window init_mwd_window() | |
{ | |
P_Window p_window = app_window_create(); | |
if (NULL == p_window) | |
{ | |
return NULL; | |
} | |
init_status_bar(p_window); | |
init_bg_layer(p_window); | |
init_time_layer(p_window); | |
init_year_layer(p_window); | |
init_nongli_layer(p_window); | |
init_week_layer(p_window); | |
init_date_layer(p_window); | |
return p_window; | |
} | |
void app_watch_time_change(enum SysEventType type, void *context) | |
{ | |
if (SysEventTypeTimeChange == type) | |
{ | |
P_Window p_window = app_window_stack_get_window_by_id(g_app_window_id); | |
if (NULL == p_window) | |
{ | |
return; | |
} | |
struct date_time t; | |
app_service_get_datetime(&t); | |
if (g_day != t.mday) | |
{ | |
P_Window p_window_new = init_mwd_window(); | |
if (NULL != p_window_new) | |
{ | |
app_window_stack_pop(p_window); | |
g_app_window_id = app_window_stack_push(p_window_new); | |
g_day = t.mday; | |
} | |
} | |
else | |
{ | |
update_layer_time(p_window); | |
app_window_update(p_window); | |
} | |
} | |
} | |
int main() | |
{ | |
// simulator_init(); | |
P_Window p_window = init_mwd_window(); | |
if (NULL != p_window) | |
{ | |
g_app_window_id = app_window_stack_push(p_window); | |
maibu_service_sys_event_subscribe(app_watch_time_change); | |
} | |
// simulator_wait(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment