Skip to content

Instantly share code, notes, and snippets.

@iamcc
Last active January 29, 2016 09:53
Show Gist options
  • Save iamcc/7427247acd5ec1bba8fe to your computer and use it in GitHub Desktop.
Save iamcc/7427247acd5ec1bba8fe to your computer and use it in GitHub Desktop.
#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(&lt_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(&lt_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(&lt_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(&lt_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(&lt_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