Browse code

Make stopwatch a little more accurate, minor fix to alarm edit screen

Dario Rodriguez authored on 16/01/2014 22:59:59
Showing 1 changed files
... ...
@@ -709,6 +709,7 @@ event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *
709 709
 				break;
710 710
 			case BUTTON_F:
711 711
 				alarm_setup_screen.set_mode = FALSE;
712
+				alarm_setup_screen.pos = 0;
712 713
 				break;
713 714
 			default:
714 715
 				return EVENT_RET_UNHANDLED;
... ...
@@ -931,7 +932,16 @@ static int timerecord_cmp(timerecord *a, timerecord *b)
931 932
 	return(a->csec-b->csec);
932 933
 }
933 934
 
934
-static void draw_stop_watch_screen(stopwatch_data_t *sdata)
935
+typedef enum estopwmask {
936
+	stopwm_icon=0x1,
937
+	stopwm_laps=0x2,
938
+	stopwm_split=0x4,
939
+	stopwm_current=0x8,
940
+	stopwm_menu=0x10,
941
+	stopwm_all=0x1f
942
+} stopwmask;
943
+
944
+static void draw_stop_watch_screen(stopwatch_data_t *sdata, int mask)
935 945
 {
936 946
 	int w;
937 947
 	char *hint;
... ...
@@ -961,49 +971,67 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
961 971
 		hal_lcd_update_display();
962 972
 		return;
963 973
 	}
964
-	hal_lcd_clear_display();
974
+	if(mask==stopwm_all)
975
+		hal_lcd_clear_display();
965 976
 
966
-	oswald_draw_bitmap(36, 3, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
977
+	if(mask&stopwm_icon) {
978
+		if(mask!=stopwm_all)
979
+			oswald_draw_rect(36,3,36-1+stopwatch_icon_width,3-1+stopwatch_icon_height,0);
980
+		oswald_draw_bitmap(36, 3, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
981
+	}
967 982
 	/* Current menu option */
968
-	oswald_draw_rect(0,95-12,95,95,1);
969
-	hint=(sdata->item==stopw_startstop)?"Start-Stop":
970
-		(sdata->item==stopw_split)?"Start-Split":
971
-		(sdata->item==stopw_reset)?"Reset":
972
-		"Unknown";
973
-	w=oswald_getwidth_font58_scaled(hint,2,1);
974
-	oswald_writestr_font58_scaled((96-w)/2,95-8,hint,&w,0,1,2,1);
975
-
983
+	if(mask&stopwm_menu) {
984
+		oswald_draw_rect(0,95-12,95,95,1);
985
+		hint=(sdata->item==stopw_startstop)?"Start-Stop":
986
+			(sdata->item==stopw_split)?"Start-Split":
987
+			(sdata->item==stopw_reset)?"Reset":
988
+			"Unknown";
989
+		w=oswald_getwidth_font58_scaled(hint,2,1);
990
+		oswald_writestr_font58_scaled((96-w)/2,95-8,hint,&w,0,1,2,1);
991
+	}
976 992
 	/* Lap number */
977
-	num2str(sdata->laps,lapbuf,3,3);
978
-	oswald_writestr_font58_scaled(3,3,lapbuf,&w,1,0,2,2);
979
-
980
-	/* Split diff */
981
-	timerecord2str(&(sdata->lastlap),timebuf,csecbuf);
982
-        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
983
-        oswald_writestr_font58_scaled(x,28,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
984
-        oswald_writestr_font58_scaled(x+w+1,34,csecbuf,&w,1,0,2,1);
985
-
986
-
987
-	/* Split */
988
-	if(sdata->laps>0)
989
-		timerecord2str(sdata->lapsdata+((sdata->laps<MAX_LAPS)?sdata->laps-1:MAX_LAPS-1),timebuf,csecbuf);	
990
-	else {
991
-		mymemcpy(timebuf," 0:00:00",9);
992
-		mymemcpy(csecbuf,"00",3);
993
+	if(mask&stopwm_laps) {
994
+		if(mask!=stopwm_all)
995
+			oswald_draw_rect(3,3,3+9*3,3+12,0);
996
+		num2str(sdata->laps,lapbuf,3,3);
997
+		oswald_writestr_font58_scaled(3,3,lapbuf,&w,1,0,2,2);
998
+	}
999
+
1000
+	/* Split diff /Split diff */
1001
+	if(mask&stopwm_split) {
1002
+		if(mask!=stopwm_all)
1003
+			oswald_draw_rect(0,28,95,60,0);
1004
+		/* diff */
1005
+		timerecord2str(&(sdata->lastlap),timebuf,csecbuf);
1006
+	        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
1007
+	        oswald_writestr_font58_scaled(x,28,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
1008
+	        oswald_writestr_font58_scaled(x+w+1,34,csecbuf,&w,1,0,2,1);
1009
+
1010
+		/* Split */
1011
+		if(sdata->laps>0)
1012
+			timerecord2str(sdata->lapsdata+((sdata->laps<MAX_LAPS)?sdata->laps-1:MAX_LAPS-1),timebuf,csecbuf);	
1013
+		else {
1014
+			mymemcpy(timebuf," 0:00:00",9);
1015
+			mymemcpy(csecbuf,"00",3);
1016
+		}
1017
+	        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
1018
+	        oswald_writestr_font58_scaled(x,42,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
1019
+	        oswald_writestr_font58_scaled(x+w+1,48,csecbuf,&w,1,0,2,1);
993 1020
 	}
994
-        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
995
-        oswald_writestr_font58_scaled(x,42,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
996
-        oswald_writestr_font58_scaled(x+w+1,48,csecbuf,&w,1,0,2,1);
997 1021
 
998 1022
 	/* main display */
999
-	timerecord2str(&(sdata->current),timebuf,csecbuf);
1000
-	x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
1001
-	oswald_writestr_font58_scaled(x,61,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,3);
1002
-	x+=w;
1003
-	oswald_writestr_font58_scaled(x+1,67,csecbuf,&w,1,0,2,2);
1004
-	if(sdata->running)
1005
-		oswald_draw_rect(x+10,67,x+17,78,0);
1006
-	
1023
+	if(mask&stopwm_current) {
1024
+		if(mask!=stopwm_all)
1025
+			oswald_draw_rect(0,61,95,95-13,0);
1026
+		timerecord2str(&(sdata->current),timebuf,csecbuf);
1027
+		x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
1028
+		oswald_writestr_font58_scaled(x,61,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,3);
1029
+		x+=w;
1030
+		if(sdata->running)
1031
+			csecbuf[1]='\0';
1032
+		oswald_writestr_font58_scaled(x+1,67,csecbuf,&w,1,0,2,2);
1033
+	}
1034
+		
1007 1035
 	hal_lcd_update_display();
1008 1036
 }
1009 1037
 
... ...
@@ -1014,6 +1042,7 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1014 1042
 			stopwatch_screen.showstats=0;
1015 1043
 		else if(button==BUTTON_D)
1016 1044
 			return(EVENT_RET_UNHANDLED);
1045
+		draw_stop_watch_screen(&stopwatch_screen,stopwm_all);
1017 1046
 		return(EVENT_RET_HANDLED);
1018 1047
 	}
1019 1048
 	switch (button) {
... ...
@@ -1026,6 +1055,7 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1026 1055
 					hal_enable_centisecond_timer();
1027 1056
 					stopwatch_screen.running = TRUE;
1028 1057
 				}
1058
+				draw_stop_watch_screen(&stopwatch_screen,stopwm_current);
1029 1059
 			} else if(stopwatch_screen.item==stopw_split) {
1030 1060
 				if (stopwatch_screen.running) {
1031 1061
 					int l;
... ...
@@ -1047,6 +1077,7 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1047 1077
 						mymemcpy(&(stopwatch_screen.min),&(stopwatch_screen.lastlap),sizeof(timerecord));
1048 1078
 					if(stopwatch_screen.laps==1 || timerecord_cmp(&(stopwatch_screen.lastlap),&(stopwatch_screen.max))>0)
1049 1079
 						mymemcpy(&(stopwatch_screen.max),&(stopwatch_screen.lastlap),sizeof(timerecord));
1080
+					draw_stop_watch_screen(&stopwatch_screen,stopwm_split|stopwm_laps);
1050 1081
 				} else {
1051 1082
 					hal_enable_centisecond_timer();
1052 1083
 					stopwatch_screen.running = TRUE;
... ...
@@ -1055,6 +1086,7 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1055 1086
 				if(stopwatch_screen.running)
1056 1087
 					hal_disable_centisecond_timer();
1057 1088
 				mymemset(&(stopwatch_screen),0,sizeof(stopwatch_screen));
1089
+				draw_stop_watch_screen(&stopwatch_screen,stopwm_all);
1058 1090
 			} else {
1059 1091
 				return EVENT_RET_UNHANDLED;
1060 1092
 			}
... ...
@@ -1063,15 +1095,20 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1063 1095
 		case BUTTON_A: 
1064 1096
 			stopwatch_screen.item+=stopw_end-1;
1065 1097
 			stopwatch_screen.item%=stopw_end;
1098
+			draw_stop_watch_screen(&stopwatch_screen,stopwm_menu);
1066 1099
 			return EVENT_RET_HANDLED;
1067 1100
 			break;
1068 1101
 		case BUTTON_C: 
1069 1102
 			stopwatch_screen.item++;
1070 1103
 			stopwatch_screen.item%=stopw_end;
1104
+			draw_stop_watch_screen(&stopwatch_screen,stopwm_menu);
1071 1105
 			return EVENT_RET_HANDLED;
1072 1106
 			break;
1073 1107
 		case BUTTON_F:
1074 1108
 			stopwatch_screen.showstats=1-stopwatch_screen.showstats;
1109
+			draw_stop_watch_screen(&stopwatch_screen,stopwm_all);
1110
+			return EVENT_RET_HANDLED;
1111
+			break;
1075 1112
 		default:
1076 1113
 			return EVENT_RET_UNHANDLED;
1077 1114
 			break;
... ...
@@ -1086,11 +1123,10 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
1086 1123
 		case EVENT_USER_BUTTONS:
1087 1124
 			dbg_out("button event %d\n", *(int *)data);
1088 1125
 			ret=handle_stop_watch_buttons(*(watch_button *)data);
1089
-			draw_stop_watch_screen(&stopwatch_screen);
1090 1126
 			return(ret);
1091 1127
 			break;
1092 1128
 		case EVENT_SCREEN_VISIBLE:
1093
-			draw_stop_watch_screen(&stopwatch_screen);
1129
+			draw_stop_watch_screen(&stopwatch_screen,stopwm_all);
1094 1130
 			return EVENT_RET_HANDLED;
1095 1131
 			break;
1096 1132
 		case EVENT_SCREEN_DESTROY:
... ...
@@ -1116,8 +1152,7 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
1116 1152
 				stopwatch_screen.current.hr = 0;
1117 1153
 			};
1118 1154
 			if ((stopwatch_screen.current.csec % 10)==0 || stopwatch_screen.running!=TRUE)
1119
-				draw_stop_watch_screen(&stopwatch_screen);
1120
-				//update_stop_watch_screen(&stopwatch_screen);
1155
+				draw_stop_watch_screen(&stopwatch_screen,stopwm_current);
1121 1156
 			return EVENT_RET_HANDLED;
1122 1157
 			break;
1123 1158
 		default:
Browse code

Add text to alarm trigger screen, finish preliminary version of stopwatch, re-style bluetooth screen

Dario Rodriguez authored on 15/01/2014 22:59:59
Showing 1 changed files
... ...
@@ -329,8 +329,6 @@ void draw_accel_screen(accel_data_t *accel_data)
329 329
 
330 330
 	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, 1, acc_icon_bits);
331 331
 
332
-	oswald_draw_bitmap(81, 79, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
333
-
334 332
 	oswald_write_string(1, 40, FONT_6x9, FALSE, "X:");
335 333
 	oswald_write_number(15, 40, FONT_6x9, FALSE, accel_data->x);
336 334
 	oswald_write_string(1, 52, FONT_6x9, FALSE, "Y:");
... ...
@@ -872,8 +870,13 @@ typedef struct {
872 870
 	timerecord current;
873 871
 	int laps;
874 872
 	timerecord lapsdata[MAX_LAPS];
873
+	timerecord avg;
874
+	timerecord max;
875
+	timerecord min;
876
+	timerecord lastlap;
875 877
 	boolean running;
876 878
 	stopw_item item;
879
+	boolean showstats;
877 880
 } stopwatch_data_t;
878 881
 static stopwatch_data_t stopwatch_screen = { {0, 0, 0, 0},0,{{0, 0, 0, 0}} , FALSE,0};
879 882
 
... ...
@@ -886,22 +889,81 @@ static void timerecord2str(timerecord *tr, char *timebuf /* sizeof(timebuf)>=9 *
886 889
 	num2str(tr->min,timebuf+3,2,2);
887 890
 	timebuf[5]=':';
888 891
 	num2str(tr->sec,timebuf+6,2,2);
889
-	
890 892
 	num2str(tr->csec,csecbuf,2,2);
891 893
 }
892 894
 
895
+static void timerecord_diff(timerecord *new, timerecord *old, timerecord *res)
896
+{
897
+	int d,od;
898
+	mymemset(res,0,sizeof(timerecord));
899
+	d=(old->csec>new->csec)?1:0;
900
+	res->csec=(new->csec+d*100)-old->csec;
901
+	od=d,d=(old->sec>(new->sec-od))?1:0;
902
+	res->sec=(new->sec-od+d*60)-old->sec;
903
+	od=d,d=(old->min>(new->min-od))?1:0;
904
+	res->min=(new->min-od+d*60)-old->min;
905
+	res->hr=(new->hr-d)-old->hr;
906
+}
907
+
908
+static void timerecord_div(timerecord *total, int div, timerecord *res)
909
+{
910
+	int n;
911
+	mymemset(res,0,sizeof(timerecord));
912
+	if(div<0)
913
+		return;
914
+	res->hr=total->hr/div;
915
+	n=(((int)total->min)+(total->hr%div)*60);
916
+	res->min=n/div;
917
+	n=(((int)total->sec)+(n%div)*60);
918
+	res->sec=n/div;
919
+	n=(((int)total->csec)+(n%div)*100);
920
+	res->csec=n/div;
921
+}
922
+
923
+static int timerecord_cmp(timerecord *a, timerecord *b)
924
+{
925
+	if(a->hr!=b->hr) 
926
+		return(a->hr-b->hr);
927
+	if(a->min!=b->min)
928
+		return(a->min-b->min);
929
+	if(a->sec!=b->sec)
930
+		return(a->sec-b->sec);
931
+	return(a->csec-b->csec);
932
+}
933
+
893 934
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
894 935
 {
895 936
 	int w;
896 937
 	char *hint;
897
-	int x;
938
+	int x,y;
898 939
 	char lapbuf[4];
899 940
 	char timebuf[9];
900 941
 	char csecbuf[3];
942
+	int i;
901 943
 
944
+	if(sdata->showstats) {
945
+		hal_lcd_clear_display();
946
+		oswald_draw_grid(1,1,94,94,100,100);
947
+		oswald_draw_bitmap(36, 3, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
948
+		/* laps */
949
+		num2str(sdata->laps,lapbuf,3,3);
950
+		oswald_writestr_font58_scaled(3,3,lapbuf,&w,1,0,2,2);
951
+		/* stats */
952
+		for(i=0;i<3;i++) {
953
+			y=20+i*24;
954
+			hint=((i==0)?"Average":(i==1)?"Min":"Max");
955
+			oswald_writestr_font58(4,y+3,hint,&w,1,0);
956
+			timerecord2str(i==0?&(sdata->avg):i==1?&(sdata->min):&(sdata->max),timebuf,csecbuf);
957
+		        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
958
+		        oswald_writestr_font58_scaled(x,y+12,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
959
+		        oswald_writestr_font58_scaled(x+w+1,y+12+6,csecbuf,&w,1,0,2,1);
960
+		}
961
+		hal_lcd_update_display();
962
+		return;
963
+	}
902 964
 	hal_lcd_clear_display();
903 965
 
904
-	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
966
+	oswald_draw_bitmap(36, 3, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
905 967
 	/* Current menu option */
906 968
 	oswald_draw_rect(0,95-12,95,95,1);
907 969
 	hint=(sdata->item==stopw_startstop)?"Start-Stop":
... ...
@@ -913,14 +975,13 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
913 975
 
914 976
 	/* Lap number */
915 977
 	num2str(sdata->laps,lapbuf,3,3);
916
-	oswald_writestr_font58_scaled(0,0,lapbuf,&w,1,0,2,2);
978
+	oswald_writestr_font58_scaled(3,3,lapbuf,&w,1,0,2,2);
917 979
 
918 980
 	/* Split diff */
919
-        mymemcpy(timebuf," 0:00:00",9);
920
-        mymemcpy(csecbuf,"00",3);
981
+	timerecord2str(&(sdata->lastlap),timebuf,csecbuf);
921 982
         x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
922 983
         oswald_writestr_font58_scaled(x,28,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
923
-        oswald_writestr_font58_scaled(x+w+1,35,csecbuf,&w,1,0,2,1);
984
+        oswald_writestr_font58_scaled(x+w+1,34,csecbuf,&w,1,0,2,1);
924 985
 
925 986
 
926 987
 	/* Split */
... ...
@@ -932,38 +993,29 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
932 993
 	}
933 994
         x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
934 995
         oswald_writestr_font58_scaled(x,42,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
935
-        oswald_writestr_font58_scaled(x+w+1,49,csecbuf,&w,1,0,2,1);
936
-#warning TODO DIFF
996
+        oswald_writestr_font58_scaled(x+w+1,48,csecbuf,&w,1,0,2,1);
937 997
 
938 998
 	/* main display */
939 999
 	timerecord2str(&(sdata->current),timebuf,csecbuf);
940 1000
 	x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
941 1001
 	oswald_writestr_font58_scaled(x,61,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,3);
942
-	oswald_writestr_font58_scaled(x+w+1,67,csecbuf,&w,1,0,2,2);
1002
+	x+=w;
1003
+	oswald_writestr_font58_scaled(x+1,67,csecbuf,&w,1,0,2,2);
1004
+	if(sdata->running)
1005
+		oswald_draw_rect(x+10,67,x+17,78,0);
943 1006
 	
944
-/*	
945
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10)+'0');
946
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10)+'0');
947
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10)+'0');
948
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec / 10)+'0');
949
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec % 10)+'0');
950
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->csec / 10)+'0');
951
-
952
-	gRow = 6;
953
-	gColumn = 61;
954
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_hr % 10)+'0');
955
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min / 10)+'0');
956
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min % 10)+'0');
957
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec / 10)+'0');
958
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10)+'0');
959
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10)+'0');
960
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10)+'0');
961
-*/
962 1007
 	hal_lcd_update_display();
963 1008
 }
964 1009
 
965 1010
 event_ret_t handle_stop_watch_buttons(watch_button button)
966 1011
 {
1012
+	if(stopwatch_screen.showstats) {
1013
+		if(button==BUTTON_F)
1014
+			stopwatch_screen.showstats=0;
1015
+		else if(button==BUTTON_D)
1016
+			return(EVENT_RET_UNHANDLED);
1017
+		return(EVENT_RET_HANDLED);
1018
+	}
967 1019
 	switch (button) {
968 1020
 		case BUTTON_B: // start/stop
969 1021
 			if(stopwatch_screen.item==stopw_startstop) {
... ...
@@ -985,35 +1037,41 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
985 1037
 					}
986 1038
 					stopwatch_screen.laps++;
987 1039
 					mymemcpy(stopwatch_screen.lapsdata+l,&(stopwatch_screen.current),sizeof(timerecord));
1040
+					/* update statistics */
1041
+					if(l>0)
1042
+						timerecord_diff(stopwatch_screen.lapsdata+l,stopwatch_screen.lapsdata+l-1,&(stopwatch_screen.lastlap));
1043
+					else
1044
+						mymemcpy(&(stopwatch_screen.lastlap),stopwatch_screen.lapsdata+l,sizeof(timerecord));
1045
+					timerecord_div(stopwatch_screen.lapsdata+l,stopwatch_screen.laps,&(stopwatch_screen.avg));
1046
+					if(stopwatch_screen.laps==1 || timerecord_cmp(&(stopwatch_screen.lastlap),&(stopwatch_screen.min))<0)
1047
+						mymemcpy(&(stopwatch_screen.min),&(stopwatch_screen.lastlap),sizeof(timerecord));
1048
+					if(stopwatch_screen.laps==1 || timerecord_cmp(&(stopwatch_screen.lastlap),&(stopwatch_screen.max))>0)
1049
+						mymemcpy(&(stopwatch_screen.max),&(stopwatch_screen.lastlap),sizeof(timerecord));
988 1050
 				} else {
989 1051
 					hal_enable_centisecond_timer();
990 1052
 					stopwatch_screen.running = TRUE;
991 1053
 				}
992
-#warning TODO: statistics
993 1054
 			} else if(stopwatch_screen.item==stopw_reset) {
994
-				stopwatch_screen.current.hr = 0;
995
-				stopwatch_screen.current.min = 0;
996
-				stopwatch_screen.current.sec = 0;
997
-				stopwatch_screen.current.csec = 0;
998
-				stopwatch_screen.laps=0;
1055
+				if(stopwatch_screen.running)
1056
+					hal_disable_centisecond_timer();
1057
+				mymemset(&(stopwatch_screen),0,sizeof(stopwatch_screen));
999 1058
 			} else {
1000 1059
 				return EVENT_RET_UNHANDLED;
1001 1060
 			}
1002
-			draw_stop_watch_screen(&stopwatch_screen);
1003 1061
 			return EVENT_RET_HANDLED;
1004 1062
 			break;
1005 1063
 		case BUTTON_A: 
1006 1064
 			stopwatch_screen.item+=stopw_end-1;
1007 1065
 			stopwatch_screen.item%=stopw_end;
1008
-			draw_stop_watch_screen(&stopwatch_screen);
1009 1066
 			return EVENT_RET_HANDLED;
1010 1067
 			break;
1011 1068
 		case BUTTON_C: 
1012 1069
 			stopwatch_screen.item++;
1013 1070
 			stopwatch_screen.item%=stopw_end;
1014
-			draw_stop_watch_screen(&stopwatch_screen);
1015 1071
 			return EVENT_RET_HANDLED;
1016 1072
 			break;
1073
+		case BUTTON_F:
1074
+			stopwatch_screen.showstats=1-stopwatch_screen.showstats;
1017 1075
 		default:
1018 1076
 			return EVENT_RET_UNHANDLED;
1019 1077
 			break;
... ...
@@ -1023,11 +1081,13 @@ event_ret_t handle_stop_watch_buttons(watch_button button)
1023 1081
 
1024 1082
 event_ret_t stop_watch_handle_events(uint16_t event, void *data)
1025 1083
 {
1084
+	event_ret_t ret;
1026 1085
 	switch (event) {
1027 1086
 		case EVENT_USER_BUTTONS:
1028 1087
 			dbg_out("button event %d\n", *(int *)data);
1088
+			ret=handle_stop_watch_buttons(*(watch_button *)data);
1029 1089
 			draw_stop_watch_screen(&stopwatch_screen);
1030
-			return handle_stop_watch_buttons(*(watch_button *)data);
1090
+			return(ret);
1031 1091
 			break;
1032 1092
 		case EVENT_SCREEN_VISIBLE:
1033 1093
 			draw_stop_watch_screen(&stopwatch_screen);
... ...
@@ -1055,7 +1115,7 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
1055 1115
 			if (stopwatch_screen.current.hr > 59) {
1056 1116
 				stopwatch_screen.current.hr = 0;
1057 1117
 			};
1058
-			if (stopwatch_screen.current.csec % 10 == 0)
1118
+			if ((stopwatch_screen.current.csec % 10)==0 || stopwatch_screen.running!=TRUE)
1059 1119
 				draw_stop_watch_screen(&stopwatch_screen);
1060 1120
 				//update_stop_watch_screen(&stopwatch_screen);
1061 1121
 			return EVENT_RET_HANDLED;
... ...
@@ -1073,10 +1133,12 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
1073 1133
  */
1074 1134
 void draw_alarm_screen(void)
1075 1135
 {
1136
+	static char txt[]={"Alarm"};
1137
+	int w;
1076 1138
 	hal_lcd_clear_display();
1077
-
1078 1139
 	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
1079
-
1140
+	w=oswald_getwidth_font58_scaled(txt,1,2);
1141
+	oswald_writestr_font58_scaled((96-1-w)/2+1,49,txt,&w,1,0,1,2);
1080 1142
 	hal_lcd_update_display();
1081 1143
 }
1082 1144
 
... ...
@@ -1136,50 +1198,45 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1136 1198
 
1137 1199
 	hal_lcd_clear_display();
1138 1200
 
1139
-	oswald_draw_bitmap(36, 0, bluetooth_icon_width, bluetooth_icon_height, 1, bluetooth_icon_bits);
1201
+	oswald_draw_bitmap(36, 3, bluetooth_icon_width, bluetooth_icon_height, 1, bluetooth_icon_bits);
1140 1202
 
1141
-	if (sdata->set_mode) {
1142
-		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, 1, upbutton_icon_bits);
1143
-		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, 1, downbutton_icon_bits);
1144
-		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
1145
-	} else {
1146
-		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1147
-	}
1203
+	if (sdata->set_mode) 
1204
+		oswald_draw_grid(1,1,94,94,100,100);
1148 1205
 
1149
-	oswald_write_string(1, 30, FONT_DROID8x12, FALSE, "Enable:");
1150
-	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
1151
-		if (bluetooth_screen.bt_en)
1152
-			oswald_draw_bitmap(53, 33, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1153
-		else
1154
-			oswald_draw_bitmap(53, 33, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1155
-	}
1156
-	oswald_write_string(1, 40, FONT_DROID8x12, FALSE, "State:");
1206
+	oswald_write_string(25, 39, FONT_DROID8x12, FALSE, "State");
1157 1207
 	switch (hal_bluetooth_get_state()) {
1158 1208
 		case BLUETOOTH_OFF:
1159
-			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "off");
1209
+			oswald_write_string(53, 39, FONT_DROID8x12, FALSE, "off");
1160 1210
 			break;
1161 1211
 		case BLUETOOTH_ON:
1162
-			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "on");
1212
+			oswald_write_string(53, 39, FONT_DROID8x12, FALSE, "on");
1163 1213
 			break;
1164 1214
 		case BLUETOOTH_CONNECTED:
1165
-			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "conn.");
1215
+			oswald_write_string(53, 39, FONT_DROID8x12, FALSE, "conn.");
1166 1216
 			break;
1167 1217
 		default:
1168 1218
 			break;
1169 1219
 	};
1170
-	oswald_write_string(1, 50, FONT_DROID8x12, FALSE, "Visible:");
1220
+	oswald_write_string(16, 54, FONT_DROID8x12, FALSE, "Enabled");
1221
+	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
1222
+		if (bluetooth_screen.bt_en)
1223
+			oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1224
+		else
1225
+			oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1226
+	}
1227
+	oswald_write_string(18, 69, FONT_DROID8x12, FALSE, "Visible");
1171 1228
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
1172 1229
 		// oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
1173 1230
 		if (hal_bluetooth_get_visible())
1174
-			oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1231
+			oswald_draw_bitmap(53, 68, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1175 1232
 		else
1176
-			oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1233
+			oswald_draw_bitmap(53, 68, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1177 1234
 	}
1178 1235
 
1179 1236
 	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
1180 1237
 		int i,off,c;
1181 1238
 		bd_addr = hal_bluetooth_get_local_bdaddr();
1182
-		for(i=5,off=0;i>=0;i++) {
1239
+		for(i=5,off=0;i>=0;i--) {
1183 1240
 			if(i!=5)
1184 1241
 				bstr[off++]=':';
1185 1242
 			c=(bd_addr[i]>>4)&0xf;
... ...
@@ -1188,8 +1245,7 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1188 1245
 			bstr[off++]=((c<10)?(c+'0'):(c+'a'-10));
1189 1246
 		}
1190 1247
 		bstr[off++]='\0';
1191
-		oswald_write_string(2, 85, FONT_5x7, FALSE, bstr);
1192
-	} else {
1248
+		oswald_write_string(11, 85, FONT_5x7, FALSE, bstr);
1193 1249
 	}
1194 1250
 
1195 1251
 	hal_lcd_update_display();
... ...
@@ -1223,15 +1279,17 @@ event_ret_t handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdat
1223 1279
 {
1224 1280
 	if (bluetooth_screen.set_mode) {
1225 1281
 		switch (button) {
1226
-			case BUTTON_A:
1282
+			case BUTTON_B:
1227 1283
 				bluetooth_handle_updown(sdata->pos, 1);
1228 1284
 				break;
1229
-			case BUTTON_B:
1285
+			case BUTTON_E:
1230 1286
 				bluetooth_handle_updown(sdata->pos, -1);
1231 1287
 				break;
1288
+			case BUTTON_A:
1289
+				sdata->pos=1-sdata->pos;
1290
+				break;
1232 1291
 			case BUTTON_C:
1233
-				sdata->pos++;
1234
-				sdata->pos %= 2;
1292
+				sdata->pos=1-sdata->pos;
1235 1293
 				break;
1236 1294
 			case BUTTON_F:
1237 1295
 				bluetooth_screen.set_mode = FALSE;
Browse code

Use strutils instead of snprintf (to save some bytes), set default year to 2014, partial revamp of the stopwatch

Dario Rodriguez authored on 14/01/2014 22:59:59
Showing 1 changed files
... ...
@@ -7,6 +7,8 @@
7 7
 #include "oswald_hal.h"
8 8
 
9 9
 #include "dayslib.h"
10
+#include "mymem.h"
11
+#include "strutils.h"
10 12
 
11 13
 #include "oswald_screens.h"
12 14
 
... ...
@@ -234,9 +236,7 @@ void draw_main_menu_screen(main_menu_data_t *sdata)
234 236
 		if(i==sdata->pos)
235 237
 			oswald_draw_rect(0,y-5,95,y+32-5,1);
236 238
 		oswald_draw_bitmap(x,y,menu_items[i].width,menu_items[i].height,(i==sdata->pos)?0:1,menu_items[i].bits);
237
-		for(t=menu_items[i].name;*t!='\0';t++,x+=w+1) {
238
-			oswald_draw_font58_scaled(x+30, y+6,*t,&w,(i==sdata->pos)?0:1,(i==sdata->pos)?1:0,1,2);
239
-		}
239
+		oswald_writestr_font58_scaled(x+30, y+6,menu_items[i].name,&w,(i==sdata->pos)?0:1,(i==sdata->pos)?1:0,1,2);
240 240
 	}
241 241
 	
242 242
 
... ...
@@ -855,33 +855,93 @@ event_ret_t test_menu_handle_events(uint16_t event, void *data)
855 855
 /*
856 856
  * Stop Watch
857 857
  */
858
+typedef enum estopw_item {
859
+	stopw_startstop,
860
+	stopw_split,
861
+	stopw_reset,
862
+	stopw_end
863
+} stopw_item;
858 864
 typedef struct {
859 865
 	uint8_t hr;
860 866
 	uint8_t min;
861 867
 	uint8_t sec;
862 868
 	uint8_t csec;
863
-	uint8_t lapse_hr;
864
-	uint8_t lapse_min;
865
-	uint8_t lapse_sec;
866
-	uint8_t lapse_csec;
869
+} timerecord;
870
+#define MAX_LAPS 2
871
+typedef struct {
872
+	timerecord current;
873
+	int laps;
874
+	timerecord lapsdata[MAX_LAPS];
867 875
 	boolean running;
876
+	stopw_item item;
868 877
 } stopwatch_data_t;
869
-static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
878
+static stopwatch_data_t stopwatch_screen = { {0, 0, 0, 0},0,{{0, 0, 0, 0}} , FALSE,0};
870 879
 
880
+static void timerecord2str(timerecord *tr, char *timebuf /* sizeof(timebuf)>=9 */, char *csecbuf /*sizeof(csecbuf)>=3*/)
881
+{
882
+	num2str(tr->hr,timebuf,2,2);
883
+	if(tr->hr<10)
884
+		timebuf[0]=' ';
885
+	timebuf[2]=':';
886
+	num2str(tr->min,timebuf+3,2,2);
887
+	timebuf[5]=':';
888
+	num2str(tr->sec,timebuf+6,2,2);
889
+	
890
+	num2str(tr->csec,csecbuf,2,2);
891
+}
871 892
 
872 893
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
873 894
 {
874
-	int gRow = 1;
875
-	int gColumn = 35;
895
+	int w;
896
+	char *hint;
897
+	int x;
898
+	char lapbuf[4];
899
+	char timebuf[9];
900
+	char csecbuf[3];
876 901
 
877 902
 	hal_lcd_clear_display();
878 903
 
879 904
 	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
880
-
881
-	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, 1, startstopbutton_icon_bits);
882
-	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, 1, lapsebutton_icon_bits);
883
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
884
-
905
+	/* Current menu option */
906
+	oswald_draw_rect(0,95-12,95,95,1);
907
+	hint=(sdata->item==stopw_startstop)?"Start-Stop":
908
+		(sdata->item==stopw_split)?"Start-Split":
909
+		(sdata->item==stopw_reset)?"Reset":
910
+		"Unknown";
911
+	w=oswald_getwidth_font58_scaled(hint,2,1);
912
+	oswald_writestr_font58_scaled((96-w)/2,95-8,hint,&w,0,1,2,1);
913
+
914
+	/* Lap number */
915
+	num2str(sdata->laps,lapbuf,3,3);
916
+	oswald_writestr_font58_scaled(0,0,lapbuf,&w,1,0,2,2);
917
+
918
+	/* Split diff */
919
+        mymemcpy(timebuf," 0:00:00",9);
920
+        mymemcpy(csecbuf,"00",3);
921
+        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
922
+        oswald_writestr_font58_scaled(x,28,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
923
+        oswald_writestr_font58_scaled(x+w+1,35,csecbuf,&w,1,0,2,1);
924
+
925
+
926
+	/* Split */
927
+	if(sdata->laps>0)
928
+		timerecord2str(sdata->lapsdata+((sdata->laps<MAX_LAPS)?sdata->laps-1:MAX_LAPS-1),timebuf,csecbuf);	
929
+	else {
930
+		mymemcpy(timebuf," 0:00:00",9);
931
+		mymemcpy(csecbuf,"00",3);
932
+	}
933
+        x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
934
+        oswald_writestr_font58_scaled(x,42,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,2);
935
+        oswald_writestr_font58_scaled(x+w+1,49,csecbuf,&w,1,0,2,1);
936
+#warning TODO DIFF
937
+
938
+	/* main display */
939
+	timerecord2str(&(sdata->current),timebuf,csecbuf);
940
+	x=8+((timebuf[0]==' ')?oswald_getwidth_font58_scaled("0",2,3):0);
941
+	oswald_writestr_font58_scaled(x,61,timebuf+((timebuf[0]==' ')?1:0),&w,1,0,2,3);
942
+	oswald_writestr_font58_scaled(x+w+1,67,csecbuf,&w,1,0,2,2);
943
+	
944
+/*	
885 945
 	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10)+'0');
886 946
 	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10)+'0');
887 947
 	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10)+'0');
... ...
@@ -898,39 +958,60 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
898 958
 	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10)+'0');
899 959
 	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10)+'0');
900 960
 	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10)+'0');
901
-
961
+*/
902 962
 	hal_lcd_update_display();
903 963
 }
904 964
 
905 965
 event_ret_t handle_stop_watch_buttons(watch_button button)
906 966
 {
907 967
 	switch (button) {
908
-		case BUTTON_A: // start/stop
909
-			if (stopwatch_screen.running) {
910
-				hal_disable_centisecond_timer();
911
-				stopwatch_screen.running = FALSE;
968
+		case BUTTON_B: // start/stop
969
+			if(stopwatch_screen.item==stopw_startstop) {
970
+				if (stopwatch_screen.running) {
971
+					hal_disable_centisecond_timer();
972
+					stopwatch_screen.running = FALSE;
973
+				} else {
974
+					hal_enable_centisecond_timer();
975
+					stopwatch_screen.running = TRUE;
976
+				}
977
+			} else if(stopwatch_screen.item==stopw_split) {
978
+				if (stopwatch_screen.running) {
979
+					int l;
980
+					if(stopwatch_screen.laps>=MAX_LAPS) {
981
+						mymemmove(stopwatch_screen.lapsdata,stopwatch_screen.lapsdata+1,(MAX_LAPS-1)*sizeof(timerecord));
982
+						l=MAX_LAPS-1;
983
+					} else {
984
+						l=stopwatch_screen.laps;
985
+					}
986
+					stopwatch_screen.laps++;
987
+					mymemcpy(stopwatch_screen.lapsdata+l,&(stopwatch_screen.current),sizeof(timerecord));
988
+				} else {
989
+					hal_enable_centisecond_timer();
990
+					stopwatch_screen.running = TRUE;
991
+				}
992
+#warning TODO: statistics
993
+			} else if(stopwatch_screen.item==stopw_reset) {
994
+				stopwatch_screen.current.hr = 0;
995
+				stopwatch_screen.current.min = 0;
996
+				stopwatch_screen.current.sec = 0;
997
+				stopwatch_screen.current.csec = 0;
998
+				stopwatch_screen.laps=0;
912 999
 			} else {
913
-				hal_enable_centisecond_timer();
914
-				stopwatch_screen.running = TRUE;
1000
+				return EVENT_RET_UNHANDLED;
915 1001
 			}
1002
+			draw_stop_watch_screen(&stopwatch_screen);
916 1003
 			return EVENT_RET_HANDLED;
917 1004
 			break;
918
-		case BUTTON_B: // lapse
919
-			stopwatch_screen.lapse_hr = stopwatch_screen.hr;
920
-			stopwatch_screen.lapse_min = stopwatch_screen.min;
921
-			stopwatch_screen.lapse_sec = stopwatch_screen.sec;
922
-			stopwatch_screen.lapse_csec = stopwatch_screen.csec;
1005
+		case BUTTON_A: 
1006
+			stopwatch_screen.item+=stopw_end-1;
1007
+			stopwatch_screen.item%=stopw_end;
1008
+			draw_stop_watch_screen(&stopwatch_screen);
923 1009
 			return EVENT_RET_HANDLED;
924 1010
 			break;
925
-		case BUTTON_F: // reset
926
-			stopwatch_screen.hr = 0;
927
-			stopwatch_screen.min = 0;
928
-			stopwatch_screen.sec = 0;
929
-			stopwatch_screen.csec = 0;
930
-			stopwatch_screen.lapse_hr = 0;
931
-			stopwatch_screen.lapse_min = 0;
932
-			stopwatch_screen.lapse_sec = 0;
933
-			stopwatch_screen.lapse_csec = 0;
1011
+		case BUTTON_C: 
1012
+			stopwatch_screen.item++;
1013
+			stopwatch_screen.item%=stopw_end;
1014
+			draw_stop_watch_screen(&stopwatch_screen);
934 1015
 			return EVENT_RET_HANDLED;
935 1016
 			break;
936 1017
 		default:
... ...
@@ -958,23 +1039,23 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
958 1039
 			return EVENT_RET_HANDLED;
959 1040
 			break;
960 1041
 		case EVENT_CS_TIMER:
961
-			stopwatch_screen.csec++;
962
-			if (stopwatch_screen.csec > 99) {
963
-				stopwatch_screen.csec = 0;
964
-				stopwatch_screen.sec++;
1042
+			stopwatch_screen.current.csec++;
1043
+			if (stopwatch_screen.current.csec > 99) {
1044
+				stopwatch_screen.current.csec = 0;
1045
+				stopwatch_screen.current.sec++;
965 1046
 			};
966
-			if (stopwatch_screen.sec > 59) {
967
-				stopwatch_screen.sec = 0;
968
-				stopwatch_screen.min++;
1047
+			if (stopwatch_screen.current.sec > 59) {
1048
+				stopwatch_screen.current.sec = 0;
1049
+				stopwatch_screen.current.min++;
969 1050
 			};
970
-			if (stopwatch_screen.min > 59) {
971
-				stopwatch_screen.min = 0;
972
-				stopwatch_screen.hr++;
1051
+			if (stopwatch_screen.current.min > 59) {
1052
+				stopwatch_screen.current.min = 0;
1053
+				stopwatch_screen.current.hr++;
973 1054
 			};
974
-			if (stopwatch_screen.hr > 59) {
975
-				stopwatch_screen.hr = 0;
1055
+			if (stopwatch_screen.current.hr > 59) {
1056
+				stopwatch_screen.current.hr = 0;
976 1057
 			};
977
-			if (stopwatch_screen.csec % 10 == 0)
1058
+			if (stopwatch_screen.current.csec % 10 == 0)
978 1059
 				draw_stop_watch_screen(&stopwatch_screen);
979 1060
 				//update_stop_watch_screen(&stopwatch_screen);
980 1061
 			return EVENT_RET_HANDLED;
... ...
@@ -1096,8 +1177,17 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1096 1177
 	}
1097 1178
 
1098 1179
 	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
1180
+		int i,off,c;
1099 1181
 		bd_addr = hal_bluetooth_get_local_bdaddr();
1100
-		snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
1182
+		for(i=5,off=0;i>=0;i++) {
1183
+			if(i!=5)
1184
+				bstr[off++]=':';
1185
+			c=(bd_addr[i]>>4)&0xf;
1186
+			bstr[off++]=((c<10)?(c+'0'):(c+'a'-10));
1187
+			c=bd_addr[i]&0xf;
1188
+			bstr[off++]=((c<10)?(c+'0'):(c+'a'-10));
1189
+		}
1190
+		bstr[off++]='\0';
1101 1191
 		oswald_write_string(2, 85, FONT_5x7, FALSE, bstr);
1102 1192
 	} else {
1103 1193
 	}
... ...
@@ -1212,13 +1302,10 @@ void draw_info_screen(void)
1212 1302
 
1213 1303
 	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, 1, info_icon_bits);
1214 1304
 
1215
-	w=oswald_getwidth_string(FONT_5x8,OsName);
1216
-	for(x=(96-w-1)/2,ptr=OsName;*ptr!='\0';ptr++) {
1217
-		oswald_draw_font58_scaled(x,29,*ptr,&w,1,0,1,2);
1218
-		x+=w+1;
1219
-	}
1220
-	w=oswald_getwidth_string(FONT_5x8,OSWALD_VERSION);
1221
-	oswald_write_string((96-w-1)/2, 44, FONT_5x8, FALSE, OSWALD_VERSION);
1305
+	w=oswald_getwidth_font58_scaled(OsName,1,2);
1306
+	oswald_writestr_font58_scaled((96-w-1)/2,29,OsName,&w,1,0,1,2);
1307
+	w=oswald_getwidth_font58(OSWALD_VERSION);
1308
+	oswald_writestr_font58((96-w-1)/2, 44, OSWALD_VERSION, &w, 1, 0);
1222 1309
 	oswald_write_string(2, 61, FONT_DROID8x12, FALSE, "HAL");
1223 1310
 	oswald_write_string(35, 61, FONT_DROID8x12, FALSE, (char *)hal_get_version_string());
1224 1311
 	oswald_write_string(2, 73, FONT_DROID8x12, FALSE, "Build");
... ...
@@ -1297,9 +1384,27 @@ message_t Msg[] = {
1297 1384
 	{ MSG_TYPE_END, {0,0,0,0,0}, "Exit" },
1298 1385
 };
1299 1386
 
1387
+static void msginfo2str(message_t *msginfo,char *dstr, int dstrsize)
1388
+{
1389
+	int off=0;
1390
+	dstr[off++]=(msginfo->type == MSG_TYPE_NEW) ? '*':' ';
1391
+	dstr[off++]=' ';
1392
+	off+=num2str(msginfo->td.day,dstr+off,2,2);
1393
+	dstr[off++]='.';
1394
+	off+=num2str(msginfo->td.month,dstr+off,2,2);
1395
+	dstr[off++]='.';
1396
+	off+=num2str(msginfo->td.year+1900,dstr+off,4,4);
1397
+	dstr[off++]=' ';
1398
+	off+=num2str(msginfo->td.hour,dstr+off,2,2);
1399
+	dstr[off++]=':';
1400
+	off+=num2str(msginfo->td.minute,dstr+off,2,2);
1401
+	dstr[off++]='\0';
1402
+}
1403
+
1300 1404
 void draw_message_screen(messages_data_t *sdata)
1301 1405
 {
1302 1406
 	char dstr[32];
1407
+	int off;
1303 1408
 	uint8_t strpos, msglen;
1304 1409
 	uint8_t line;
1305 1410
 
... ...
@@ -1312,7 +1417,12 @@ void draw_message_screen(messages_data_t *sdata)
1312 1417
 	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1313 1418
 
1314 1419
 	Msg[sdata->offset + sdata->pos].type = MSG_TYPE_READ;
1315
-	snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
1420
+	off=0;
1421
+	dstr[off++]='#';
1422
+	off+=num2str(sdata->pos + sdata->offset + 1,dstr+off,1,sizeof(dstr)-2-off);
1423
+	dstr[off++]='/';
1424
+	off+=num2str(Msgs,dstr+off,1,sizeof(dstr)-1-off);
1425
+	dstr[off++]='\0';
1316 1426
 	oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
1317 1427
 	oswald_draw_line(0,7,95,7, 1);
1318 1428
 
... ...
@@ -1330,7 +1440,7 @@ void draw_message_screen(messages_data_t *sdata)
1330 1440
 	oswald_draw_line(0,87,95,87, 1);
1331 1441
 
1332 1442
 	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1333
-		snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
1443
+		msginfo2str(Msg+sdata->pos+sdata->offset,dstr,sizeof(dstr));
1334 1444
 		oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
1335 1445
 	}
1336 1446
 
... ...
@@ -1383,12 +1493,13 @@ void draw_messages_screen(messages_data_t *sdata)
1383 1493
 	hal_lcd_clear_display();
1384 1494
 
1385 1495
 	oswald_draw_bitmap(36, 3, message_icon_width, message_icon_height, 1, message_icon_bits);
1386
-	w=oswald_getwidth_string(FONT_5x8,msg);
1496
+	w=oswald_getwidth_font58(msg);
1387 1497
 	oswald_write_string((96-w-1)/2, 44, FONT_5x8, FALSE, msg);
1388 1498
 
1389 1499
 	hal_lcd_update_display();
1390 1500
 #if 0
1391 1501
 	char dstr[32];
1502
+	int off;
1392 1503
 	int i;
1393 1504
 
1394 1505
 	hal_lcd_clear_display();
... ...
@@ -1400,7 +1511,12 @@ void draw_messages_screen(messages_data_t *sdata)
1400 1511
 	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1401 1512
 
1402 1513
 	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1403
-		snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
1514
+		off=0;
1515
+		dstr[off++]='#';
1516
+		off+=num2str(sdata->pos + sdata->offset + 1,dstr+off,2,2);
1517
+		dstr[off++]='/';
1518
+		off+=num2str(Msgs,dstr+off,2,2);
1519
+		dstr[off++]='\0';
1404 1520
 		oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
1405 1521
 	}
1406 1522
 	oswald_draw_line(0,7,95,7);
... ...
@@ -1424,7 +1540,7 @@ void draw_messages_screen(messages_data_t *sdata)
1424 1540
 	oswald_draw_line(0,87,95,87);
1425 1541
 
1426 1542
 	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1427
-		snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
1543
+		msginfo2str(Msg+sdata->pos+sdata->offset,dstr,sizeof(dstr));
1428 1544
 		oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
1429 1545
 	}
1430 1546
 
Browse code

Fix bt icon, restyle about screen, remove enter hint in alarm fired screen

Dario Rodriguez authored on 10/01/2014 22:59:59
Showing 1 changed files
... ...
@@ -996,8 +996,6 @@ void draw_alarm_screen(void)
996 996
 
997 997
 	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
998 998
 
999
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1000
-
1001 999
 	hal_lcd_update_display();
1002 1000
 }
1003 1001
 
... ...
@@ -1207,18 +1205,26 @@ event_ret_t bluetooth_screen_events(uint16_t event, void *data)
1207 1205
  */
1208 1206
 void draw_info_screen(void)
1209 1207
 {
1208
+	static char OsName[]={"Oswald"};
1209
+	char *ptr;
1210
+	int w,x;
1210 1211
 	hal_lcd_clear_display();
1211 1212
 
1212 1213
 	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, 1, info_icon_bits);
1213 1214
 
1214
-	oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Oswald");
1215
-	oswald_write_string(35, 29, FONT_DROID8x12, FALSE, OSWALD_VERSION);
1216
-	oswald_write_string(2, 41, FONT_DROID8x12, FALSE, "HAL");
1217
-	oswald_write_string(35, 41, FONT_DROID8x12, FALSE, (char *)hal_get_version_string());
1218
-	oswald_write_string(2, 53, FONT_DROID8x12, FALSE, "Build");
1219
-	oswald_write_string(35, 53, FONT_DROID8x12, FALSE, (char *)hal_get_buildno_string());
1220
-	oswald_write_string(2, 65, FONT_DROID8x12, FALSE, "Radio");
1221
-	oswald_write_string(35, 65, FONT_DROID8x12, FALSE, (char *)hal_get_radio_version_string());
1215
+	w=oswald_getwidth_string(FONT_5x8,OsName);
1216
+	for(x=(96-w-1)/2,ptr=OsName;*ptr!='\0';ptr++) {
1217
+		oswald_draw_font58_scaled(x,29,*ptr,&w,1,0,1,2);
1218
+		x+=w+1;
1219
+	}
1220
+	w=oswald_getwidth_string(FONT_5x8,OSWALD_VERSION);
1221
+	oswald_write_string((96-w-1)/2, 44, FONT_5x8, FALSE, OSWALD_VERSION);
1222
+	oswald_write_string(2, 61, FONT_DROID8x12, FALSE, "HAL");
1223
+	oswald_write_string(35, 61, FONT_DROID8x12, FALSE, (char *)hal_get_version_string());
1224
+	oswald_write_string(2, 73, FONT_DROID8x12, FALSE, "Build");
1225
+	oswald_write_string(35, 73, FONT_DROID8x12, FALSE, (char *)hal_get_buildno_string());
1226
+	oswald_write_string(2, 85, FONT_DROID8x12, FALSE, "Radio");
1227
+	oswald_write_string(35, 85, FONT_DROID8x12, FALSE, (char *)hal_get_radio_version_string());
1222 1228
 
1223 1229
 	hal_lcd_update_display();
1224 1230
 }
... ...
@@ -1372,6 +1378,15 @@ event_ret_t message_screen_handle_events(uint16_t event, void *data)
1372 1378
 
1373 1379
 void draw_messages_screen(messages_data_t *sdata)
1374 1380
 {
1381
+	int w;
1382
+	static char msg[]={"(disabled)"};
1383
+	hal_lcd_clear_display();
1384
+
1385
+	oswald_draw_bitmap(36, 3, message_icon_width, message_icon_height, 1, message_icon_bits);
1386
+	w=oswald_getwidth_string(FONT_5x8,msg);
1387
+	oswald_write_string((96-w-1)/2, 44, FONT_5x8, FALSE, msg);
1388
+
1389
+	hal_lcd_update_display();
1375 1390
 #if 0
1376 1391
 	char dstr[32];
1377 1392
 	int i;
Browse code

Enable 4 alarms, fix alarm UI, implement a rough version of the main menu

Dario Rodriguez authored on 08/01/2014 22:59:59
Showing 1 changed files
... ...
@@ -118,6 +118,7 @@ static struct {
118 118
 	void (*screendraw_func)(boolean show_seconds);
119 119
 } clocks[]={
120 120
 		{DrawLcdDigitalClock},
121
+		{DrawLcdDigitalClock2},
121 122
 		{DrawLcdAnaClock},
122 123
 		{DrawCalendarClock},
123 124
 		{DrawHelpClock}
... ...
@@ -129,7 +130,7 @@ event_ret_t idle_handle_user_buttons(watch_button button)
129 130
 	switch (button) {
130 131
 		case BUTTON_A:
131 132
 		case BUTTON_C:
132
-			idle_screen.curclock+=(button==BUTTON_A)?1:((sizeof(clocks)/sizeof(clocks[0]))-1);
133
+			idle_screen.curclock+=(button==BUTTON_C)?1:((sizeof(clocks)/sizeof(clocks[0]))-1);
133 134
 			idle_screen.curclock%=(sizeof(clocks)/sizeof(clocks[0]));
134 135
 			idle_screen.screendraw_func = clocks[idle_screen.curclock].screendraw_func;
135 136
 			break;
... ...
@@ -201,63 +202,43 @@ static main_menu_data_t main_menu_screen = {
201 202
 #define MAIN_MENU_OFFSET_X	6
202 203
 #define MAIN_MENU_OFFSET_Y	8
203 204
 #define oswald_draw_bitmap_i(a,b,c,d,e,f) if(f) oswald_draw_bitmap(a,b,c,d,1,e)
205
+static struct struct_menu_items { 
206
+	int screen_num;
207
+	char *name;
208
+	unsigned char *bits;
209
+	int width;
210
+	int height;
211
+} menu_items[] = {
212
+	{ALARM_SETUP_SCREEN,"Alarms",alarm_icon_bits,alarm_icon_width,alarm_icon_height},
213
+	{STOP_WATCH_SCREEN,"Stopwatch",stopwatch_icon_bits,stopwatch_icon_width,stopwatch_icon_height},
214
+	{BLUETOOTH_SCREEN,"Bluetooth",bluetooth_icon_bits,bluetooth_icon_width,bluetooth_icon_height},
215
+	{ACCEL_DISPLAY_SCREEN,"Accel.",acc_icon_bits,acc_icon_width,acc_icon_height},
216
+	{MESSAGES_SCREEN,"Messages",message_icon_bits,message_icon_width,message_icon_height},
217
+	{INFO_SCREEN,"About",info_icon_bits,info_icon_width,info_icon_height},
218
+	{LAST_SCREEN,"Close menu",exit_icon_bits,exit_icon_width,exit_icon_height}
219
+};
204 220
 void draw_main_menu_screen(main_menu_data_t *sdata)
205 221
 {
206
-	uint8_t pf = sdata->pos - 2;
207
-
222
+	int x,y;
223
+	int i,l;
224
+	int w;
225
+	char *t;
208 226
 	hal_lcd_clear_display();
209
-
210
-//	oswald_draw_bitmap(36, 0, main_menu_icon_width, main_menu_icon_height, 1, main_menu_icon_bits);
211
-
212
-	oswald_draw_bitmap(81, 6, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
213
-	oswald_draw_bitmap(81, 70, leftbutton_icon_width, leftbutton_icon_height, 1, leftbutton_icon_bits);
214
-	oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
215
-
216
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
217
-		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
218
-		alarm_icon_width, alarm_icon_height, alarm_icon_bits, (sdata->pos == ALARM_SETUP_SCREEN));
219
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
220
-		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
221
-		stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits, (sdata->pos == STOP_WATCH_SCREEN));
222
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
223
-		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
224
-		bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
225
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
226
-		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
227
-		acc_icon_width, acc_icon_height, acc_icon_bits, (sdata->pos == ACCEL_DISPLAY_SCREEN));
228
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
229
-		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
230
-		message_icon_width, message_icon_height, message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
231
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
232
-		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
233
-		info_icon_width, info_icon_height, info_icon_bits, (sdata->pos == INFO_SCREEN));
234
-	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
235
-		MAIN_MENU_OFFSET_Y+(2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
236
-		exit_icon_width, exit_icon_height, exit_icon_bits, (sdata->pos == LAST_SCREEN));
237
-
238
-	// round the corners of the inverted icon a little
239
-	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
240
-		MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
241
-	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
242
-		MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
243
-	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
244
-		MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
245
-	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
246
-		MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
247
-
248
-
249
-	// finally a nice border
250
-	oswald_draw_line(3, 0, 95, 0, 1);
251
-	oswald_draw_line(2, 1, 95, 1, 1);
252
-	oswald_draw_line(1, 2, 95, 2, 1);
253
-
254
-	oswald_draw_line(0, 3, 0, 92, 1);
255
-	oswald_draw_line(1, 3, 1, 93, 1);
256
-	oswald_draw_line(2, 3, 2, 94, 1);
257
-
258
-	oswald_draw_line(1, 93, 95, 93, 1);
259
-	oswald_draw_line(2, 94, 95, 94, 1);
260
-	oswald_draw_line(3, 95, 95, 95, 1);
227
+	i=sdata->pos-2;
228
+	i=(i<0)?0:i;
229
+	if(i>(sizeof(menu_items)/sizeof(menu_items[0]))-3) {
230
+		i=(sizeof(menu_items)/sizeof(menu_items[0]))-3;
231
+	}
232
+	for(l=i+3,y=5;i<(sizeof(menu_items)/sizeof(menu_items[0])) && i<l;i++,y+=32) {
233
+		x=15;
234
+		if(i==sdata->pos)
235
+			oswald_draw_rect(0,y-5,95,y+32-5,1);
236
+		oswald_draw_bitmap(x,y,menu_items[i].width,menu_items[i].height,(i==sdata->pos)?0:1,menu_items[i].bits);
237
+		for(t=menu_items[i].name;*t!='\0';t++,x+=w+1) {
238
+			oswald_draw_font58_scaled(x+30, y+6,*t,&w,(i==sdata->pos)?0:1,(i==sdata->pos)?1:0,1,2);
239
+		}
240
+	}
241
+	
261 242
 
262 243
 	hal_lcd_update_display();
263 244
 }
... ...
@@ -265,23 +246,23 @@ void draw_main_menu_screen(main_menu_data_t *sdata)
265 246
 event_ret_t handle_main_menu_buttons(watch_button button, main_menu_data_t *sdata)
266 247
 {
267 248
 	switch (button) {
268
-		case BUTTON_A:
249
+		case BUTTON_C:
269 250
 			sdata->pos++;
270
-			if (sdata->pos > LAST_SCREEN)
271
-				sdata->pos = 2;
251
+			if (sdata->pos >= (sizeof(menu_items)/sizeof(menu_items[0])))
252
+				sdata->pos = 0;
272 253
 			draw_main_menu_screen(&main_menu_screen);
273 254
 			return EVENT_RET_HANDLED;
274 255
 			break;
275
-		case BUTTON_C:
256
+		case BUTTON_A:
276 257
 			sdata->pos--;
277
-			if (sdata->pos < 2)
278
-				sdata->pos = LAST_SCREEN;
258
+			if (sdata->pos < 0)
259
+				sdata->pos = (sizeof(menu_items)/sizeof(menu_items[0]))-1;
279 260
 			draw_main_menu_screen(&main_menu_screen);
280 261
 			return EVENT_RET_HANDLED;
281 262
 			break;
282 263
 		case BUTTON_B:
283
-			if (sdata->pos < LAST_SCREEN) {
284
-				OswaldState.screen_id = sdata->pos;
264
+			if (menu_items[sdata->pos].screen_num!=LAST_SCREEN) {
265
+				OswaldState.screen_id = menu_items[sdata->pos].screen_num;
285 266
 				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
286 267
 				OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
287 268
 			} else {
... ...
@@ -306,7 +287,7 @@ event_ret_t main_menu_handle_events(uint16_t event, void *data)
306 287
 	switch (event) {
307 288
 		case EVENT_SCREEN_VISIBLE:
308 289
 			main_menu_screen.tmo = 0;
309
-			main_menu_screen.pos = 2;
290
+			main_menu_screen.pos = 0;
310 291
 			draw_main_menu_screen(&main_menu_screen);
311 292
 			return EVENT_RET_HANDLED;
312 293
 			break;
... ...
@@ -427,24 +408,24 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
427 408
 	int w,sx=2,sy=3;
428 409
 	hal_lcd_clear_display();
429 410
 
430
-	oswald_draw_grid(0,0,95,95,100,100);
431
-	oswald_draw_bitmap(36, 2, timesetup_icon_width, timesetup_icon_height, 1, timesetup_icon_bits);
411
+	oswald_draw_grid(1,1,94,94,100,100);
412
+	oswald_draw_bitmap(36, 4, timesetup_icon_width, timesetup_icon_height, 1, timesetup_icon_bits);
432 413
 
433 414
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
434 415
 		if(OswaldClk.hour>=10)
435
-			oswald_draw_font58_scaled(12, 32, (OswaldClk.hour / 10)+'0',&w,1,0,sx,sy);
436
-		oswald_draw_font58_scaled(25, 32, (OswaldClk.hour % 10)+'0',&w,1,0,sx,sy);
416
+			oswald_draw_font58_scaled(12, 34, (OswaldClk.hour / 10)+'0',&w,1,0,sx,sy);
417
+		oswald_draw_font58_scaled(25, 34, (OswaldClk.hour % 10)+'0',&w,1,0,sx,sy);
437 418
 	}
438
-	oswald_draw_font58_scaled(37, 36, ':',&w,1,0,1,2);
419
+	oswald_draw_font58_scaled(37, 38, ':',&w,1,0,1,2);
439 420
 
440 421
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
441
-		oswald_draw_font58_scaled(44, 32, (OswaldClk.minute / 10)+'0',&w,1,0,sx,sy);
442
-		oswald_draw_font58_scaled(57, 32, (OswaldClk.minute % 10)+'0',&w,1,0,sx,sy);
422
+		oswald_draw_font58_scaled(44, 34, (OswaldClk.minute / 10)+'0',&w,1,0,sx,sy);
423
+		oswald_draw_font58_scaled(57, 34, (OswaldClk.minute % 10)+'0',&w,1,0,sx,sy);
443 424
 	}
444 425
 
445 426
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
446
-		oswald_draw_font58_scaled(71, 38, (OswaldClk.second / 10)+'0',&w,1,0,sx-1,sy-1);
447
-		oswald_draw_font58_scaled(79, 38, (OswaldClk.second % 10)+'0',&w,1,0,sx-1,sy-1);
427
+		oswald_draw_font58_scaled(71, 40, (OswaldClk.second / 10)+'0',&w,1,0,sx-1,sy-1);
428
+		oswald_draw_font58_scaled(79, 40, (OswaldClk.second % 10)+'0',&w,1,0,sx-1,sy-1);
448 429
 	}
449 430
 
450 431
 
... ...
@@ -615,11 +596,13 @@ event_ret_t datetime_setup_events(uint16_t event, void *data)
615 596
  * Alarm setup screen
616 597
  */
617 598
 typedef struct {
618
-	uint8_t pos;
599
+	int num;
600
+	int pos;
619 601
 	boolean set_mode;
620 602
 	boolean on;
621 603
 } alarm_setup_data_t;
622 604
 static alarm_setup_data_t alarm_setup_screen = {
605
+	0,
623 606
 	0,
624 607
 	FALSE,
625 608
 	TRUE
... ...
@@ -627,131 +610,81 @@ static alarm_setup_data_t alarm_setup_screen = {
627 610
 
628 611
 void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
629 612
 {
613
+	static char initials[]={"SMTWTFS"};
614
+	int w,i;
630 615
 	hal_lcd_clear_display();
616
+	if (sdata->set_mode) 
617
+		oswald_draw_grid(1,1,94,94,100,100);
631 618
 
632
-	oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
633
-
634
-	if (sdata->set_mode) {
635
-		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, 1, upbutton_icon_bits);
636
-		oswald_draw_bitmap(81, 38, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
637
-		oswald_draw_bitmap(81, 70, downbutton_icon_width, downbutton_icon_height, 1, downbutton_icon_bits);
638
-	} else {
639
-		oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
640
-	}
619
+	oswald_draw_bitmap(36, 3, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
620
+	oswald_draw_rect(43,8,52,20,0);
621
+	oswald_draw_font58_scaled(44,9,sdata->num+'1',&w,1,0,2,2);
641 622
 
642 623
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
643
-		oswald_write_character(18, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour / 10)+'0');
644
-		oswald_write_character(32, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour % 10)+'0');
624
+		oswald_draw_font58_scaled(18, 34, (OswaldAlarm[sdata->num].hour / 10)+'0',&w,1,0,2,3);
625
+		oswald_draw_font58_scaled(31, 34, (OswaldAlarm[sdata->num].hour % 10)+'0',&w,1,0,2,3);
645 626
 	}
646
-	oswald_write_character(42, 30, FONT_LCD13x21, FALSE, ':');
627
+	oswald_draw_font58_scaled(43, 38, ':',&w,1,0,1,2);
647 628
 
648 629
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
649
-		oswald_write_character(53, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute / 10)+'0');
650
-		oswald_write_character(67, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute % 10)+'0');
630
+		oswald_draw_font58_scaled(50, 34, (OswaldAlarm[sdata->num].minute / 10)+'0',&w,1,0,2,3);
631
+		oswald_draw_font58_scaled(63, 34, (OswaldAlarm[sdata->num].minute % 10)+'0',&w,1,0,2,3);
651 632
 	}
652 633
 
653
-	oswald_write_character(3, 55, FONT_6x9, FALSE, 'S');
654
-	oswald_write_character(15, 55, FONT_6x9, FALSE, 'M');
655
-	oswald_write_character(27, 55, FONT_6x9, FALSE, 'T');
656
-	oswald_write_character(39, 55, FONT_6x9, FALSE, 'W');
657
-	oswald_write_character(51, 55, FONT_6x9, FALSE, 'T');
658
-	oswald_write_character(63, 55, FONT_6x9, FALSE, 'F');
659
-	oswald_write_character(75, 55, FONT_6x9, FALSE, 'S');
660
-
661
-	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
662
-		// oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
663
-		if ((OswaldAlarm.wday & WDAY_SUNDAY))
664
-			oswald_draw_bitmap(3, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
665
-		else
666
-			oswald_draw_bitmap(3, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
667
-	}
668
-	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
669
-		// oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
670
-		if ((OswaldAlarm.wday & WDAY_MONDAY))
671
-			oswald_draw_bitmap(15, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
672
-		else
673
-			oswald_draw_bitmap(15, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
674
-	}
675
-	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
676
-		// oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
677
-		if ((OswaldAlarm.wday & WDAY_TUESDAY))
678
-			oswald_draw_bitmap(27, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
679
-		else
680
-			oswald_draw_bitmap(27, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
681
-	}
682
-	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
683
-		// oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
684
-		if ((OswaldAlarm.wday & WDAY_WEDNESDAY))
685
-			oswald_draw_bitmap(39, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
686
-		else
687
-			oswald_draw_bitmap(39, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
688
-	}
689
-	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
690
-		// oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
691
-		if ((OswaldAlarm.wday & WDAY_THURSDAY))
692
-			oswald_draw_bitmap(51, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
693
-		else
694
-			oswald_draw_bitmap(51, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
695
-	}
696
-	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
697
-		// oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
698
-		if ((OswaldAlarm.wday & WDAY_FRIDAY))
699
-			oswald_draw_bitmap(63, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
700
-		else
701
-			oswald_draw_bitmap(63, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
702
-	}
703
-	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8) {
704
-		// oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
705
-		if ((OswaldAlarm.wday & WDAY_SATURDAY))
706
-			oswald_draw_bitmap(75, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
707
-		else
708
-			oswald_draw_bitmap(75, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
634
+	for(i=0;i<7;i++) {
635
+		oswald_write_character(8+i*12, 65, FONT_6x9, FALSE, initials[i]);
636
+		if ((sdata->pos == (i+2) && sdata->on) || sdata->pos != (i+2)) {
637
+			if ((OswaldAlarm[sdata->num].wday & (1<<i)))
638
+				oswald_draw_bitmap(7+i*12, 76, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
639
+			else
640
+				oswald_draw_bitmap(7+i*12, 76, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
641
+		}
709 642
 	}
710 643
 
711 644
 	hal_lcd_update_display();
712 645
 }
713 646
 
714
-void alarm_handle_updown(uint8_t pos, int8_t incr)
647
+void alarm_handle_updown(int num, int pos, int incr)
715 648
 {
716 649
 	switch (pos) {
717 650
 		case 0: // hour
718
-			if (OswaldAlarm.hour == 0 && incr == -1) {
719
-				OswaldAlarm.hour = 23;
651
+			if (OswaldAlarm[num].hour == 0 && incr == -1) {
652
+				OswaldAlarm[num].hour = 23;
720 653
 				break;
721 654
 			};
722
-			OswaldAlarm.hour += incr;
723
-			if (OswaldAlarm.hour > 23)
724
-				OswaldAlarm.hour = 0;
655
+			OswaldAlarm[num].hour += incr;
656
+			if (OswaldAlarm[num].hour > 23)
657
+				OswaldAlarm[num].hour = 0;
725 658
 			break;
726 659
 		case 1: // minute
727
-			if (OswaldAlarm.minute == 0 && incr == -1) {
728
-				OswaldAlarm.minute = 59;
660
+			if (OswaldAlarm[num].minute == 0 && incr == -1) {
661
+				OswaldAlarm[num].minute = 59;
729 662
 				break;
730 663
 			};
731
-			OswaldAlarm.minute += incr;
732
-			if (OswaldAlarm.minute > 59)
733
-				OswaldAlarm.minute = 0;
664
+			OswaldAlarm[num].minute += incr;
665
+			if (OswaldAlarm[num].minute > 59)
666
+				OswaldAlarm[num].minute = 0;
734 667
 			break;
735 668
 		case 2: // sunday
736
-			OswaldAlarm.wday ^= WDAY_SUNDAY;
669
+			OswaldAlarm[num].wday ^= WDAY_SUNDAY;
737 670
 			break;
738 671
 		case 3: // monday
739
-			OswaldAlarm.wday ^= WDAY_MONDAY;
672
+			OswaldAlarm[num].wday ^= WDAY_MONDAY;
740 673
 			break;
741 674
 		case 4: // tuesday
742
-			OswaldAlarm.wday ^= WDAY_TUESDAY;
675
+			OswaldAlarm[num].wday ^= WDAY_TUESDAY;
743 676
 			break;
744 677
 		case 5: // wednesday
745
-			OswaldAlarm.wday ^= WDAY_WEDNESDAY;
678
+			OswaldAlarm[num].wday ^= WDAY_WEDNESDAY;
746 679
 			break;
747 680
 		case 6: // thursday
748
-			OswaldAlarm.wday ^= WDAY_THURSDAY;
681
+			OswaldAlarm[num].wday ^= WDAY_THURSDAY;
749 682
 			break;
750 683
 		case 7: // friday
751
-			OswaldAlarm.wday ^= WDAY_FRIDAY;
684
+			OswaldAlarm[num].wday ^= WDAY_FRIDAY;
752 685
 			break;
753 686
 		case 8: // saturday
754
-			OswaldAlarm.wday ^= WDAY_SATURDAY;
687
+			OswaldAlarm[num].wday ^= WDAY_SATURDAY;
755 688
 			break;
756 689
 		default:
757 690
 			break;
... ...
@@ -763,10 +696,14 @@ event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *
763 696
 	if (alarm_setup_screen.set_mode) {
764 697
 		switch (button) {
765 698
 			case BUTTON_A:
766
-				alarm_handle_updown(sdata->pos, 1);
699
+				alarm_handle_updown(sdata->num, sdata->pos, 1);
767 700
 				break;
768 701
 			case BUTTON_C:
769
-				alarm_handle_updown(sdata->pos, -1);
702
+				alarm_handle_updown(sdata->num, sdata->pos, -1);
703
+				break;
704
+			case BUTTON_E:
705
+				sdata->pos+=9-1;
706
+				sdata->pos %= 9;
770 707
 				break;
771 708
 			case BUTTON_B:
772 709
 				sdata->pos++;
... ...
@@ -781,6 +718,14 @@ event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *
781 718
 		}
782 719
 	} else {
783 720
 		switch (button) {
721
+			case BUTTON_A:
722
+				sdata->num+=MAX_ALARM+((button==BUTTON_A)?-1:1);
723
+				sdata->num%=MAX_ALARM;
724
+				break;
725
+			case BUTTON_C:
726
+				sdata->num+=MAX_ALARM+((button==BUTTON_A)?-1:1);
727
+				sdata->num%=MAX_ALARM;
728
+				break;
784 729
 			case BUTTON_F:
785 730
 				alarm_setup_screen.set_mode = TRUE;
786 731
 				break;
... ...
@@ -798,6 +743,7 @@ event_ret_t alarm_setup_events(uint16_t event, void *data)
798 743
 {
799 744
 	switch (event) {
800 745
 		case EVENT_SCREEN_VISIBLE:
746
+			alarm_setup_screen.num = 0;
801 747
 			alarm_setup_screen.pos = 0;
802 748
 			alarm_setup_screen.on = TRUE;
803 749
 			alarm_setup_screen.set_mode = FALSE;
... ...
@@ -1265,8 +1211,6 @@ void draw_info_screen(void)
1265 1211
 
1266 1212
 	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, 1, info_icon_bits);
1267 1213
 
1268
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1269
-
1270 1214
 	oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Oswald");
1271 1215
 	oswald_write_string(35, 29, FONT_DROID8x12, FALSE, OSWALD_VERSION);
1272 1216
 	oswald_write_string(2, 41, FONT_DROID8x12, FALSE, "HAL");
Browse code

Fix fg/bg issues in graphics library, invert analog clock, improve help clock, make date&time setup screen nicer, continue adaptations to conform to the new button layout

Dario Rodriguez authored on 18/12/2013 22:59:59
Showing 1 changed files
... ...
@@ -110,15 +110,16 @@ typedef struct {
110 110
 	int curclock;
111 111
 } idle_data_t;
112 112
 static idle_data_t idle_screen = {
113
-	DrawCalendarClock,
113
+	DrawLcdDigitalClock,
114 114
 	TRUE,
115 115
 	0,
116 116
 };
117 117
 static struct {
118 118
 	void (*screendraw_func)(boolean show_seconds);
119
-} clocks[]={{DrawCalendarClock},
120
-		{DrawLcdAnaClock},
119
+} clocks[]={
121 120
 		{DrawLcdDigitalClock},
121
+		{DrawLcdAnaClock},
122
+		{DrawCalendarClock},
122 123
 		{DrawHelpClock}
123 124
 };
124 125
 
... ...
@@ -199,38 +200,38 @@ static main_menu_data_t main_menu_screen = {
199 200
 #define MAIN_MENU_GRID_SPACING	0
200 201
 #define MAIN_MENU_OFFSET_X	6
201 202
 #define MAIN_MENU_OFFSET_Y	8
202
-
203
+#define oswald_draw_bitmap_i(a,b,c,d,e,f) if(f) oswald_draw_bitmap(a,b,c,d,1,e)
203 204
 void draw_main_menu_screen(main_menu_data_t *sdata)
204 205
 {
205 206
 	uint8_t pf = sdata->pos - 2;
206 207
 
207 208
 	hal_lcd_clear_display();
208 209
 
209
-//	oswald_draw_bitmap(36, 0, main_menu_icon_width, main_menu_icon_height, main_menu_icon_bits);
210
+//	oswald_draw_bitmap(36, 0, main_menu_icon_width, main_menu_icon_height, 1, main_menu_icon_bits);
210 211
 
211
-	oswald_draw_bitmap(81, 6, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
212
-	oswald_draw_bitmap(81, 38, leftbutton_icon_width, leftbutton_icon_height, leftbutton_icon_bits);
213
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
212
+	oswald_draw_bitmap(81, 6, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
213
+	oswald_draw_bitmap(81, 70, leftbutton_icon_width, leftbutton_icon_height, 1, leftbutton_icon_bits);
214
+	oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
214 215
 
215
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
216
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
216 217
 		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
217 218
 		alarm_icon_width, alarm_icon_height, alarm_icon_bits, (sdata->pos == ALARM_SETUP_SCREEN));
218
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
219
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
219 220
 		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
220 221
 		stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits, (sdata->pos == STOP_WATCH_SCREEN));
221
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
222
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
222 223
 		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
223 224
 		bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
224
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
225
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
225 226
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
226 227
 		acc_icon_width, acc_icon_height, acc_icon_bits, (sdata->pos == ACCEL_DISPLAY_SCREEN));
227
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
228
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
228 229
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
229 230
 		message_icon_width, message_icon_height, message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
230
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
231
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
231 232
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
232 233
 		info_icon_width, info_icon_height, info_icon_bits, (sdata->pos == INFO_SCREEN));
233
-	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
234
+	oswald_draw_bitmap_i(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
234 235
 		MAIN_MENU_OFFSET_Y+(2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
235 236
 		exit_icon_width, exit_icon_height, exit_icon_bits, (sdata->pos == LAST_SCREEN));
236 237
 
... ...
@@ -246,17 +247,17 @@ void draw_main_menu_screen(main_menu_data_t *sdata)
246 247
 
247 248
 
248 249
 	// finally a nice border
249
-	oswald_draw_line(3, 0, 95, 0);
250
-	oswald_draw_line(2, 1, 95, 1);
251
-	oswald_draw_line(1, 2, 95, 2);
250
+	oswald_draw_line(3, 0, 95, 0, 1);
251
+	oswald_draw_line(2, 1, 95, 1, 1);
252
+	oswald_draw_line(1, 2, 95, 2, 1);
252 253
 
253
-	oswald_draw_line(0, 3, 0, 92);
254
-	oswald_draw_line(1, 3, 1, 93);
255
-	oswald_draw_line(2, 3, 2, 94);
254
+	oswald_draw_line(0, 3, 0, 92, 1);
255
+	oswald_draw_line(1, 3, 1, 93, 1);
256
+	oswald_draw_line(2, 3, 2, 94, 1);
256 257
 
257
-	oswald_draw_line(1, 93, 95, 93);
258
-	oswald_draw_line(2, 94, 95, 94);
259
-	oswald_draw_line(3, 95, 95, 95);
258
+	oswald_draw_line(1, 93, 95, 93, 1);
259
+	oswald_draw_line(2, 94, 95, 94, 1);
260
+	oswald_draw_line(3, 95, 95, 95, 1);
260 261
 
261 262
 	hal_lcd_update_display();
262 263
 }
... ...
@@ -271,14 +272,14 @@ event_ret_t handle_main_menu_buttons(watch_button button, main_menu_data_t *sdat
271 272
 			draw_main_menu_screen(&main_menu_screen);
272 273
 			return EVENT_RET_HANDLED;
273 274
 			break;
274
-		case BUTTON_B:
275
+		case BUTTON_C:
275 276
 			sdata->pos--;
276 277
 			if (sdata->pos < 2)
277 278
 				sdata->pos = LAST_SCREEN;
278 279
 			draw_main_menu_screen(&main_menu_screen);
279 280
 			return EVENT_RET_HANDLED;
280 281
 			break;
281
-		case BUTTON_C:
282
+		case BUTTON_B:
282 283
 			if (sdata->pos < LAST_SCREEN) {
283 284
 				OswaldState.screen_id = sdata->pos;
284 285
 				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
... ...
@@ -345,9 +346,9 @@ void draw_accel_screen(accel_data_t *accel_data)
345 346
 
346 347
 	hal_lcd_clear_display();
347 348
 
348
-	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
349
+	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, 1, acc_icon_bits);
349 350
 
350
-	oswald_draw_bitmap(81, 79, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
351
+	oswald_draw_bitmap(81, 79, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
351 352
 
352 353
 	oswald_write_string(1, 40, FONT_6x9, FALSE, "X:");
353 354
 	oswald_write_number(15, 40, FONT_6x9, FALSE, accel_data->x);
... ...
@@ -359,10 +360,10 @@ void draw_accel_screen(accel_data_t *accel_data)
359 360
 	oswald_write_string(1, 85, FONT_6x9, FALSE, "Light:");
360 361
 	oswald_write_number(50, 85, FONT_6x9, FALSE, 0);
361 362
 
362
-	oswald_draw_line(40, 30, 92, 30);
363
-	oswald_draw_line(92, 30, 92, 82);
364
-	oswald_draw_line(40, 82, 92, 82);
365
-	oswald_draw_line(40, 82, 40, 30);
363
+	oswald_draw_line(40, 30, 92, 30, 1);
364
+	oswald_draw_line(92, 30, 92, 82, 1);
365
+	oswald_draw_line(40, 82, 92, 82, 1);
366
+	oswald_draw_line(40, 82, 40, 30, 1);
366 367
 
367 368
 	x = 41+25+((accel_data->x * 50) / (254));
368 369
 	y = 31+25-((accel_data->y * 50) / (254));
... ...
@@ -426,59 +427,56 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
426 427
 	int w,sx=2,sy=3;
427 428
 	hal_lcd_clear_display();
428 429
 
429
-	oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
430
-
431
-	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
432
-	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
433
-	oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
430
+	oswald_draw_grid(0,0,95,95,100,100);
431
+	oswald_draw_bitmap(36, 2, timesetup_icon_width, timesetup_icon_height, 1, timesetup_icon_bits);
434 432
 
435 433
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
436 434
 		if(OswaldClk.hour>=10)
437
-			oswald_draw_font58_scaled(2, 30, (OswaldClk.hour / 10)+'0',&w,1,0,sx,sy);
438
-		oswald_draw_font58_scaled(15, 30, (OswaldClk.hour % 10)+'0',&w,1,0,sx,sy);
435
+			oswald_draw_font58_scaled(12, 32, (OswaldClk.hour / 10)+'0',&w,1,0,sx,sy);
436
+		oswald_draw_font58_scaled(25, 32, (OswaldClk.hour % 10)+'0',&w,1,0,sx,sy);
439 437
 	}
440
-	oswald_draw_font58_scaled(27, 34, ':',&w,1,0,1,2);
438
+	oswald_draw_font58_scaled(37, 36, ':',&w,1,0,1,2);
441 439
 
442 440
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
443
-		oswald_draw_font58_scaled(34, 30, (OswaldClk.minute / 10)+'0',&w,1,0,sx,sy);
444
-		oswald_draw_font58_scaled(47, 30, (OswaldClk.minute % 10)+'0',&w,1,0,sx,sy);
441
+		oswald_draw_font58_scaled(44, 32, (OswaldClk.minute / 10)+'0',&w,1,0,sx,sy);
442
+		oswald_draw_font58_scaled(57, 32, (OswaldClk.minute % 10)+'0',&w,1,0,sx,sy);
445 443
 	}
446 444
 
447 445
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
448
-		oswald_draw_font58_scaled(61, 36, (OswaldClk.second / 10)+'0',&w,1,0,sx-1,sy-1);
449
-		oswald_draw_font58_scaled(69, 36, (OswaldClk.second % 10)+'0',&w,1,0,sx-1,sy-1);
446
+		oswald_draw_font58_scaled(71, 38, (OswaldClk.second / 10)+'0',&w,1,0,sx-1,sy-1);
447
+		oswald_draw_font58_scaled(79, 38, (OswaldClk.second % 10)+'0',&w,1,0,sx-1,sy-1);
450 448
 	}
451 449
 
452 450
 
453 451
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
454
-		oswald_write_number(2, 55, FONT_DROID8x12, FALSE, OswaldClk.day);
452
+		oswald_write_number(18, 57, FONT_5x8, FALSE, OswaldClk.day);
455 453
 	}
456
-	oswald_write_character(15, 55, FONT_DROID8x12, FALSE, '.');
454
+	oswald_write_character(31, 57, FONT_5x8, FALSE, '.');
457 455
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
458
-		oswald_write_number(21, 55, FONT_DROID8x12, FALSE, OswaldClk.month);
456
+		oswald_write_number(37, 57, FONT_5x8, FALSE, OswaldClk.month);
459 457
 	}
460
-	oswald_write_character(36, 55, FONT_DROID8x12, FALSE, '.');
458
+	oswald_write_character(51, 57, FONT_5x8, FALSE, '.');
461 459
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
462
-		oswald_write_number(43, 55, FONT_DROID8x12, FALSE, OswaldClk.year);
460
+		oswald_write_number(59, 57, FONT_5x8, FALSE, OswaldClk.year);
463 461
 	}
464 462
 
465 463
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
466 464
 		if (OswaldClk.clk24hr) {
467
-			oswald_draw_bitmap(2, 73, checked_icon_width, checked_icon_height, checked_icon_bits);
465
+			oswald_draw_bitmap(12, 73, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
468 466
 		} else {
469
-			oswald_draw_bitmap(2, 73, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
467
+			oswald_draw_bitmap(12, 73, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
470 468
 		}
471 469
 	}
472
-	oswald_write_string(15, 73, FONT_DROID8x12, FALSE, "24hr");
470
+	oswald_write_string(25, 73, FONT_5x8, FALSE, "24hr");
473 471
 
474 472
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
475 473
 		if (OswaldClk.day_first) {
476
-			oswald_draw_bitmap(2, 83, checked_icon_width, checked_icon_height, checked_icon_bits);
474
+			oswald_draw_bitmap(12, 83, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
477 475
 		} else {
478
-			oswald_draw_bitmap(2, 83, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
476
+			oswald_draw_bitmap(12, 83, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
479 477
 		}
480 478
 	}
481
-	oswald_write_string(15, 83, FONT_DROID8x12, FALSE, "dd.mm.  mm/dd");
479
+	oswald_write_string(25, 83, FONT_5x8, FALSE, "dd.mm.  mm/dd");
482 480
 
483 481
 	hal_lcd_update_display();
484 482
 }
... ...
@@ -555,13 +553,16 @@ event_ret_t handle_setup_datetime_buttons(watch_button button, datetime_setup_da
555 553
 		case BUTTON_A:
556 554
 			datetime_handle_updown(sdata->pos, 1);
557 555
 			break;
558
-		case BUTTON_B:
556
+		case BUTTON_C:
559 557
 			datetime_handle_updown(sdata->pos, -1);
560 558
 			break;
561
-		case BUTTON_C:
559
+		case BUTTON_B:
562 560
 			sdata->pos++;
563 561
 			sdata->pos %= 8;
564 562
 			break;
563
+		case BUTTON_E:
564
+			sdata->pos=(sdata->pos+8-1)%8;
565
+			break;
565 566
 		case BUTTON_F:
566 567
 			OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
567 568
 			OswaldState.screen_id = IDLE_SCREEN;
... ...
@@ -628,14 +629,14 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
628 629
 {
629 630
 	hal_lcd_clear_display();
630 631
 
631
-	oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
632
+	oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
632 633
 
633 634
 	if (sdata->set_mode) {
634
-		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
635
-		oswald_draw_bitmap(81, 38, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
636
-		oswald_draw_bitmap(81, 70, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
635
+		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, 1, upbutton_icon_bits);
636
+		oswald_draw_bitmap(81, 38, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
637
+		oswald_draw_bitmap(81, 70, downbutton_icon_width, downbutton_icon_height, 1, downbutton_icon_bits);
637 638
 	} else {
638
-		oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
639
+		oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
639 640
 	}
640 641
 
641 642
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
... ...
@@ -660,51 +661,51 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
660 661
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
661 662
 		// oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
662 663
 		if ((OswaldAlarm.wday & WDAY_SUNDAY))
663
-			oswald_draw_bitmap(3, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
664
+			oswald_draw_bitmap(3, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
664 665
 		else
665
-			oswald_draw_bitmap(3, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
666
+			oswald_draw_bitmap(3, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
666 667
 	}
667 668
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
668 669
 		// oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
669 670
 		if ((OswaldAlarm.wday & WDAY_MONDAY))
670
-			oswald_draw_bitmap(15, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
671
+			oswald_draw_bitmap(15, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
671 672
 		else
672
-			oswald_draw_bitmap(15, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
673
+			oswald_draw_bitmap(15, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
673 674
 	}
674 675
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
675 676
 		// oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
676 677
 		if ((OswaldAlarm.wday & WDAY_TUESDAY))
677
-			oswald_draw_bitmap(27, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
678
+			oswald_draw_bitmap(27, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
678 679
 		else
679
-			oswald_draw_bitmap(27, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
680
+			oswald_draw_bitmap(27, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
680 681
 	}
681 682
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
682 683
 		// oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
683 684
 		if ((OswaldAlarm.wday & WDAY_WEDNESDAY))
684
-			oswald_draw_bitmap(39, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
685
+			oswald_draw_bitmap(39, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
685 686
 		else
686
-			oswald_draw_bitmap(39, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
687
+			oswald_draw_bitmap(39, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
687 688
 	}
688 689
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
689 690
 		// oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
690 691
 		if ((OswaldAlarm.wday & WDAY_THURSDAY))
691
-			oswald_draw_bitmap(51, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
692
+			oswald_draw_bitmap(51, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
692 693
 		else
693
-			oswald_draw_bitmap(51, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
694
+			oswald_draw_bitmap(51, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
694 695
 	}
695 696
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
696 697
 		// oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
697 698
 		if ((OswaldAlarm.wday & WDAY_FRIDAY))
698
-			oswald_draw_bitmap(63, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
699
+			oswald_draw_bitmap(63, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
699 700
 		else
700
-			oswald_draw_bitmap(63, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
701
+			oswald_draw_bitmap(63, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
701 702
 	}
702 703
 	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8) {
703 704
 		// oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
704 705
 		if ((OswaldAlarm.wday & WDAY_SATURDAY))
705
-			oswald_draw_bitmap(75, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
706
+			oswald_draw_bitmap(75, 66, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
706 707
 		else
707
-			oswald_draw_bitmap(75, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
708
+			oswald_draw_bitmap(75, 66, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
708 709
 	}
709 710
 
710 711
 	hal_lcd_update_display();
... ...
@@ -929,11 +930,11 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
929 930
 
930 931
 	hal_lcd_clear_display();
931 932
 
932
-	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
933
+	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, 1, stopwatch_icon_bits);
933 934
 
934
-	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
935
-	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
936
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
935
+	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, 1, startstopbutton_icon_bits);
936
+	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, 1, lapsebutton_icon_bits);
937
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
937 938
 
938 939
 	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10)+'0');
939 940
 	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10)+'0');
... ...
@@ -1047,9 +1048,9 @@ void draw_alarm_screen(void)
1047 1048
 {
1048 1049
 	hal_lcd_clear_display();
1049 1050
 
1050
-	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
1051
+	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, 1, alarm_icon_bits);
1051 1052
 
1052
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1053
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1053 1054
 
1054 1055
 	hal_lcd_update_display();
1055 1056
 }
... ...
@@ -1110,22 +1111,22 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1110 1111
 
1111 1112
 	hal_lcd_clear_display();
1112 1113
 
1113
-	oswald_draw_bitmap(36, 0, bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits);
1114
+	oswald_draw_bitmap(36, 0, bluetooth_icon_width, bluetooth_icon_height, 1, bluetooth_icon_bits);
1114 1115
 
1115 1116
 	if (sdata->set_mode) {
1116
-		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1117
-		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1118
-		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
1117
+		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, 1, upbutton_icon_bits);
1118
+		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, 1, downbutton_icon_bits);
1119
+		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, 1, rightbutton_icon_bits);
1119 1120
 	} else {
1120
-		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1121
+		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1121 1122
 	}
1122 1123
 
1123 1124
 	oswald_write_string(1, 30, FONT_DROID8x12, FALSE, "Enable:");
1124 1125
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
1125 1126
 		if (bluetooth_screen.bt_en)
1126
-			oswald_draw_bitmap(53, 33, checked_icon_width, checked_icon_height, checked_icon_bits);
1127
+			oswald_draw_bitmap(53, 33, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1127 1128
 		else
1128
-			oswald_draw_bitmap(53, 33, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
1129
+			oswald_draw_bitmap(53, 33, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1129 1130
 	}
1130 1131
 	oswald_write_string(1, 40, FONT_DROID8x12, FALSE, "State:");
1131 1132
 	switch (hal_bluetooth_get_state()) {
... ...
@@ -1145,9 +1146,9 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1145 1146
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
1146 1147
 		// oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
1147 1148
 		if (hal_bluetooth_get_visible())
1148
-			oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, checked_icon_bits);
1149
+			oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, 1, checked_icon_bits);
1149 1150
 		else
1150
-			oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
1151
+			oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, 1, unchecked_icon_bits);
1151 1152
 	}
1152 1153
 
1153 1154
 	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
... ...
@@ -1262,9 +1263,9 @@ void draw_info_screen(void)
1262 1263
 {
1263 1264
 	hal_lcd_clear_display();
1264 1265
 
1265
-	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
1266
+	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, 1, info_icon_bits);
1266 1267
 
1267
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1268
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1268 1269
 
1269 1270
 	oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Oswald");
1270 1271
 	oswald_write_string(35, 29, FONT_DROID8x12, FALSE, OSWALD_VERSION);
... ...
@@ -1358,12 +1359,12 @@ void draw_message_screen(messages_data_t *sdata)
1358 1359
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1359 1360
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1360 1361
 #endif
1361
-	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1362
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, 1, enterbutton_icon_bits);
1362 1363
 
1363 1364
 	Msg[sdata->offset + sdata->pos].type = MSG_TYPE_READ;
1364 1365
 	snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
1365 1366
 	oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
1366
-	oswald_draw_line(0,7,95,7);
1367
+	oswald_draw_line(0,7,95,7, 1);
1367 1368
 
1368 1369
 
1369 1370
 	// here goes the text
... ...
@@ -1376,7 +1377,7 @@ void draw_message_screen(messages_data_t *sdata)
1376 1377
 	}
1377 1378
 
1378 1379
 
1379
-	oswald_draw_line(0,87,95,87);
1380
+	oswald_draw_line(0,87,95,87, 1);
1380 1381
 
1381 1382
 	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1382 1383
 		snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
Browse code

Replace font handling, add new watch face, add calendar. More watchfaces, make calendar interactive and start rearranging button functions

Dario Rodriguez authored on 17/12/2013 22:59:59
Showing 1 changed files
... ...
@@ -6,6 +6,8 @@
6 6
 #include "oswald_graphics.h"
7 7
 #include "oswald_hal.h"
8 8
 
9
+#include "dayslib.h"
10
+
9 11
 #include "oswald_screens.h"
10 12
 
11 13
 #if defined(__GNUC__) && (__MSP430X__ > 0)
... ...
@@ -76,7 +78,7 @@ __attribute__((__far__))
76 78
 #if defined(__GNUC__) && (__MSP430X__ > 0)
77 79
 __attribute__((__far__))
78 80
 #endif
79
-#include "bitmaps/Bluetooth_icon.xbm"
81
+#include "bitmaps/bluetooth_icon.xbm"
80 82
 
81 83
 #if defined(__GNUC__) && (__MSP430X__ > 0)
82 84
 __attribute__((__far__))
... ...
@@ -91,12 +93,12 @@ __attribute__((__far__))
91 93
 #if defined(__GNUC__) && (__MSP430X__ > 0)
92 94
 __attribute__((__far__))
93 95
 #endif
94
-#include "bitmaps/Message_icon.xbm"
96
+#include "bitmaps/message_icon.xbm"
95 97
 
96 98
 #if defined(__GNUC__) && (__MSP430X__ > 0)
97 99
 __attribute__((__far__))
98 100
 #endif
99
-#include "bitmaps/Exit_icon.xbm"
101
+#include "bitmaps/exit_icon.xbm"
100 102
 
101 103
 
102 104
 /*
... ...
@@ -105,33 +107,38 @@ __attribute__((__far__))
105 107
 typedef struct {
106 108
 	void (*screendraw_func)(boolean show_seconds);
107 109
 	boolean show_seconds;
108
-	boolean analogue;
110
+	int curclock;
109 111
 } idle_data_t;
110 112
 static idle_data_t idle_screen = {
111
-	DrawLcdDigitalClock,
113
+	DrawCalendarClock,
112 114
 	TRUE,
113
-	FALSE,
115
+	0,
116
+};
117
+static struct {
118
+	void (*screendraw_func)(boolean show_seconds);
119
+} clocks[]={{DrawCalendarClock},
120
+		{DrawLcdAnaClock},
121
+		{DrawLcdDigitalClock},
122
+		{DrawHelpClock}
114 123
 };
124
+
115 125
  
116 126
 event_ret_t idle_handle_user_buttons(watch_button button)
117 127
 {
118 128
 	switch (button) {
119 129
 		case BUTTON_A:
120
-			if (idle_screen.show_seconds)
121
-				idle_screen.show_seconds = FALSE;
122
-			else
123
-				idle_screen.show_seconds = TRUE;
130
+		case BUTTON_C:
131
+			idle_screen.curclock+=(button==BUTTON_A)?1:((sizeof(clocks)/sizeof(clocks[0]))-1);
132
+			idle_screen.curclock%=(sizeof(clocks)/sizeof(clocks[0]));
133
+			idle_screen.screendraw_func = clocks[idle_screen.curclock].screendraw_func;
124 134
 			break;
125 135
 		case BUTTON_B:
126
-			if (idle_screen.analogue == TRUE) {
127
-				idle_screen.analogue = FALSE;
128
-				idle_screen.screendraw_func = DrawLcdDigitalClock;
129
-			} else {
130
-				idle_screen.analogue = TRUE;
131
-				idle_screen.screendraw_func = DrawLcdAnaClock;
132
-			};
136
+			OswaldState.screen_id = CALENDAR_OVERVIEW_SCREEN;
137
+			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
138
+			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
139
+			return EVENT_RET_HANDLED;
133 140
 			break;
134
-		case BUTTON_C:
141
+		case BUTTON_E:
135 142
 			OswaldState.screen_id = MAIN_MENU_SCREEN;
136 143
 			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
137 144
 			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
... ...
@@ -213,19 +220,19 @@ void draw_main_menu_screen(main_menu_data_t *sdata)
213 220
 		stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits, (sdata->pos == STOP_WATCH_SCREEN));
214 221
 	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
215 222
 		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
216
-		Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
223
+		bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
217 224
 	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
218 225
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
219 226
 		acc_icon_width, acc_icon_height, acc_icon_bits, (sdata->pos == ACCEL_DISPLAY_SCREEN));
220 227
 	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
221 228
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
222
-		Message_icon_width, Message_icon_height, Message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
229
+		message_icon_width, message_icon_height, message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
223 230
 	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
224 231
 		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
225 232
 		info_icon_width, info_icon_height, info_icon_bits, (sdata->pos == INFO_SCREEN));
226 233
 	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
227 234
 		MAIN_MENU_OFFSET_Y+(2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
228
-		Exit_icon_width, Exit_icon_height, Exit_icon_bits, (sdata->pos == LAST_SCREEN));
235
+		exit_icon_width, exit_icon_height, exit_icon_bits, (sdata->pos == LAST_SCREEN));
229 236
 
230 237
 	// round the corners of the inverted icon a little
231 238
 	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
... ...
@@ -416,6 +423,7 @@ static datetime_setup_data_t dt_setup_screen = {
416 423
 
417 424
 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
418 425
 {
426
+	int w,sx=2,sy=3;
419 427
 	hal_lcd_clear_display();
420 428
 
421 429
 	oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
... ...
@@ -425,19 +433,20 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
425 433
 	oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
426 434
 
427 435
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
428
-		oswald_write_character(2, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour / 10));
429
-		oswald_write_character(15, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour % 10));
436
+		if(OswaldClk.hour>=10)
437
+			oswald_draw_font58_scaled(2, 30, (OswaldClk.hour / 10)+'0',&w,1,0,sx,sy);
438
+		oswald_draw_font58_scaled(15, 30, (OswaldClk.hour % 10)+'0',&w,1,0,sx,sy);
430 439
 	}
431
-	oswald_write_character(25, 30, FONT_LCD13x21, FALSE, 10);
440
+	oswald_draw_font58_scaled(27, 34, ':',&w,1,0,1,2);
432 441
 
433 442
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
434
-		oswald_write_character(34, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute / 10));
435
-		oswald_write_character(47, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute % 10));
443
+		oswald_draw_font58_scaled(34, 30, (OswaldClk.minute / 10)+'0',&w,1,0,sx,sy);
444
+		oswald_draw_font58_scaled(47, 30, (OswaldClk.minute % 10)+'0',&w,1,0,sx,sy);
436 445
 	}
437 446
 
438 447
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
439
-		oswald_write_character(61, 38, FONT_LCD8x13, FALSE, (OswaldClk.second / 10));
440
-		oswald_write_character(69, 38, FONT_LCD8x13, FALSE, (OswaldClk.second % 10));
448
+		oswald_draw_font58_scaled(61, 36, (OswaldClk.second / 10)+'0',&w,1,0,sx-1,sy-1);
449
+		oswald_draw_font58_scaled(69, 36, (OswaldClk.second % 10)+'0',&w,1,0,sx-1,sy-1);
441 450
 	}
442 451
 
443 452
 
... ...
@@ -455,18 +464,18 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
455 464
 
456 465
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
457 466
 		if (OswaldClk.clk24hr) {
458
-			oswald_draw_bitmap(2, 76, checked_icon_width, checked_icon_height, checked_icon_bits);
467
+			oswald_draw_bitmap(2, 73, checked_icon_width, checked_icon_height, checked_icon_bits);
459 468
 		} else {
460
-			oswald_draw_bitmap(2, 76, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
469
+			oswald_draw_bitmap(2, 73, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
461 470
 		}
462 471
 	}
463 472
 	oswald_write_string(15, 73, FONT_DROID8x12, FALSE, "24hr");
464 473
 
465 474
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
466 475
 		if (OswaldClk.day_first) {
467
-			oswald_draw_bitmap(2, 86, checked_icon_width, checked_icon_height, checked_icon_bits);
476
+			oswald_draw_bitmap(2, 83, checked_icon_width, checked_icon_height, checked_icon_bits);
468 477
 		} else {
469
-			oswald_draw_bitmap(2, 86, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
478
+			oswald_draw_bitmap(2, 83, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
470 479
 		}
471 480
 	}
472 481
 	oswald_write_string(15, 83, FONT_DROID8x12, FALSE, "dd.mm.  mm/dd");
... ...
@@ -623,21 +632,21 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
623 632
 
624 633
 	if (sdata->set_mode) {
625 634
 		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
626
-		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
627
-		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
635
+		oswald_draw_bitmap(81, 38, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
636
+		oswald_draw_bitmap(81, 70, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
628 637
 	} else {
629
-		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
638
+		oswald_draw_bitmap(81, 38, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
630 639
 	}
631 640
 
632 641
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
633
-		oswald_write_character(18, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour / 10));
634
-		oswald_write_character(32, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour % 10));
642
+		oswald_write_character(18, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour / 10)+'0');
643
+		oswald_write_character(32, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour % 10)+'0');
635 644
 	}
636
-	oswald_write_character(42, 30, FONT_LCD13x21, FALSE, 10);
645
+	oswald_write_character(42, 30, FONT_LCD13x21, FALSE, ':');
637 646
 
638 647
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
639
-		oswald_write_character(53, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute / 10));
640
-		oswald_write_character(67, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute % 10));
648
+		oswald_write_character(53, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute / 10)+'0');
649
+		oswald_write_character(67, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute % 10)+'0');
641 650
 	}
642 651
 
643 652
 	oswald_write_character(3, 55, FONT_6x9, FALSE, 'S');
... ...
@@ -755,10 +764,10 @@ event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *
755 764
 			case BUTTON_A:
756 765
 				alarm_handle_updown(sdata->pos, 1);
757 766
 				break;
758
-			case BUTTON_B:
767
+			case BUTTON_C:
759 768
 				alarm_handle_updown(sdata->pos, -1);
760 769
 				break;
761
-			case BUTTON_C:
770
+			case BUTTON_B:
762 771
 				sdata->pos++;
763 772
 				sdata->pos %= 9;
764 773
 				break;
... ...
@@ -926,22 +935,22 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
926 935
 	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
927 936
 	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
928 937
 
929
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10));
930
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10));
931
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10));
932
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec / 10));
933
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec % 10));
934
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->csec / 10));
938
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10)+'0');
939
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10)+'0');
940
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10)+'0');
941
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec / 10)+'0');
942
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec % 10)+'0');
943
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->csec / 10)+'0');
935 944
 
936 945
 	gRow = 6;
937 946
 	gColumn = 61;
938
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_hr % 10));
939
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min / 10));
940
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min % 10));
941
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec / 10));
942
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10));
943
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10));
944
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10));
947
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_hr % 10)+'0');
948
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min / 10)+'0');
949
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min % 10)+'0');
950
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec / 10)+'0');
951
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10)+'0');
952
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10)+'0');
953
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10)+'0');
945 954
 
946 955
 	hal_lcd_update_display();
947 956
 }
... ...
@@ -1101,7 +1110,7 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
1101 1110
 
1102 1111
 	hal_lcd_clear_display();
1103 1112
 
1104
-	oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
1113
+	oswald_draw_bitmap(36, 0, bluetooth_icon_width, bluetooth_icon_height, bluetooth_icon_bits);
1105 1114
 
1106 1115
 	if (sdata->set_mode) {
1107 1116
 		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
... ...
@@ -1418,12 +1427,13 @@ event_ret_t message_screen_handle_events(uint16_t event, void *data)
1418 1427
 
1419 1428
 void draw_messages_screen(messages_data_t *sdata)
1420 1429
 {
1430
+#if 0
1421 1431
 	char dstr[32];
1422 1432
 	int i;
1423 1433
 
1424 1434
 	hal_lcd_clear_display();
1425 1435
 
1426
-	// oswald_draw_bitmap(36, 0, Message_icon_width, Message_icon_height, Message_icon_bits);
1436
+	// oswald_draw_bitmap(36, 0, message_icon_width, message_icon_height, message_icon_bits);
1427 1437
 
1428 1438
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1429 1439
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
... ...
@@ -1459,10 +1469,12 @@ void draw_messages_screen(messages_data_t *sdata)
1459 1469
 	}
1460 1470
 
1461 1471
 	hal_lcd_update_display();
1472
+#endif
1462 1473
 }
1463 1474
 
1464 1475
 event_ret_t handle_messages_screen_buttons(watch_button button, messages_data_t *sdata)
1465 1476
 {
1477
+#if 0
1466 1478
 	switch (button) {
1467 1479
 		case BUTTON_A:
1468 1480
 			sdata->pos--;
... ...
@@ -1508,7 +1520,7 @@ event_ret_t handle_messages_screen_buttons(watch_button button, messages_data_t
1508 1520
 		default:
1509 1521
 			break;
1510 1522
 	}
1511
-
1523
+#endif
1512 1524
 	return EVENT_RET_UNHANDLED;
1513 1525
 }
1514 1526
 
... ...
@@ -1531,3 +1543,115 @@ event_ret_t messages_screen_handle_events(uint16_t event, void *data)
1531 1543
 	return EVENT_RET_UNHANDLED;
1532 1544
 }
1533 1545
 
1546
+/* calendar overview */
1547
+typedef struct {
1548
+	int16_t off;
1549
+} calendar_overview_data_t;
1550
+static calendar_overview_data_t calendar_overview_screen = {
1551
+	0
1552
+};
1553
+
1554
+void draw_calendar_overview_screen(int off)
1555
+{
1556
+	static const char wnames[]={"MTWTFSS"};
1557
+	static const char *mnames[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
1558
+	int i,w,val,x,y;
1559
+	int yday,k;
1560
+	int *yeardays;
1561
+	int l;
1562
+	int month,year;
1563
+	unsigned char time[6];
1564
+	/* shift the month by the amount on "off" */
1565
+	month=OswaldClk.month+off;
1566
+	year=OswaldClk.year;
1567
+	if(month<=0) {
1568
+		while(month<=0) {
1569
+			year--;
1570
+			month+=12;
1571
+		}
1572
+	} else {
1573
+		year+=((month-1)/12);
1574
+		month=((month-1)%12)+1;
1575
+	}
1576
+	/* do the actual drawing */
1577
+	hal_lcd_clear_display();
1578
+	oswald_draw_rect(2,0,93,17,1);
1579
+	oswald_draw_grid(2,17,93,95,13,13);
1580
+	for(i=0;i<7;i++) 
1581
+		oswald_draw_font58(6+13*i, 30-9-13+2, wnames[i],&w,0,1);
1582
+	oswald_write_number(4,0, FONT_6x9, 1, year);
1583
+	w=4*5;
1584
+	oswald_write_string(4+w+5,0, FONT_6x9, 1, (char *) mnames[(month+11)%12]);
1585
+	val = OswaldClk.hour;
1586
+	if(!OswaldClk.clk24hr)
1587
+		val=(val>12)?val-12:val;
1588
+	time[0]=(val/10)+'0';
1589
+	time[1]=(val%10)+'0';
1590
+	time[2]=':';
1591
+	time[3]=(OswaldClk.minute/10)+'0';
1592
+	time[4]=(OswaldClk.minute%10)+'0';
1593
+	time[5]='\0';
1594
+	oswald_write_string(93-23,0, FONT_6x9, 1, (char *) time);
1595
+	mday2yday(year,month,1,&yday);
1596
+	yday2wday(year,yday,&k);
1597
+	k=(k+6)%7; /* wday for Monday is 1, we want it to be 0 */ 
1598
+	yeardays=GetYearDays(year);
1599
+	l=yeardays[month]-yeardays[month-1];
1600
+	for(i=1;i<=l;i++) {
1601
+		x=2+2+((i+k-1)%7)*13;
1602
+		y=17+2+((i+k-1)/7)*13;
1603
+		if(off==0 && i==OswaldClk.day) {
1604
+			oswald_draw_grid(x-3,y-3,x+13+1-3+1,y+13+1-3+1,15,15);
1605
+			oswald_draw_grid(x-3+1,y-3+1,x+13+1-3,y+13+1-3,15,15);
1606
+		}
1607
+		if(i<10) {
1608
+			oswald_draw_tinydigit(x,y,i+'0',&w,1,0);
1609
+		} else {
1610
+			oswald_draw_tinydigit(x,y,i/10+'0',&w,1,0);
1611
+			oswald_draw_tinydigit(x+w,y,i%10+'0',&w,1,0);
1612
+		}
1613
+	}
1614
+	hal_lcd_update_display();
1615
+}
1616
+
1617
+event_ret_t handle_calendar_overview_buttons(watch_button button, calendar_overview_data_t *calendar_overview_screen)
1618
+{
1619
+	switch (button) {
1620
+		case BUTTON_A:
1621
+		case BUTTON_C:
1622
+			calendar_overview_screen->off+=((button==BUTTON_C)?1:-1);
1623
+			draw_calendar_overview_screen(calendar_overview_screen->off);
1624
+			return EVENT_RET_HANDLED;
1625
+			break;
1626
+		case BUTTON_B:
1627
+                        OswaldState.screen_id = IDLE_SCREEN;
1628
+                        OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
1629
+                        OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
1630
+			return EVENT_RET_HANDLED;
1631
+			break;
1632
+		default:
1633
+			break;
1634
+	}
1635
+
1636
+	return EVENT_RET_UNHANDLED;
1637
+}
1638
+
1639
+event_ret_t calendar_overview_handle_events(uint16_t event, void *data)
1640
+{
1641
+	switch (event) {
1642
+		case EVENT_SCREEN_VISIBLE:
1643
+			calendar_overview_screen.off=0;
1644
+			draw_calendar_overview_screen(0);
1645
+			return EVENT_RET_HANDLED;
1646
+			break;
1647
+		case EVENT_USER_BUTTONS:
1648
+			dbg_out("button event %d\n", *(int *)data);
1649
+			return handle_calendar_overview_buttons(*(watch_button *)data, &calendar_overview_screen);
1650
+			break;
1651
+		case EVENT_ONE_SEC_TIMER:
1652
+			return EVENT_RET_HANDLED;
1653
+		default:
1654
+			break;
1655
+	};
1656
+	return EVENT_RET_UNHANDLED;
1657
+}
Browse code

Some minor improvements.

Nils Faerber authored on 06/07/2013 21:21:35
Showing 1 changed files
... ...
@@ -190,8 +190,8 @@ static main_menu_data_t main_menu_screen = {
190 190
 // GRID_Y is +1 since there is one empty row for title icon
191 191
 #define MAIN_MENU_GRID_Y	3
192 192
 #define MAIN_MENU_GRID_SPACING	0
193
-#define MAIN_MENU_OFFSET_X	3
194
-#define MAIN_MENU_OFFSET_Y	10
193
+#define MAIN_MENU_OFFSET_X	6
194
+#define MAIN_MENU_OFFSET_Y	8
195 195
 
196 196
 void draw_main_menu_screen(main_menu_data_t *sdata)
197 197
 {
... ...
@@ -237,6 +237,20 @@ void draw_main_menu_screen(main_menu_data_t *sdata)
237 237
 	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
238 238
 		MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
239 239
 
240
+
241
+	// finally a nice border
242
+	oswald_draw_line(3, 0, 95, 0);
243
+	oswald_draw_line(2, 1, 95, 1);
244
+	oswald_draw_line(1, 2, 95, 2);
245
+
246
+	oswald_draw_line(0, 3, 0, 92);
247
+	oswald_draw_line(1, 3, 1, 93);
248
+	oswald_draw_line(2, 3, 2, 94);
249
+
250
+	oswald_draw_line(1, 93, 95, 93);
251
+	oswald_draw_line(2, 94, 95, 94);
252
+	oswald_draw_line(3, 95, 95, 95);
253
+
240 254
 	hal_lcd_update_display();
241 255
 }
242 256
 
Browse code

Power saving changes, add new fonts, bitmaps and screens

Nils Faerber authored on 19/05/2013 00:07:04
Showing 1 changed files
... ...
@@ -11,37 +11,67 @@
11 11
 #if defined(__GNUC__) && (__MSP430X__ > 0)
12 12
 __attribute__((__far__))
13 13
 #endif
14
-#include "bitmaps/timesetup_icon.xbm"
14
+#include "bitmaps/startstopbutton_icon.xbm"
15 15
 
16 16
 #if defined(__GNUC__) && (__MSP430X__ > 0)
17 17
 __attribute__((__far__))
18 18
 #endif
19
-#include "bitmaps/stopwatch_icon.xbm"
19
+#include "bitmaps/lapsebutton_icon.xbm"
20 20
 
21 21
 #if defined(__GNUC__) && (__MSP430X__ > 0)
22 22
 __attribute__((__far__))
23 23
 #endif
24
-#include "bitmaps/alarm_icon.xbm"
24
+#include "bitmaps/upbutton_icon.xbm"
25 25
 
26 26
 #if defined(__GNUC__) && (__MSP430X__ > 0)
27 27
 __attribute__((__far__))
28 28
 #endif
29
-#include "bitmaps/startstopbutton_icon.xbm"
29
+#include "bitmaps/downbutton_icon.xbm"
30 30
 
31 31
 #if defined(__GNUC__) && (__MSP430X__ > 0)
32 32
 __attribute__((__far__))
33 33
 #endif
34
-#include "bitmaps/lapsebutton_icon.xbm"
34
+#include "bitmaps/leftbutton_icon.xbm"
35 35
 
36 36
 #if defined(__GNUC__) && (__MSP430X__ > 0)
37 37
 __attribute__((__far__))
38 38
 #endif
39
-#include "bitmaps/upbutton_icon.xbm"
39
+#include "bitmaps/rightbutton_icon.xbm"
40 40
 
41 41
 #if defined(__GNUC__) && (__MSP430X__ > 0)
42 42
 __attribute__((__far__))
43 43
 #endif
44
-#include "bitmaps/downbutton_icon.xbm"
44
+#include "bitmaps/enterbutton_icon.xbm"
45
+
46
+#if defined(__GNUC__) && (__MSP430X__ > 0)
47
+__attribute__((__far__))
48
+#endif
49
+#include "bitmaps/checked_icon.xbm"
50
+
51
+#if defined(__GNUC__) && (__MSP430X__ > 0)
52
+__attribute__((__far__))
53
+#endif
54
+#include "bitmaps/unchecked_icon.xbm"
55
+
56
+#if defined(__GNUC__) && (__MSP430X__ > 0)
57
+__attribute__((__far__))
58
+#endif
59
+#include "bitmaps/main_menu_icon.xbm"
60
+
61
+#if defined(__GNUC__) && (__MSP430X__ > 0)
62
+__attribute__((__far__))
63
+#endif
64
+#include "bitmaps/timesetup_icon.xbm"
65
+
66
+#if defined(__GNUC__) && (__MSP430X__ > 0)
67
+__attribute__((__far__))
68
+#endif
69
+#include "bitmaps/stopwatch_icon.xbm"
70
+
71
+#if defined(__GNUC__) && (__MSP430X__ > 0)
72
+__attribute__((__far__))
73
+#endif
74
+#include "bitmaps/alarm_icon.xbm"
45 75
 
46 76
 #if defined(__GNUC__) && (__MSP430X__ > 0)
47 77
 __attribute__((__far__))
... ...
@@ -58,6 +88,15 @@ __attribute__((__far__))
58 88
 #endif
59 89
 #include "bitmaps/acc_icon.xbm"
60 90
 
91
+#if defined(__GNUC__) && (__MSP430X__ > 0)
92
+__attribute__((__far__))
93
+#endif
94
+#include "bitmaps/Message_icon.xbm"
95
+
96
+#if defined(__GNUC__) && (__MSP430X__ > 0)
97
+__attribute__((__far__))
98
+#endif
99
+#include "bitmaps/Exit_icon.xbm"
61 100
 
62 101
 
63 102
 /*
... ...
@@ -93,7 +132,10 @@ event_ret_t idle_handle_user_buttons(watch_button button)
93 132
 			};
94 133
 			break;
95 134
 		case BUTTON_C:
96
-			return EVENT_RET_UNHANDLED;
135
+			OswaldState.screen_id = MAIN_MENU_SCREEN;
136
+			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
137
+			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
138
+			return EVENT_RET_HANDLED;
97 139
 			break;
98 140
 		case BUTTON_F:
99 141
 			OswaldState.screen_id = DATETIME_SETTING_SCREEN;
... ...
@@ -131,6 +173,141 @@ event_ret_t idle_handle_events(uint16_t event, void *data)
131 173
 }
132 174
 
133 175
 
176
+/*
177
+ * Main Menu Screen
178
+ */
179
+typedef struct {
180
+	int8_t pos;
181
+	uint8_t tmo;
182
+} main_menu_data_t;
183
+static main_menu_data_t main_menu_screen = {
184
+	ALARM_SETUP_SCREEN,
185
+	0,
186
+};
187
+
188
+#define MAIN_MENU_GRID_PIXEL	84
189
+#define MAIN_MENU_GRID_X	3
190
+// GRID_Y is +1 since there is one empty row for title icon
191
+#define MAIN_MENU_GRID_Y	3
192
+#define MAIN_MENU_GRID_SPACING	0
193
+#define MAIN_MENU_OFFSET_X	3
194
+#define MAIN_MENU_OFFSET_Y	10
195
+
196
+void draw_main_menu_screen(main_menu_data_t *sdata)
197
+{
198
+	uint8_t pf = sdata->pos - 2;
199
+
200
+	hal_lcd_clear_display();
201
+
202
+//	oswald_draw_bitmap(36, 0, main_menu_icon_width, main_menu_icon_height, main_menu_icon_bits);
203
+
204
+	oswald_draw_bitmap(81, 6, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
205
+	oswald_draw_bitmap(81, 38, leftbutton_icon_width, leftbutton_icon_height, leftbutton_icon_bits);
206
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
207
+
208
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
209
+		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
210
+		alarm_icon_width, alarm_icon_height, alarm_icon_bits, (sdata->pos == ALARM_SETUP_SCREEN));
211
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
212
+		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
213
+		stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits, (sdata->pos == STOP_WATCH_SCREEN));
214
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
215
+		MAIN_MENU_OFFSET_Y+(0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
216
+		Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits, (sdata->pos == BLUETOOTH_SCREEN));
217
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
218
+		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
219
+		acc_icon_width, acc_icon_height, acc_icon_bits, (sdata->pos == ACCEL_DISPLAY_SCREEN));
220
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((1+1) * MAIN_MENU_GRID_SPACING) + (1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
221
+		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
222
+		Message_icon_width, Message_icon_height, Message_icon_bits, (sdata->pos == MESSAGES_SCREEN));
223
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((2+1) * MAIN_MENU_GRID_SPACING) + (2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
224
+		MAIN_MENU_OFFSET_Y+(1 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
225
+		info_icon_width, info_icon_height, info_icon_bits, (sdata->pos == INFO_SCREEN));
226
+	oswald_draw_bitmpa_invert_opt(MAIN_MENU_OFFSET_X+((0+1) * MAIN_MENU_GRID_SPACING) + (0 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
227
+		MAIN_MENU_OFFSET_Y+(2 * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)),
228
+		Exit_icon_width, Exit_icon_height, Exit_icon_bits, (sdata->pos == LAST_SCREEN));
229
+
230
+	// round the corners of the inverted icon a little
231
+	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
232
+		MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
233
+	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
234
+		MAIN_MENU_OFFSET_Y+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
235
+	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
236
+		MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
237
+	hal_lcd_set_pixel(MAIN_MENU_OFFSET_X+23+((pf%MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)) % (MAIN_MENU_GRID_X*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_X)),
238
+		MAIN_MENU_OFFSET_Y+23+((pf/MAIN_MENU_GRID_X) * (MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)) % (MAIN_MENU_GRID_Y*(MAIN_MENU_GRID_PIXEL / MAIN_MENU_GRID_Y)), FALSE);
239
+
240
+	hal_lcd_update_display();
241
+}
242
+
243
+event_ret_t handle_main_menu_buttons(watch_button button, main_menu_data_t *sdata)
244
+{
245
+	switch (button) {
246
+		case BUTTON_A:
247
+			sdata->pos++;
248
+			if (sdata->pos > LAST_SCREEN)
249
+				sdata->pos = 2;
250
+			draw_main_menu_screen(&main_menu_screen);
251
+			return EVENT_RET_HANDLED;
252
+			break;
253
+		case BUTTON_B:
254
+			sdata->pos--;
255
+			if (sdata->pos < 2)
256
+				sdata->pos = LAST_SCREEN;
257
+			draw_main_menu_screen(&main_menu_screen);
258
+			return EVENT_RET_HANDLED;
259
+			break;
260
+		case BUTTON_C:
261
+			if (sdata->pos < LAST_SCREEN) {
262
+				OswaldState.screen_id = sdata->pos;
263
+				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
264
+				OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
265
+			} else {
266
+				OswaldState.screen_id = IDLE_SCREEN;
267
+				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
268
+				OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
269
+			}
270
+			return EVENT_RET_HANDLED;
271
+			break;
272
+		default:
273
+			break;
274
+	}
275
+
276
+	return EVENT_RET_UNHANDLED;
277
+}
278
+
279
+/* after MAIN_MENU_TIMEOUT seconds return to IDLE_SCREEN */
280
+#define MAIN_MENU_TIMEOUT	10
281
+
282
+event_ret_t main_menu_handle_events(uint16_t event, void *data)
283
+{
284
+	switch (event) {
285
+		case EVENT_SCREEN_VISIBLE:
286
+			main_menu_screen.tmo = 0;
287
+			main_menu_screen.pos = 2;
288
+			draw_main_menu_screen(&main_menu_screen);
289
+			return EVENT_RET_HANDLED;
290
+			break;
291
+		case EVENT_USER_BUTTONS:
292
+			dbg_out("button event %d\n", *(int *)data);
293
+			main_menu_screen.tmo = 0;
294
+			return handle_main_menu_buttons(*(watch_button *)data, &main_menu_screen);
295
+			break;
296
+		case EVENT_ONE_SEC_TIMER:
297
+			main_menu_screen.tmo++;
298
+			if (main_menu_screen.tmo > MAIN_MENU_TIMEOUT) {
299
+				OswaldState.screen_id = IDLE_SCREEN;
300
+				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
301
+				OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
302
+			}
303
+			return EVENT_RET_HANDLED;
304
+		default:
305
+			break;
306
+	};
307
+	return EVENT_RET_UNHANDLED;
308
+}
309
+
310
+
134 311
 /*
135 312
  * Accelerometer and sensor display screen
136 313
  */
... ...
@@ -149,15 +326,17 @@ void draw_accel_screen(accel_data_t *accel_data)
149 326
 
150 327
 	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
151 328
 
152
-	oswald_write_string(1, 40, FONT_6x9, "X:");
153
-	oswald_write_number(15, 40, FONT_6x9, accel_data->x);
154
-	oswald_write_string(1, 52, FONT_6x9, "Y:");
155
-	oswald_write_number(15, 52, FONT_6x9, accel_data->y);
156
-	oswald_write_string(1, 64, FONT_6x9, "Z:");
157
-	oswald_write_number(15, 64, FONT_6x9, accel_data->z);
329
+	oswald_draw_bitmap(81, 79, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
330
+
331
+	oswald_write_string(1, 40, FONT_6x9, FALSE, "X:");
332
+	oswald_write_number(15, 40, FONT_6x9, FALSE, accel_data->x);
333
+	oswald_write_string(1, 52, FONT_6x9, FALSE, "Y:");
334
+	oswald_write_number(15, 52, FONT_6x9, FALSE, accel_data->y);
335
+	oswald_write_string(1, 64, FONT_6x9, FALSE, "Z:");
336
+	oswald_write_number(15, 64, FONT_6x9, FALSE, accel_data->z);
158 337
 
159
-	oswald_write_string(1, 85, FONT_6x9, "Light:");
160
-	oswald_write_number(50, 85, FONT_6x9, 0);
338
+	oswald_write_string(1, 85, FONT_6x9, FALSE, "Light:");
339
+	oswald_write_number(50, 85, FONT_6x9, FALSE, 0);
161 340
 
162 341
 	oswald_draw_line(40, 30, 92, 30);
163 342
 	oswald_draw_line(92, 30, 92, 82);
... ...
@@ -166,11 +345,11 @@ void draw_accel_screen(accel_data_t *accel_data)
166 345
 
167 346
 	x = 41+25+((accel_data->x * 50) / (254));
168 347
 	y = 31+25-((accel_data->y * 50) / (254));
169
-	oswald_draw_pixel(x, y);
170
-	oswald_draw_pixel(x+1, y);
171
-	oswald_draw_pixel(x-1, y);
172
-	oswald_draw_pixel(x, y+1);
173
-	oswald_draw_pixel(x, y-1);
348
+	oswald_draw_pixel(x, y, TRUE);
349
+	oswald_draw_pixel(x+1, y, TRUE);
350
+	oswald_draw_pixel(x-1, y, TRUE);
351
+	oswald_draw_pixel(x, y+1, TRUE);
352
+	oswald_draw_pixel(x, y-1, TRUE);
174 353
 
175 354
 	hal_lcd_update_display();
176 355
 }
... ...
@@ -229,53 +408,54 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
229 408
 
230 409
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
231 410
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
411
+	oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
232 412
 
233 413
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
234
-		oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
235
-		oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
414
+		oswald_write_character(2, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour / 10));
415
+		oswald_write_character(15, 30, FONT_LCD13x21, FALSE, (OswaldClk.hour % 10));
236 416
 	}
237
-	oswald_write_character(25, 30, FONT_LCD13x21, 10);
417
+	oswald_write_character(25, 30, FONT_LCD13x21, FALSE, 10);
238 418
 
239 419
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
240
-		oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
241
-		oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
420
+		oswald_write_character(34, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute / 10));
421
+		oswald_write_character(47, 30, FONT_LCD13x21, FALSE, (OswaldClk.minute % 10));
242 422
 	}
243 423
 
244 424
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
245
-		oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
246
-		oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
425
+		oswald_write_character(61, 38, FONT_LCD8x13, FALSE, (OswaldClk.second / 10));
426
+		oswald_write_character(69, 38, FONT_LCD8x13, FALSE, (OswaldClk.second % 10));
247 427
 	}
248 428
 
249 429
 
250 430
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
251
-		oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
431
+		oswald_write_number(2, 55, FONT_DROID8x12, FALSE, OswaldClk.day);
252 432
 	}
253
-	oswald_write_character(15, 55, FONT_DROID8x12, '.');
433
+	oswald_write_character(15, 55, FONT_DROID8x12, FALSE, '.');
254 434
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
255
-		oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
435
+		oswald_write_number(21, 55, FONT_DROID8x12, FALSE, OswaldClk.month);
256 436
 	}
257
-	oswald_write_character(36, 55, FONT_DROID8x12, '.');
437
+	oswald_write_character(36, 55, FONT_DROID8x12, FALSE, '.');
258 438
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
259
-		oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
439
+		oswald_write_number(43, 55, FONT_DROID8x12, FALSE, OswaldClk.year);
260 440
 	}
261 441
 
262 442
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
263 443
 		if (OswaldClk.clk24hr) {
264
-			oswald_write_character(2, 76, FONT_6x9, 'x');
444
+			oswald_draw_bitmap(2, 76, checked_icon_width, checked_icon_height, checked_icon_bits);
265 445
 		} else {
266
-			oswald_write_character(2, 76, FONT_6x9, '_');
446
+			oswald_draw_bitmap(2, 76, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
267 447
 		}
268 448
 	}
269
-	oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
449
+	oswald_write_string(15, 73, FONT_DROID8x12, FALSE, "24hr");
270 450
 
271 451
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
272 452
 		if (OswaldClk.day_first) {
273
-			oswald_write_character(2, 86, FONT_6x9, 'x');
453
+			oswald_draw_bitmap(2, 86, checked_icon_width, checked_icon_height, checked_icon_bits);
274 454
 		} else {
275
-			oswald_write_character(2, 86, FONT_6x9, '_');
455
+			oswald_draw_bitmap(2, 86, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
276 456
 		}
277 457
 	}
278
-	oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm.  mm/dd");
458
+	oswald_write_string(15, 83, FONT_DROID8x12, FALSE, "dd.mm.  mm/dd");
279 459
 
280 460
 	hal_lcd_update_display();
281 461
 }
... ...
@@ -427,42 +607,82 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
427 607
 
428 608
 	oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
429 609
 
430
-	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
431
-	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
610
+	if (sdata->set_mode) {
611
+		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
612
+		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
613
+		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
614
+	} else {
615
+		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
616
+	}
432 617
 
433 618
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
434
-		oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
435
-		oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
619
+		oswald_write_character(18, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour / 10));
620
+		oswald_write_character(32, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.hour % 10));
436 621
 	}
437
-	oswald_write_character(42, 30, FONT_LCD13x21, 10);
622
+	oswald_write_character(42, 30, FONT_LCD13x21, FALSE, 10);
438 623
 
439 624
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
440
-		oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
441
-		oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
625
+		oswald_write_character(53, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute / 10));
626
+		oswald_write_character(67, 30, FONT_LCD13x21, FALSE, (OswaldAlarm.minute % 10));
442 627
 	}
443 628
 
444
-	oswald_write_character(3, 55, FONT_6x9, 'S');
445
-	oswald_write_character(15, 55, FONT_6x9, 'M');
446
-	oswald_write_character(27, 55, FONT_6x9, 'T');
447
-	oswald_write_character(39, 55, FONT_6x9, 'W');
448
-	oswald_write_character(51, 55, FONT_6x9, 'T');
449
-	oswald_write_character(63, 55, FONT_6x9, 'F');
450
-	oswald_write_character(75, 55, FONT_6x9, 'S');
451
-
452
-	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
453
-		oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
454
-	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
455
-		oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
456
-	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
457
-		oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
458
-	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
459
-		oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
460
-	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
461
-		oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
462
-	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
463
-		oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
464
-	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
465
-		oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
629
+	oswald_write_character(3, 55, FONT_6x9, FALSE, 'S');
630
+	oswald_write_character(15, 55, FONT_6x9, FALSE, 'M');
631
+	oswald_write_character(27, 55, FONT_6x9, FALSE, 'T');
632
+	oswald_write_character(39, 55, FONT_6x9, FALSE, 'W');
633
+	oswald_write_character(51, 55, FONT_6x9, FALSE, 'T');
634
+	oswald_write_character(63, 55, FONT_6x9, FALSE, 'F');
635
+	oswald_write_character(75, 55, FONT_6x9, FALSE, 'S');
636
+
637
+	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
638
+		// oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
639
+		if ((OswaldAlarm.wday & WDAY_SUNDAY))
640
+			oswald_draw_bitmap(3, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
641
+		else
642
+			oswald_draw_bitmap(3, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
643
+	}
644
+	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
645
+		// oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
646
+		if ((OswaldAlarm.wday & WDAY_MONDAY))
647
+			oswald_draw_bitmap(15, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
648
+		else
649
+			oswald_draw_bitmap(15, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
650
+	}
651
+	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
652
+		// oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
653
+		if ((OswaldAlarm.wday & WDAY_TUESDAY))
654
+			oswald_draw_bitmap(27, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
655
+		else
656
+			oswald_draw_bitmap(27, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
657
+	}
658
+	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
659
+		// oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
660
+		if ((OswaldAlarm.wday & WDAY_WEDNESDAY))
661
+			oswald_draw_bitmap(39, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
662
+		else
663
+			oswald_draw_bitmap(39, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
664
+	}
665
+	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
666
+		// oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
667
+		if ((OswaldAlarm.wday & WDAY_THURSDAY))
668
+			oswald_draw_bitmap(51, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
669
+		else
670
+			oswald_draw_bitmap(51, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
671
+	}
672
+	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
673
+		// oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
674
+		if ((OswaldAlarm.wday & WDAY_FRIDAY))
675
+			oswald_draw_bitmap(63, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
676
+		else
677
+			oswald_draw_bitmap(63, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
678
+	}
679
+	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8) {
680
+		// oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
681
+		if ((OswaldAlarm.wday & WDAY_SATURDAY))
682
+			oswald_draw_bitmap(75, 66, checked_icon_width, checked_icon_height, checked_icon_bits);
683
+		else
684
+			oswald_draw_bitmap(75, 66, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
685
+	}
466 686
 
467 687
 	hal_lcd_update_display();
468 688
 }
... ...
@@ -611,15 +831,15 @@ void draw_menu_test_screen(void)
611 831
 
612 832
 	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
613 833
 #endif
614
-	oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
834
+	oswald_write_string(2, 2, FONT_DROID8x12, FALSE, "Menu");
615 835
 
616
-	oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
617
-	oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
618
-	oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
619
-	oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
620
-	oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
836
+	oswald_write_string(2, 20, FONT_DROID8x12, FALSE, "Item 1");
837
+	oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Item 2");
838
+	oswald_write_string(2, 38, FONT_DROID8x12, FALSE, "Item 3");
839
+	oswald_write_string(2, 47, FONT_DROID8x12, FALSE, "Item 4");
840
+	oswald_write_string(2, 56, FONT_DROID8x12, FALSE, "Item 5");
621 841
 
622
-	oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
842
+	oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, FALSE, 0x11);
623 843
 
624 844
 	hal_lcd_update_display();
625 845
 }
... ...
@@ -678,29 +898,6 @@ typedef struct {
678 898
 } stopwatch_data_t;
679 899
 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
680 900
 
681
-#if 0
682
-static void update_stop_watch_screen(stopwatch_data_t *sdata)
683
-{
684
-	//char tstr[16];
685
-#if 0
686
-	SetFont(MetaWatchMonospaced10);
687
-
688
-	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
689
-	WriteLcdString(5, 40, tstr);
690
-	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
691
-	WriteLcdString(5, 60, tstr);
692
-#endif
693
-#if 0
694
-	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
695
-	oswald_write_string(5, 40, FONT_6x9, tstr);
696
-
697
-	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
698
-	oswald_write_string(5, 60, FONT_6x9, tstr);
699
-#endif
700
-
701
-	hal_lcd_update_display();
702
-}
703
-#endif
704 901
 
705 902
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
706 903
 {
... ...
@@ -710,31 +907,29 @@ static void draw_stop_watch_screen(stopwatch_data_t *sdata)
710 907
 	hal_lcd_clear_display();
711 908
 
712 909
 	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
910
+
713 911
 	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
714 912
 	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
913
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
715 914
 
716
-#if 0
717
-	update_stop_watch_screen(sdata);
718
-#else
719
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
720
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
721
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
722
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
723
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
724
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
915
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->hr % 10));
916
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min / 10));
917
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->min % 10));
918
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec / 10));
919
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, FALSE, (sdata->sec % 10));
920
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->csec / 10));
725 921
 
726 922
 	gRow = 6;
727
-	gColumn = 62;
728
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
729
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
730
-	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
731
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
732
-	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
733
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
734
-	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
923
+	gColumn = 61;
924
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_hr % 10));
925
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min / 10));
926
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_min % 10));
927
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec / 10));
928
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_sec % 10));
929
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec / 10));
930
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, FALSE, (sdata->lapse_csec % 10));
735 931
 
736 932
 	hal_lcd_update_display();
737
-#endif
738 933
 }
739 934
 
740 935
 event_ret_t handle_stop_watch_buttons(watch_button button)
... ...
@@ -780,12 +975,10 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
780 975
 	switch (event) {
781 976
 		case EVENT_USER_BUTTONS:
782 977
 			dbg_out("button event %d\n", *(int *)data);
783
-			return handle_stop_watch_buttons(*(watch_button *)data);
784
-			//update_stop_watch_screen(&stopwatch_screen);
785 978
 			draw_stop_watch_screen(&stopwatch_screen);
979
+			return handle_stop_watch_buttons(*(watch_button *)data);
786 980
 			break;
787 981
 		case EVENT_SCREEN_VISIBLE:
788
-			hal_lcd_clear_display();
789 982
 			draw_stop_watch_screen(&stopwatch_screen);
790 983
 			return EVENT_RET_HANDLED;
791 984
 			break;
... ...
@@ -833,6 +1026,8 @@ void draw_alarm_screen(void)
833 1026
 
834 1027
 	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
835 1028
 
1029
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1030
+
836 1031
 	hal_lcd_update_display();
837 1032
 }
838 1033
 
... ...
@@ -894,36 +1089,48 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
894 1089
 
895 1090
 	oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
896 1091
 
897
-	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
898
-	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1092
+	if (sdata->set_mode) {
1093
+		oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1094
+		oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1095
+		oswald_draw_bitmap(81, 70, rightbutton_icon_width, rightbutton_icon_height, rightbutton_icon_bits);
1096
+	} else {
1097
+		oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1098
+	}
899 1099
 
900
-	oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
1100
+	oswald_write_string(1, 30, FONT_DROID8x12, FALSE, "Enable:");
901 1101
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
902
-		oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
1102
+		if (bluetooth_screen.bt_en)
1103
+			oswald_draw_bitmap(53, 33, checked_icon_width, checked_icon_height, checked_icon_bits);
1104
+		else
1105
+			oswald_draw_bitmap(53, 33, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
903 1106
 	}
904
-	oswald_write_string(1, 40, FONT_DROID8x12, "State:");
1107
+	oswald_write_string(1, 40, FONT_DROID8x12, FALSE, "State:");
905 1108
 	switch (hal_bluetooth_get_state()) {
906 1109
 		case BLUETOOTH_OFF:
907
-			oswald_write_string(53, 40, FONT_DROID8x12, "off");
1110
+			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "off");
908 1111
 			break;
909 1112
 		case BLUETOOTH_ON:
910
-			oswald_write_string(53, 40, FONT_DROID8x12, "on");
1113
+			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "on");
911 1114
 			break;
912 1115
 		case BLUETOOTH_CONNECTED:
913
-			oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
1116
+			oswald_write_string(53, 40, FONT_DROID8x12, FALSE, "conn.");
914 1117
 			break;
915 1118
 		default:
916 1119
 			break;
917 1120
 	};
918
-	oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
1121
+	oswald_write_string(1, 50, FONT_DROID8x12, FALSE, "Visible:");
919 1122
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
920
-		oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
1123
+		// oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
1124
+		if (hal_bluetooth_get_visible())
1125
+			oswald_draw_bitmap(53, 53, checked_icon_width, checked_icon_height, checked_icon_bits);
1126
+		else
1127
+			oswald_draw_bitmap(53, 53, unchecked_icon_width, unchecked_icon_height, unchecked_icon_bits);
921 1128
 	}
922 1129
 
923 1130
 	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
924 1131
 		bd_addr = hal_bluetooth_get_local_bdaddr();
925 1132
 		snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
926
-		oswald_write_string(2, 85, FONT_5x7, bstr);
1133
+		oswald_write_string(2, 85, FONT_5x7, FALSE, bstr);
927 1134
 	} else {
928 1135
 	}
929 1136
 
... ...
@@ -949,20 +1156,6 @@ void bluetooth_handle_updown(uint8_t pos, int8_t incr)
949 1156
 				hal_bluetooth_set_visible(FALSE);
950 1157
 			}
951 1158
 			break;
952
-		case 2:
953
-			break;
954
-		case 3:
955
-			break;
956
-		case 4:
957
-			break;
958
-		case 5:
959
-			break;
960
-		case 6:
961
-			break;
962
-		case 7:
963
-			break;
964
-		case 8:
965
-			break;
966 1159
 		default:
967 1160
 			break;
968 1161
 	};
... ...
@@ -1042,20 +1235,22 @@ event_ret_t bluetooth_screen_events(uint16_t event, void *data)
1042 1235
 /*
1043 1236
  * Info Screen
1044 1237
  */
1045
-void draw_info_screen(accel_data_t *accel_data)
1238
+void draw_info_screen(void)
1046 1239
 {
1047 1240
 	hal_lcd_clear_display();
1048 1241
 
1049 1242
 	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
1050 1243
 
1051
-	oswald_write_string(2, 29, FONT_DROID8x12, "Oswald");
1052
-	oswald_write_string(35, 29, FONT_DROID8x12, OSWALD_VERSION);
1053
-	oswald_write_string(2, 41, FONT_DROID8x12, "HAL");
1054
-	oswald_write_string(35, 41, FONT_DROID8x12, (char *)hal_get_version_string());
1055
-	oswald_write_string(2, 53, FONT_DROID8x12, "Build");
1056
-	oswald_write_string(35, 53, FONT_DROID8x12, (char *)hal_get_buildno_string());
1057
-	oswald_write_string(2, 65, FONT_DROID8x12, "Radio");
1058
-	oswald_write_string(35, 65, FONT_DROID8x12, (char *)hal_get_radio_version_string());
1244
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1245
+
1246
+	oswald_write_string(2, 29, FONT_DROID8x12, FALSE, "Oswald");
1247
+	oswald_write_string(35, 29, FONT_DROID8x12, FALSE, OSWALD_VERSION);
1248
+	oswald_write_string(2, 41, FONT_DROID8x12, FALSE, "HAL");
1249
+	oswald_write_string(35, 41, FONT_DROID8x12, FALSE, (char *)hal_get_version_string());
1250
+	oswald_write_string(2, 53, FONT_DROID8x12, FALSE, "Build");
1251
+	oswald_write_string(35, 53, FONT_DROID8x12, FALSE, (char *)hal_get_buildno_string());
1252
+	oswald_write_string(2, 65, FONT_DROID8x12, FALSE, "Radio");
1253
+	oswald_write_string(35, 65, FONT_DROID8x12, FALSE, (char *)hal_get_radio_version_string());
1059 1254
 
1060 1255
 	hal_lcd_update_display();
1061 1256
 }
... ...
@@ -1064,7 +1259,7 @@ event_ret_t info_screen_handle_events(uint16_t event, void *data)
1064 1259
 {
1065 1260
 	switch (event) {
1066 1261
 		case EVENT_SCREEN_VISIBLE:
1067
-			draw_info_screen(&accel_screen.accdata);
1262
+			draw_info_screen();
1068 1263
 			return EVENT_RET_HANDLED;
1069 1264
 			break;
1070 1265
 		case EVENT_USER_BUTTONS:
... ...
@@ -1077,3 +1272,248 @@ event_ret_t info_screen_handle_events(uint16_t event, void *data)
1077 1272
 	return EVENT_RET_UNHANDLED;
1078 1273
 }
1079 1274
 
1275
+
1276
+/*
1277
+ * Messages Screens
1278
+ */
1279
+typedef struct {
1280
+	int8_t pos;	// marker position
1281
+	int8_t offset;	// offset in msg list
1282
+} messages_data_t;
1283
+static messages_data_t messages_screen = {
1284
+	0,
1285
+	0,
1286
+};
1287
+
1288
+typedef struct {
1289
+	uint8_t day;
1290
+	uint8_t month;
1291
+	uint8_t year;	// without century, add +1900
1292
+	uint8_t hour;
1293
+	uint8_t minute;
1294
+} msg_timedate_t;
1295
+
1296
+#define MSG_TYPE_READ		0
1297
+#define MSG_TYPE_NEW		1
1298
+#define MSG_TYPE_END		127
1299
+
1300
+typedef struct {
1301
+	uint8_t type;
1302
+	msg_timedate_t td;
1303
+	char *msg;
1304
+} message_t;
1305
+
1306
+uint8_t Msgs = 15;
1307
+message_t Msg[] = {
1308
+	{ MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
1309
+	{ MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
1310
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
1311
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
1312
+	{ MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
1313
+	{ MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
1314
+	{ MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
1315
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
1316
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
1317
+	{ MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
1318
+	{ MSG_TYPE_READ, {9,5,113,0,38}, "Testmessage with more text than fits into the menu." },
1319
+	{ MSG_TYPE_NEW, {9,5,113,0,39}, "Sitting in the train waiting to arrive." },
1320
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "People in the train are annoying!" },
1321
+	{ MSG_TYPE_READ, {9,5,113,0,40}, "Auch auf Deutsch geht das hier und Text können lang sein." },
1322
+	{ MSG_TYPE_NEW, {8,5,113,0,40}, "Und hier noch eine neue Nachricht, die nun wirklich lang ist, laenger als die anderen." },
1323
+	{ MSG_TYPE_END, {0,0,0,0,0}, "Exit" },
1324
+};
1325
+
1326
+void draw_message_screen(messages_data_t *sdata)
1327
+{
1328
+	char dstr[32];
1329
+	uint8_t strpos, msglen;
1330
+	uint8_t line;
1331
+
1332
+	hal_lcd_clear_display();
1333
+
1334
+#if 0
1335
+	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1336
+	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1337
+#endif
1338
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1339
+
1340
+	Msg[sdata->offset + sdata->pos].type = MSG_TYPE_READ;
1341
+	snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
1342
+	oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
1343
+	oswald_draw_line(0,7,95,7);
1344
+
1345
+
1346
+	// here goes the text
1347
+	msglen = strlen(Msg[sdata->pos+sdata->offset].msg);
1348
+	strpos=0;
1349
+	line=0;
1350
+	while ((strpos < msglen) && (line < 6)) {
1351
+		strpos += oswald_write_string_length(4, 9+(line*12), 84, FONT_DROID8x12, FALSE, &Msg[sdata->pos+sdata->offset].msg[strpos]);
1352
+		line++;
1353
+	}
1354
+
1355
+
1356
+	oswald_draw_line(0,87,95,87);
1357
+
1358
+	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1359
+		snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
1360
+		oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
1361
+	}
1362
+
1363
+	hal_lcd_update_display();
1364
+}
1365
+
1366
+event_ret_t handle_message_screen_buttons(watch_button button, messages_data_t *sdata)
1367
+{
1368
+	switch (button) {
1369
+		case BUTTON_A:
1370
+			break;
1371
+		case BUTTON_B:
1372
+			return EVENT_RET_HANDLED;
1373
+			break;
1374
+		case BUTTON_C:
1375
+			// OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
1376
+			OswaldState.screen_id = MESSAGES_SCREEN;
1377
+			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
1378
+			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
1379
+			return EVENT_RET_HANDLED;
1380
+			break;
1381
+		default:
1382
+			break;
1383
+	}
1384
+
1385
+	return EVENT_RET_UNHANDLED;
1386
+}
1387
+
1388
+event_ret_t message_screen_handle_events(uint16_t event, void *data)
1389
+{
1390
+	switch (event) {
1391
+		case EVENT_SCREEN_VISIBLE:
1392
+			draw_message_screen(&messages_screen);
1393
+			return EVENT_RET_HANDLED;
1394
+			break;
1395
+		case EVENT_USER_BUTTONS:
1396
+			dbg_out("button event %d\n", *(int *)data);
1397
+			return handle_message_screen_buttons(*(watch_button *)data, &messages_screen);
1398
+			break;
1399
+		default:
1400
+			break;
1401
+	};
1402
+	return EVENT_RET_UNHANDLED;
1403
+}
1404
+
1405
+void draw_messages_screen(messages_data_t *sdata)
1406
+{
1407
+	char dstr[32];
1408
+	int i;
1409
+
1410
+	hal_lcd_clear_display();
1411
+
1412
+	// oswald_draw_bitmap(36, 0, Message_icon_width, Message_icon_height, Message_icon_bits);
1413
+
1414
+	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
1415
+	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
1416
+	oswald_draw_bitmap(81, 70, enterbutton_icon_width, enterbutton_icon_height, enterbutton_icon_bits);
1417
+
1418
+	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1419
+		snprintf(dstr, 19, "#%02d/%02d", sdata->pos + sdata->offset + 1, Msgs);
1420
+		oswald_write_string(30, 0, FONT_5x7, FALSE, dstr);
1421
+	}
1422
+	oswald_draw_line(0,7,95,7);
1423
+
1424
+	for (i=0; i<6; i++) {
1425
+		if (Msg[i+sdata->offset].type != MSG_TYPE_END) {
1426
+			//oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12, (Msg[i+sdata->offset].type == MSG_TYPE_NEW), Msg[i+sdata->offset].msg);
1427
+			if (Msg[i+sdata->offset].type == MSG_TYPE_NEW)
1428
+				oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12b, (i+sdata->offset) == (sdata->offset + sdata->pos), Msg[i+sdata->offset].msg);
1429
+			else
1430
+				oswald_write_string_length(4, 9+(i*12), 84, FONT_DROID8x12, (i+sdata->offset) == (sdata->offset + sdata->pos), Msg[i+sdata->offset].msg);
1431
+		} else {
1432
+			oswald_draw_bitmap(0, 66, leftbutton_icon_width, leftbutton_icon_height, leftbutton_icon_bits);
1433
+		}
1434
+	}
1435
+
1436
+	// marker selected msg
1437
+	oswald_draw_line(1,9,1,81);
1438
+	oswald_draw_line_ww(1,10+(sdata->pos*12),1,20+(sdata->pos*12),2);
1439
+
1440
+	oswald_draw_line(0,87,95,87);
1441
+
1442
+	if (Msg[sdata->offset + sdata->pos].type != MSG_TYPE_END) {
1443
+		snprintf(dstr, 19, "%c %02d.%02d.%04d,%02d:%02d", (Msg[sdata->pos+sdata->offset].type == MSG_TYPE_NEW) ? '*':' ', Msg[sdata->pos+sdata->offset].td.day, Msg[sdata->pos+sdata->offset].td.month, Msg[sdata->pos+sdata->offset].td.year+1900, Msg[sdata->pos+sdata->offset].td.hour, Msg[sdata->pos+sdata->offset].td.minute);
1444
+		oswald_write_string(2, 89, FONT_5x7, FALSE, dstr);
1445
+	}
1446
+
1447
+	hal_lcd_update_display();
1448
+}
1449
+
1450
+event_ret_t handle_messages_screen_buttons(watch_button button, messages_data_t *sdata)
1451
+{
1452
+	switch (button) {
1453
+		case BUTTON_A:
1454
+			sdata->pos--;
1455
+			if (sdata->pos < 0) {
1456
+				if (sdata->offset > 0) {
1457
+					sdata->pos = 0;
1458
+					sdata->offset--;
1459
+					if (sdata->offset < 0)
1460
+						sdata->offset = 0;
1461
+				} else {
1462
+					sdata->pos = 5;
1463
+					sdata->offset = (Msgs - 5);
1464
+					if (sdata->offset < 0)
1465
+						sdata->offset = 0;
1466
+				}
1467
+			}
1468
+			draw_messages_screen(&messages_screen);
1469
+			return EVENT_RET_HANDLED;
1470
+			break;
1471
+		case BUTTON_B:
1472
+			sdata->pos++;
1473
+			if (sdata->pos > 5) {
1474
+				sdata->pos = 5;
1475
+				sdata->offset++;
1476
+				if ((sdata->offset + 5) > Msgs) {
1477
+					sdata->offset = 0;
1478
+					sdata->pos = 0;
1479
+				}
1480
+			}
1481
+			draw_messages_screen(&messages_screen);
1482
+			return EVENT_RET_HANDLED;
1483
+			break;
1484
+		case BUTTON_C:
1485
+			if (Msg[sdata->offset + sdata->pos].type == MSG_TYPE_END)
1486
+				return EVENT_RET_UNHANDLED;
1487
+			else
1488
+				// OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
1489
+				OswaldState.screen_id = MESSAGE_SCREEN;
1490
+				OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
1491
+				OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
1492
+				return EVENT_RET_HANDLED;
1493
+			break;
1494
+		default:
1495
+			break;
1496
+	}
1497
+
1498
+	return EVENT_RET_UNHANDLED;
1499
+}
1500
+
1501
+event_ret_t messages_screen_handle_events(uint16_t event, void *data)
1502
+{
1503
+	switch (event) {
1504
+		case EVENT_SCREEN_VISIBLE:
1505
+//			messages_screen.pos = 0;
1506
+//			messages_screen.offset = 0;
1507
+			draw_messages_screen(&messages_screen);
1508
+			return EVENT_RET_HANDLED;
1509
+			break;
1510
+		case EVENT_USER_BUTTONS:
1511
+			dbg_out("button event %d\n", *(int *)data);
1512
+			return handle_messages_screen_buttons(*(watch_button *)data, &messages_screen);
1513
+			break;
1514
+		default:
1515
+			break;
1516
+	};
1517
+	return EVENT_RET_UNHANDLED;
1518
+}
1519
+
Browse code

Maybe a little sniff mode, add ambient light adc (not working), fix accelerometer display orientation

Nils Faerber authored on 06/05/2013 23:39:18
Showing 1 changed files
... ...
@@ -165,7 +165,7 @@ void draw_accel_screen(accel_data_t *accel_data)
165 165
 	oswald_draw_line(40, 82, 40, 30);
166 166
 
167 167
 	x = 41+25+((accel_data->x * 50) / (254));
168
-	y = 31+25+((accel_data->y * 50) / (254));
168
+	y = 31+25-((accel_data->y * 50) / (254));
169 169
 	oswald_draw_pixel(x, y);
170 170
 	oswald_draw_pixel(x+1, y);
171 171
 	oswald_draw_pixel(x-1, y);
Browse code

Fix alarm not confirmable, enhance GTK simulation diplay for charge state, fix RTC time handling

Nils Faerber authored on 06/05/2013 11:12:37
Showing 1 changed files
... ...
@@ -853,8 +853,7 @@ event_ret_t alarm_handle_events(uint16_t event, void *data)
853 853
 			break;
854 854
 		case EVENT_USER_BUTTONS:
855 855
 			dbg_out("button event %d\n", *(int *)data);
856
-			// hal_lcd_set_backlight(FALSE);
857
-			return EVENT_RET_HANDLED;
856
+			return EVENT_RET_UNHANDLED;
858 857
 			break;
859 858
 		case EVENT_HALF_SEC_TIMER:
860 859
 			hal_lcd_set_backlight(!hal_lcd_get_backlight());
Browse code

Make accelerometer work, interrup driven tilt change mode

Nils Faerber authored on 05/05/2013 21:22:33
Showing 1 changed files
... ...
@@ -143,6 +143,8 @@ static accelscreen_data_t accel_screen = {
143 143
 
144 144
 void draw_accel_screen(accel_data_t *accel_data)
145 145
 {
146
+	uint8_t x,y;
147
+
146 148
 	hal_lcd_clear_display();
147 149
 
148 150
 	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
... ...
@@ -162,7 +164,13 @@ void draw_accel_screen(accel_data_t *accel_data)
162 164
 	oswald_draw_line(40, 82, 92, 82);
163 165
 	oswald_draw_line(40, 82, 40, 30);
164 166
 
165
-	oswald_draw_pixel(41+25+((accel_data->x * 50) / (254)), 31+25+((accel_data->y * 50) / (254)));
167
+	x = 41+25+((accel_data->x * 50) / (254));
168
+	y = 31+25+((accel_data->y * 50) / (254));
169
+	oswald_draw_pixel(x, y);
170
+	oswald_draw_pixel(x+1, y);
171
+	oswald_draw_pixel(x-1, y);
172
+	oswald_draw_pixel(x, y+1);
173
+	oswald_draw_pixel(x, y-1);
166 174
 
167 175
 	hal_lcd_update_display();
168 176
 }
... ...
@@ -172,6 +180,11 @@ event_ret_t accel_handle_events(uint16_t event, void *data)
172 180
 	switch (event) {
173 181
 		case EVENT_SCREEN_VISIBLE:
174 182
 			draw_accel_screen(&accel_screen.accdata);
183
+			hal_accelerometer_enable();
184
+			return EVENT_RET_HANDLED;
185
+			break;
186
+		case EVENT_SCREEN_DESTROY:
187
+			hal_accelerometer_disable();
175 188
 			return EVENT_RET_HANDLED;
176 189
 			break;
177 190
 		case EVENT_ACCEL_UPDATE: {
Browse code

Add version information and info screen, some more work on the accel screen

Nils Faerber authored on 05/05/2013 01:54:24
Showing 1 changed files
... ...
@@ -48,7 +48,21 @@ __attribute__((__far__))
48 48
 #endif
49 49
 #include "bitmaps/Bluetooth_icon.xbm"
50 50
 
51
+#if defined(__GNUC__) && (__MSP430X__ > 0)
52
+__attribute__((__far__))
53
+#endif
54
+#include "bitmaps/info_icon.xbm"
55
+
56
+#if defined(__GNUC__) && (__MSP430X__ > 0)
57
+__attribute__((__far__))
58
+#endif
59
+#include "bitmaps/acc_icon.xbm"
60
+
61
+
51 62
 
63
+/*
64
+ * Common event handler part of the watch faces
65
+ */
52 66
 typedef struct {
53 67
 	void (*screendraw_func)(boolean show_seconds);
54 68
 	boolean show_seconds;
... ...
@@ -117,6 +131,9 @@ event_ret_t idle_handle_events(uint16_t event, void *data)
117 131
 }
118 132
 
119 133
 
134
+/*
135
+ * Accelerometer and sensor display screen
136
+ */
120 137
 typedef struct {
121 138
 	accel_data_t accdata;
122 139
 } accelscreen_data_t;
... ...
@@ -128,15 +145,24 @@ void draw_accel_screen(accel_data_t *accel_data)
128 145
 {
129 146
 	hal_lcd_clear_display();
130 147
 
131
-	oswald_write_string(0, 2, FONT_6x9, "X:");
132
-	oswald_write_number(20, 2, FONT_6x9, accel_data->x);
133
-	oswald_write_string(0, 16, FONT_6x9, "Y:");
134
-	oswald_write_number(20, 16, FONT_6x9, accel_data->y);
135
-	oswald_write_string(0, 32, FONT_6x9, "Z:");
136
-	oswald_write_number(20, 32, FONT_6x9, accel_data->z);
148
+	oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
149
+
150
+	oswald_write_string(1, 40, FONT_6x9, "X:");
151
+	oswald_write_number(15, 40, FONT_6x9, accel_data->x);
152
+	oswald_write_string(1, 52, FONT_6x9, "Y:");
153
+	oswald_write_number(15, 52, FONT_6x9, accel_data->y);
154
+	oswald_write_string(1, 64, FONT_6x9, "Z:");
155
+	oswald_write_number(15, 64, FONT_6x9, accel_data->z);
156
+
157
+	oswald_write_string(1, 85, FONT_6x9, "Light:");
158
+	oswald_write_number(50, 85, FONT_6x9, 0);
137 159
 
138
-	oswald_write_string(0, 54, FONT_6x9, "Light:");
139
-	oswald_write_number(50, 54, FONT_6x9, accel_data->z);
160
+	oswald_draw_line(40, 30, 92, 30);
161
+	oswald_draw_line(92, 30, 92, 82);
162
+	oswald_draw_line(40, 82, 92, 82);
163
+	oswald_draw_line(40, 82, 40, 30);
164
+
165
+	oswald_draw_pixel(41+25+((accel_data->x * 50) / (254)), 31+25+((accel_data->y * 50) / (254)));
140 166
 
141 167
 	hal_lcd_update_display();
142 168
 }
... ...
@@ -168,6 +194,9 @@ event_ret_t accel_handle_events(uint16_t event, void *data)
168 194
 }
169 195
 
170 196
 
197
+/*
198
+ * Date / time setup screen
199
+ */
171 200
 typedef struct {
172 201
 	uint8_t pos;
173 202
 	boolean set_mode;
... ...
@@ -366,9 +395,8 @@ event_ret_t datetime_setup_events(uint16_t event, void *data)
366 395
 
367 396
 
368 397
 /*
369
- * Alarm setup
398
+ * Alarm setup screen
370 399
  */
371
-
372 400
 typedef struct {
373 401
 	uint8_t pos;
374 402
 	boolean set_mode;
... ...
@@ -550,7 +578,6 @@ event_ret_t alarm_setup_events(uint16_t event, void *data)
550 578
 /*
551 579
  * Test menu
552 580
  */
553
-
554 581
 typedef struct {
555 582
 	uint8_t menu_pos;
556 583
 } test_menu_t;
... ...
@@ -625,7 +652,6 @@ event_ret_t test_menu_handle_events(uint16_t event, void *data)
625 652
 /*
626 653
  * Stop Watch
627 654
  */
628
-
629 655
 typedef struct {
630 656
 	uint8_t hr;
631 657
 	uint8_t min;
... ...
@@ -786,7 +812,7 @@ event_ret_t stop_watch_handle_events(uint16_t event, void *data)
786 812
 
787 813
 
788 814
 /*
789
- * when alarm is fired
815
+ * Alarm screen, shown when alarm is fired
790 816
  */
791 817
 void draw_alarm_screen(void)
792 818
 {
... ...
@@ -832,7 +858,7 @@ event_ret_t alarm_handle_events(uint16_t event, void *data)
832 858
 
833 859
 
834 860
 /*
835
- * Bluetooth screen
861
+ * Bluetooth setup screen
836 862
  */
837 863
 typedef struct {
838 864
 	uint8_t pos;
... ...
@@ -1000,3 +1026,42 @@ event_ret_t bluetooth_screen_events(uint16_t event, void *data)
1000 1026
 	return EVENT_RET_HANDLED;
1001 1027
 }
1002 1028
 
1029
+
1030
+/*
1031
+ * Info Screen
1032
+ */
1033
+void draw_info_screen(accel_data_t *accel_data)
1034
+{
1035
+	hal_lcd_clear_display();
1036
+
1037
+	oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
1038
+
1039
+	oswald_write_string(2, 29, FONT_DROID8x12, "Oswald");
1040
+	oswald_write_string(35, 29, FONT_DROID8x12, OSWALD_VERSION);
1041
+	oswald_write_string(2, 41, FONT_DROID8x12, "HAL");
1042
+	oswald_write_string(35, 41, FONT_DROID8x12, (char *)hal_get_version_string());
1043
+	oswald_write_string(2, 53, FONT_DROID8x12, "Build");
1044
+	oswald_write_string(35, 53, FONT_DROID8x12, (char *)hal_get_buildno_string());
1045
+	oswald_write_string(2, 65, FONT_DROID8x12, "Radio");
1046
+	oswald_write_string(35, 65, FONT_DROID8x12, (char *)hal_get_radio_version_string());
1047
+
1048
+	hal_lcd_update_display();
1049
+}
1050
+
1051
+event_ret_t info_screen_handle_events(uint16_t event, void *data)
1052
+{
1053
+	switch (event) {
1054
+		case EVENT_SCREEN_VISIBLE:
1055
+			draw_info_screen(&accel_screen.accdata);
1056
+			return EVENT_RET_HANDLED;
1057
+			break;
1058
+		case EVENT_USER_BUTTONS:
1059
+			dbg_out("button event %d\n", *(int *)data);
1060
+			break;
1061
+		default:
1062
+			return EVENT_RET_UNHANDLED;
1063
+			break;
1064
+	};
1065
+	return EVENT_RET_UNHANDLED;
1066
+}
1067
+
Browse code

Start support for the accelerometer, change text position for clock setup

Nils Faerber authored on 04/05/2013 22:31:14
Showing 1 changed files
... ...
@@ -219,18 +219,18 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
219 219
 
220 220
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
221 221
 		if (OswaldClk.clk24hr) {
222
-			oswald_write_character(2, 76, FONT_DROID8x12, 'x');
222
+			oswald_write_character(2, 76, FONT_6x9, 'x');
223 223
 		} else {
224
-			oswald_write_character(2, 76, FONT_DROID8x12, '_');
224
+			oswald_write_character(2, 76, FONT_6x9, '_');
225 225
 		}
226 226
 	}
227 227
 	oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
228 228
 
229 229
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
230 230
 		if (OswaldClk.day_first) {
231
-			oswald_write_character(2, 87, FONT_DROID8x12, 'x');
231
+			oswald_write_character(2, 86, FONT_6x9, 'x');
232 232
 		} else {
233
-			oswald_write_character(2, 87, FONT_DROID8x12, '_');
233
+			oswald_write_character(2, 86, FONT_6x9, '_');
234 234
 		}
235 235
 	}
236 236
 	oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm.  mm/dd");
Browse code

Rework font code, add new fonts, also proportional, rework watch usage - "SET" button now enters settings mode

Nils Faerber authored on 04/05/2013 19:23:25
Showing 1 changed files
... ...
@@ -8,37 +8,41 @@
8 8
 
9 9
 #include "oswald_screens.h"
10 10
 
11
-#include "LcdDisplay.h"
12
-#include "Fonts.h"
13
-
14 11
 #if defined(__GNUC__) && (__MSP430X__ > 0)
15 12
 __attribute__((__far__))
16 13
 #endif
17 14
 #include "bitmaps/timesetup_icon.xbm"
15
+
18 16
 #if defined(__GNUC__) && (__MSP430X__ > 0)
19 17
 __attribute__((__far__))
20 18
 #endif
21 19
 #include "bitmaps/stopwatch_icon.xbm"
20
+
22 21
 #if defined(__GNUC__) && (__MSP430X__ > 0)
23 22
 __attribute__((__far__))
24 23
 #endif
25 24
 #include "bitmaps/alarm_icon.xbm"
25
+
26 26
 #if defined(__GNUC__) && (__MSP430X__ > 0)
27 27
 __attribute__((__far__))
28 28
 #endif
29 29
 #include "bitmaps/startstopbutton_icon.xbm"
30
+
30 31
 #if defined(__GNUC__) && (__MSP430X__ > 0)
31 32
 __attribute__((__far__))
32 33
 #endif
33 34
 #include "bitmaps/lapsebutton_icon.xbm"
35
+
34 36
 #if defined(__GNUC__) && (__MSP430X__ > 0)
35 37
 __attribute__((__far__))
36 38
 #endif
37 39
 #include "bitmaps/upbutton_icon.xbm"
40
+
38 41
 #if defined(__GNUC__) && (__MSP430X__ > 0)
39 42
 __attribute__((__far__))
40 43
 #endif
41 44
 #include "bitmaps/downbutton_icon.xbm"
45
+
42 46
 #if defined(__GNUC__) && (__MSP430X__ > 0)
43 47
 __attribute__((__far__))
44 48
 #endif
... ...
@@ -56,7 +60,7 @@ static idle_data_t idle_screen = {
56 60
 	FALSE,
57 61
 };
58 62
  
59
-void idle_handle_user_buttons(watch_button button)
63
+event_ret_t idle_handle_user_buttons(watch_button button)
60 64
 {
61 65
 	switch (button) {
62 66
 		case BUTTON_A:
... ...
@@ -74,32 +78,42 @@ void idle_handle_user_buttons(watch_button button)
74 78
 				idle_screen.screendraw_func = DrawLcdAnaClock;
75 79
 			};
76 80
 			break;
81
+		case BUTTON_C:
82
+			return EVENT_RET_UNHANDLED;
83
+			break;
77 84
 		case BUTTON_F:
78 85
 			OswaldState.screen_id = DATETIME_SETTING_SCREEN;
79 86
 			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
80 87
 			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
81
-			return;
88
+			return EVENT_RET_HANDLED;
82 89
 			break;
83 90
 		default:
91
+			return EVENT_RET_UNHANDLED;
84 92
 			break;
85 93
 	};
94
+
86 95
 	idle_screen.screendraw_func(idle_screen.show_seconds);
96
+
97
+	return EVENT_RET_HANDLED;
87 98
 }
88 99
 
89
-void idle_handle_events(u16t event, void *data)
100
+event_ret_t idle_handle_events(uint16_t event, void *data)
90 101
 {
91 102
 	switch (event) {
92 103
 		case EVENT_ONE_SEC_TIMER:
93 104
 		case EVENT_SCREEN_VISIBLE:
94 105
 			idle_screen.screendraw_func(idle_screen.show_seconds);
106
+			return EVENT_RET_HANDLED;
95 107
 			break;
96 108
 		case EVENT_USER_BUTTONS:
97 109
 			dbg_out("button event %d\n", *(int *)data);
98
-			idle_handle_user_buttons(*(watch_button *)data);
110
+			return idle_handle_user_buttons(*(watch_button *)data);
99 111
 			break;
100 112
 		default:
113
+			return EVENT_RET_UNHANDLED;
101 114
 			break;
102 115
 	};
116
+	return EVENT_RET_UNHANDLED;
103 117
 }
104 118
 
105 119
 
... ...
@@ -114,27 +128,25 @@ void draw_accel_screen(accel_data_t *accel_data)
114 128
 {
115 129
 	hal_lcd_clear_display();
116 130
 
117
-	oswald_write_string(0, 2, FONT_7x12b, "X:");
118
-	oswald_write_number(20, 2, FONT_7x12b, accel_data->x);
119
-	oswald_write_string(0, 18, FONT_7x12b, "Y:");
120
-	oswald_write_number(20, 18, FONT_7x12b, accel_data->y);
121
-#if 0
122
-	oswald_write_string(0, 34, FONT_8x12, "Z:");
123
-	oswald_write_number(20, 34, FONT_8x12, accel_data->z);
131
+	oswald_write_string(0, 2, FONT_6x9, "X:");
132
+	oswald_write_number(20, 2, FONT_6x9, accel_data->x);
133
+	oswald_write_string(0, 16, FONT_6x9, "Y:");
134
+	oswald_write_number(20, 16, FONT_6x9, accel_data->y);
135
+	oswald_write_string(0, 32, FONT_6x9, "Z:");
136
+	oswald_write_number(20, 32, FONT_6x9, accel_data->z);
124 137
 
125
-	oswald_write_string(0, 54, FONT_12x16, "Light:");
126
-	oswald_write_number(50, 54, FONT_12x16, accel_data->z);
138
+	oswald_write_string(0, 54, FONT_6x9, "Light:");
139
+	oswald_write_number(50, 54, FONT_6x9, accel_data->z);
127 140
 
128
-	oswald_write_string(0, 70, FONT_12x20, "23:59");
129
-#endif
130 141
 	hal_lcd_update_display();
131 142
 }
132 143
 
133
-void accel_handle_events(u16t event, void *data)
144
+event_ret_t accel_handle_events(uint16_t event, void *data)
134 145
 {
135 146
 	switch (event) {
136 147
 		case EVENT_SCREEN_VISIBLE:
137 148
 			draw_accel_screen(&accel_screen.accdata);
149
+			return EVENT_RET_HANDLED;
138 150
 			break;
139 151
 		case EVENT_ACCEL_UPDATE: {
140 152
 			accel_data_t *accel_data = (accel_data_t *)data;
... ...
@@ -143,22 +155,27 @@ void accel_handle_events(u16t event, void *data)
143 155
 			accel_screen.accdata.z = accel_data->z;
144 156
 			draw_accel_screen(&accel_screen.accdata);
145 157
 			};
158
+			return EVENT_RET_HANDLED;
146 159
 			break;
147 160
 		case EVENT_USER_BUTTONS:
148 161
 			dbg_out("button event %d\n", *(int *)data);
149 162
 			break;
150 163
 		default:
164
+			return EVENT_RET_UNHANDLED;
151 165
 			break;
152 166
 	};
167
+	return EVENT_RET_UNHANDLED;
153 168
 }
154 169
 
155 170
 
156 171
 typedef struct {
157
-	u8t pos;
172
+	uint8_t pos;
173
+	boolean set_mode;
158 174
 	boolean on;
159 175
 } datetime_setup_data_t;
160 176
 static datetime_setup_data_t dt_setup_screen = {
161 177
 	0,
178
+	FALSE,
162 179
 	TRUE
163 180
 };
164 181
 
... ...
@@ -171,58 +188,57 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
171 188
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
172 189
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
173 190
 
174
-	SetFont(MetaWatchTime);
175 191
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
176
-		WriteLcdCharacter(2, 30, (OswaldClk.hour / 10));
177
-		WriteLcdCharacter(14, 30, (OswaldClk.hour % 10));
192
+		oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
193
+		oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
178 194
 	}
179
-	WriteLcdCharacter(26, 30, TIME_CHARACTER_COLON_INDEX);
195
+	oswald_write_character(25, 30, FONT_LCD13x21, 10);
180 196
 
181 197
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
182
-		WriteLcdCharacter(31, 30, (OswaldClk.minute / 10));
183
-		WriteLcdCharacter(43, 30, (OswaldClk.minute % 10));
198
+		oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
199
+		oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
184 200
 	}
185 201
 
186
-	SetFont(MetaWatch16);
187 202
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
188
-		WriteLcdCharacter(59, 36, 0x30 + (OswaldClk.second / 10));
189
-		WriteLcdCharacter(66, 36, 0x30 + (OswaldClk.second % 10));
203
+		oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
204
+		oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
190 205
 	}
191 206
 
192 207
 
193 208
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
194
-		WriteLcdNumber(2, 55, OswaldClk.day);
209
+		oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
195 210
 	}
196
-	WriteLcdString(18, 55, ".");
211
+	oswald_write_character(15, 55, FONT_DROID8x12, '.');
197 212
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
198
-		WriteLcdNumber(22, 55, OswaldClk.month);
213
+		oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
199 214
 	}
200
-	WriteLcdString(38, 55, ".");
215
+	oswald_write_character(36, 55, FONT_DROID8x12, '.');
201 216
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
202
-		WriteLcdNumber(42, 55, OswaldClk.year);
217
+		oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
203 218
 	}
204 219
 
205
-	SetFont(MetaWatch7);
206 220
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
207
-		if (OswaldClk.clk24hr)
208
-			WriteLcdString(2, 76, "x");
209
-		else
210
-			WriteLcdString(2, 76, "_");
221
+		if (OswaldClk.clk24hr) {
222
+			oswald_write_character(2, 76, FONT_DROID8x12, 'x');
223
+		} else {
224
+			oswald_write_character(2, 76, FONT_DROID8x12, '_');
225
+		}
211 226
 	}
212
-	WriteLcdString(15, 76, "24hr");
227
+	oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
213 228
 
214 229
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
215
-		if (OswaldClk.day_first)
216
-			WriteLcdString(2, 89, "x");
217
-		else
218
-			WriteLcdString(2, 89, "_");
230
+		if (OswaldClk.day_first) {
231
+			oswald_write_character(2, 87, FONT_DROID8x12, 'x');
232
+		} else {
233
+			oswald_write_character(2, 87, FONT_DROID8x12, '_');
234
+		}
219 235
 	}
220
-	WriteLcdString(15, 89, "dd.mm.  mm/dd");
236
+	oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm.  mm/dd");
221 237
 
222 238
 	hal_lcd_update_display();
223 239
 }
224 240
 
225
-void datetime_handle_updown(u8t pos, s8t incr)
241
+void datetime_handle_updown(uint8_t pos, int8_t incr)
226 242
 {
227 243
 	switch (pos) {
228 244
 		case 0: // hour
... ...
@@ -288,7 +304,7 @@ void datetime_handle_updown(u8t pos, s8t incr)
288 304
 		hal_set_rtc(&OswaldClk, FALSE);
289 305
 }
290 306
 
291
-void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
307
+event_ret_t handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
292 308
 {
293 309
 	switch (button) {
294 310
 		case BUTTON_A:
... ...
@@ -297,30 +313,41 @@ void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *s
297 313
 		case BUTTON_B:
298 314
 			datetime_handle_updown(sdata->pos, -1);
299 315
 			break;
300
-		case BUTTON_F:
316
+		case BUTTON_C:
301 317
 			sdata->pos++;
302 318
 			sdata->pos %= 8;
303 319
 			break;
320
+		case BUTTON_F:
321
+			OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
322
+			OswaldState.screen_id = IDLE_SCREEN;
323
+			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
324
+			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
325
+			return EVENT_RET_HANDLED;
326
+			break;
304 327
 		default:
328
+			return EVENT_RET_UNHANDLED;
305 329
 			break;
306 330
 	}
307 331
 	draw_datetime_setup_screen(sdata);
332
+	return EVENT_RET_HANDLED;
308 333
 }
309 334
 
310
-void datetime_setup_events(u16t event, void *data)
335
+event_ret_t datetime_setup_events(uint16_t event, void *data)
311 336
 {
312 337
 	switch (event) {
313 338
 		case EVENT_SCREEN_VISIBLE:
314 339
 			dt_setup_screen.pos = 0;
315 340
 			draw_datetime_setup_screen(&dt_setup_screen);
316 341
 			hal_enable_halfsecond_timer();
342
+			return EVENT_RET_HANDLED;
317 343
 			break;
318 344
 		case EVENT_SCREEN_DESTROY:
319 345
 			hal_disable_halfsecond_timer();
346
+			return EVENT_RET_HANDLED;
320 347
 			break;
321 348
 		case EVENT_USER_BUTTONS:
322 349
 			dbg_out("button event %d\n", *(int *)data);
323
-			handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
350
+			return handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
324 351
 			break;
325 352
 		case EVENT_HALF_SEC_TIMER:
326 353
 			if (dt_setup_screen.on)
... ...
@@ -328,10 +355,13 @@ void datetime_setup_events(u16t event, void *data)
328 355
 			else
329 356
 				dt_setup_screen.on = TRUE;
330 357
 			draw_datetime_setup_screen(&dt_setup_screen);
358
+			return EVENT_RET_HANDLED;
331 359
 			break;
332 360
 		default:
361
+			return EVENT_RET_UNHANDLED;
333 362
 			break;
334 363
 	};
364
+	return EVENT_RET_UNHANDLED;
335 365
 }
336 366
 
337 367
 
... ...
@@ -340,11 +370,13 @@ void datetime_setup_events(u16t event, void *data)
340 370
  */
341 371
 
342 372
 typedef struct {
343
-	u8t pos;
373
+	uint8_t pos;
374
+	boolean set_mode;
344 375
 	boolean on;
345 376
 } alarm_setup_data_t;
346 377
 static alarm_setup_data_t alarm_setup_screen = {
347 378
 	0,
379
+	FALSE,
348 380
 	TRUE
349 381
 };
350 382
 
... ...
@@ -357,46 +389,44 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
357 389
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
358 390
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
359 391
 
360
-	SetFont(MetaWatchTime);
361 392
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
362
-		WriteLcdCharacter(22, 30, (OswaldAlarm.hour / 10));
363
-		WriteLcdCharacter(34, 30, (OswaldAlarm.hour % 10));
393
+		oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
394
+		oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
364 395
 	}
365
-	WriteLcdCharacter(46, 30, TIME_CHARACTER_COLON_INDEX);
396
+	oswald_write_character(42, 30, FONT_LCD13x21, 10);
366 397
 
367 398
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
368
-		WriteLcdCharacter(51, 30, (OswaldAlarm.minute / 10));
369
-		WriteLcdCharacter(63, 30, (OswaldAlarm.minute % 10));
399
+		oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
400
+		oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
370 401
 	}
371 402
 
372
-	SetFont(MetaWatchMonospaced10);
373
-	WriteLcdCharacter(3, 55, 'S');
374
-	WriteLcdCharacter(15, 55, 'M');
375
-	WriteLcdCharacter(27, 55, 'T');
376
-	WriteLcdCharacter(39, 55, 'W');
377
-	WriteLcdCharacter(51, 55, 'T');
378
-	WriteLcdCharacter(63, 55, 'F');
379
-	WriteLcdCharacter(75, 55, 'S');
403
+	oswald_write_character(3, 55, FONT_6x9, 'S');
404
+	oswald_write_character(15, 55, FONT_6x9, 'M');
405
+	oswald_write_character(27, 55, FONT_6x9, 'T');
406
+	oswald_write_character(39, 55, FONT_6x9, 'W');
407
+	oswald_write_character(51, 55, FONT_6x9, 'T');
408
+	oswald_write_character(63, 55, FONT_6x9, 'F');
409
+	oswald_write_character(75, 55, FONT_6x9, 'S');
380 410
 
381 411
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
382
-		WriteLcdCharacter(3, 65, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
412
+		oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
383 413
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
384
-		WriteLcdCharacter(15, 65, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
414
+		oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
385 415
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
386
-		WriteLcdCharacter(27, 65, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
416
+		oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
387 417
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
388
-		WriteLcdCharacter(39, 65, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
418
+		oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
389 419
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
390
-		WriteLcdCharacter(51, 65, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
420
+		oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
391 421
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
392
-		WriteLcdCharacter(63, 65, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
422
+		oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
393 423
 	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
394
-		WriteLcdCharacter(75, 65, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
424
+		oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
395 425
 
396 426
 	hal_lcd_update_display();
397 427
 }
398 428
 
399
-void alarm_handle_updown(u8t pos, s8t incr)
429
+void alarm_handle_updown(uint8_t pos, int8_t incr)
400 430
 {
401 431
 	switch (pos) {
402 432
 		case 0: // hour
... ...
@@ -443,50 +473,77 @@ void alarm_handle_updown(u8t pos, s8t incr)
443 473
 	};
444 474
 }
445 475
 
446
-void handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
476
+event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
447 477
 {
448
-	switch (button) {
449
-		case BUTTON_A:
450
-			alarm_handle_updown(sdata->pos, 1);
451
-			break;
452
-		case BUTTON_B:
453
-			alarm_handle_updown(sdata->pos, -1);
454
-			break;
455
-		case BUTTON_F:
456
-			sdata->pos++;
457
-			sdata->pos %= 9;
458
-			break;
459
-		default:
460
-			break;
478
+	if (alarm_setup_screen.set_mode) {
479
+		switch (button) {
480
+			case BUTTON_A:
481
+				alarm_handle_updown(sdata->pos, 1);
482
+				break;
483
+			case BUTTON_B:
484
+				alarm_handle_updown(sdata->pos, -1);
485
+				break;
486
+			case BUTTON_C:
487
+				sdata->pos++;
488
+				sdata->pos %= 9;
489
+				break;
490
+			case BUTTON_F:
491
+				alarm_setup_screen.set_mode = FALSE;
492
+				break;
493
+			default:
494
+				return EVENT_RET_UNHANDLED;
495
+				break;
496
+		}
497
+	} else {
498
+		switch (button) {
499
+			case BUTTON_F:
500
+				alarm_setup_screen.set_mode = TRUE;
501
+				break;
502
+			default:
503
+				return EVENT_RET_UNHANDLED;
504
+				break;
505
+		}
461 506
 	}
462 507
 	draw_alarm_setup_screen(sdata);
508
+
509
+	return EVENT_RET_HANDLED;
463 510
 }
464 511
 
465
-void alarm_setup_events(u16t event, void *data)
512
+event_ret_t alarm_setup_events(uint16_t event, void *data)
466 513
 {
467 514
 	switch (event) {
468 515
 		case EVENT_SCREEN_VISIBLE:
469 516
 			alarm_setup_screen.pos = 0;
517
+			alarm_setup_screen.on = TRUE;
518
+			alarm_setup_screen.set_mode = FALSE;
470 519
 			draw_alarm_setup_screen(&alarm_setup_screen);
471 520
 			hal_enable_halfsecond_timer();
521
+			return EVENT_RET_HANDLED;
472 522
 			break;
473 523
 		case EVENT_SCREEN_DESTROY:
474 524
 			hal_disable_halfsecond_timer();
525
+			return EVENT_RET_HANDLED;
475 526
 			break;
476 527
 		case EVENT_USER_BUTTONS:
477 528
 			dbg_out("button event %d\n", *(int *)data);
478
-			handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
529
+			return handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
479 530
 			break;
480 531
 		case EVENT_HALF_SEC_TIMER:
481
-			if (alarm_setup_screen.on)
482
-				alarm_setup_screen.on = FALSE;
483
-			else
532
+			if (alarm_setup_screen.set_mode) {
533
+				if (alarm_setup_screen.on)
534
+					alarm_setup_screen.on = FALSE;
535
+				else
536
+					alarm_setup_screen.on = TRUE;
537
+			} else
484 538
 				alarm_setup_screen.on = TRUE;
485 539
 			draw_alarm_setup_screen(&alarm_setup_screen);
540
+			return EVENT_RET_HANDLED;
486 541
 			break;
487 542
 		default:
543
+			return EVENT_RET_UNHANDLED;
488 544
 			break;
489 545
 	};
546
+	return EVENT_RET_UNHANDLED;
490 547
 }
491 548
 
492 549
 
... ...
@@ -495,13 +552,14 @@ void alarm_setup_events(u16t event, void *data)
495 552
  */
496 553
 
497 554
 typedef struct {
498
-	u8t menu_pos;
555
+	uint8_t menu_pos;
499 556
 } test_menu_t;
500 557
 static test_menu_t test_menu = { 0 };
501 558
 
502 559
 void draw_menu_test_screen(void)
503 560
 {
504 561
 	hal_lcd_clear_display();
562
+#if 0
505 563
 	SetFont(MetaWatch16);
506 564
 	WriteLcdString(2, 2, "Menu");
507 565
 	SetFont(MetaWatch7);
... ...
@@ -512,40 +570,55 @@ void draw_menu_test_screen(void)
512 570
 	WriteLcdString(2, 56, "Item 5");
513 571
 
514 572
 	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
573
+#endif
574
+	oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
575
+
576
+	oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
577
+	oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
578
+	oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
579
+	oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
580
+	oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
581
+
582
+	oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
583
+
515 584
 	hal_lcd_update_display();
516 585
 }
517 586
 
518
-static void handle_menu_user_buttons(watch_button button)
587
+event_ret_t handle_menu_user_buttons(watch_button button)
519 588
 {
520 589
 	switch (button) {
521 590
 		case BUTTON_A:
522 591
 			test_menu.menu_pos--;
523
-			test_menu.menu_pos%=5;
592
+			test_menu.menu_pos %= 5;
524 593
 			break;
525 594
 		case BUTTON_B:
526 595
 			test_menu.menu_pos++;
527
-			test_menu.menu_pos%=5;
596
+			test_menu.menu_pos %= 5;
528 597
 			break;
529 598
 		default:
599
+			return EVENT_RET_UNHANDLED;
530 600
 			break;
531 601
 	}
532 602
 	draw_menu_test_screen();
603
+	return EVENT_RET_HANDLED;
533 604
 }
534 605
 
535
-void test_menu_handle_events(u16t event, void *data)
606
+event_ret_t test_menu_handle_events(uint16_t event, void *data)
536 607
 {
537 608
 	switch (event) {
538 609
 		case EVENT_USER_BUTTONS:
539 610
 			dbg_out("button event %d\n", *(int *)data);
540
-			handle_menu_user_buttons(*(watch_button *)data);
611
+			return handle_menu_user_buttons(*(watch_button *)data);
541 612
 			break;
542 613
 		case EVENT_SCREEN_VISIBLE:
543 614
 			test_menu.menu_pos = 0;
544 615
 			draw_menu_test_screen();
545 616
 			break;
546 617
 		default:
618
+			return EVENT_RET_UNHANDLED;
547 619
 			break;
548 620
 	};
621
+	return EVENT_RET_HANDLED;
549 622
 }
550 623
 
551 624
 
... ...
@@ -554,42 +627,78 @@ void test_menu_handle_events(u16t event, void *data)
554 627
  */
555 628
 
556 629
 typedef struct {
557
-	u8t hr;
558
-	u8t min;
559
-	u8t sec;
560
-	u8t csec;
561
-	u8t lapse_hr;
562
-	u8t lapse_min;
563
-	u8t lapse_sec;
564
-	u8t lapse_csec;
630
+	uint8_t hr;
631
+	uint8_t min;
632
+	uint8_t sec;
633
+	uint8_t csec;
634
+	uint8_t lapse_hr;
635
+	uint8_t lapse_min;
636
+	uint8_t lapse_sec;
637
+	uint8_t lapse_csec;
565 638
 	boolean running;
566 639
 } stopwatch_data_t;
567 640
 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
568 641
 
569
-
642
+#if 0
570 643
 static void update_stop_watch_screen(stopwatch_data_t *sdata)
571 644
 {
572
-	char tstr[16];
645
+	//char tstr[16];
646
+#if 0
573 647
 	SetFont(MetaWatchMonospaced10);
574 648
 
575 649
 	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
576 650
 	WriteLcdString(5, 40, tstr);
577 651
 	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
578 652
 	WriteLcdString(5, 60, tstr);
653
+#endif
654
+#if 0
655
+	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
656
+	oswald_write_string(5, 40, FONT_6x9, tstr);
657
+
658
+	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
659
+	oswald_write_string(5, 60, FONT_6x9, tstr);
660
+#endif
579 661
 
580 662
 	hal_lcd_update_display();
581 663
 }
664
+#endif
582 665
 
583 666
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
584 667
 {
668
+	int gRow = 1;
669
+	int gColumn = 35;
670
+
671
+	hal_lcd_clear_display();
672
+
585 673
 	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
586 674
 	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
587 675
 	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
588 676
 
677
+#if 0
589 678
 	update_stop_watch_screen(sdata);
679
+#else
680
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
681
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
682
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
683
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
684
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
685
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
686
+
687
+	gRow = 6;
688
+	gColumn = 62;
689
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
690
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
691
+	gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
692
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
693
+	gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
694
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
695
+	gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
696
+
697
+	hal_lcd_update_display();
698
+#endif
590 699
 }
591 700
 
592
-static void handle_stop_watch_buttons(watch_button button)
701
+event_ret_t handle_stop_watch_buttons(watch_button button)
593 702
 {
594 703
 	switch (button) {
595 704
 		case BUTTON_A: // start/stop
... ...
@@ -600,12 +709,14 @@ static void handle_stop_watch_buttons(watch_button button)
600 709
 				hal_enable_centisecond_timer();
601 710
 				stopwatch_screen.running = TRUE;
602 711
 			}
712
+			return EVENT_RET_HANDLED;
603 713
 			break;
604 714
 		case BUTTON_B: // lapse
605 715
 			stopwatch_screen.lapse_hr = stopwatch_screen.hr;
606 716
 			stopwatch_screen.lapse_min = stopwatch_screen.min;
607 717
 			stopwatch_screen.lapse_sec = stopwatch_screen.sec;
608 718
 			stopwatch_screen.lapse_csec = stopwatch_screen.csec;
719
+			return EVENT_RET_HANDLED;
609 720
 			break;
610 721
 		case BUTTON_F: // reset
611 722
 			stopwatch_screen.hr = 0;
... ...
@@ -616,27 +727,33 @@ static void handle_stop_watch_buttons(watch_button button)
616 727
 			stopwatch_screen.lapse_min = 0;
617 728
 			stopwatch_screen.lapse_sec = 0;
618 729
 			stopwatch_screen.lapse_csec = 0;
730
+			return EVENT_RET_HANDLED;
619 731
 			break;
620 732
 		default:
733
+			return EVENT_RET_UNHANDLED;
621 734
 			break;
622 735
 	}
736
+	return EVENT_RET_UNHANDLED;
623 737
 }
624 738
 
625
-void stop_watch_handle_events(u16t event, void *data)
739
+event_ret_t stop_watch_handle_events(uint16_t event, void *data)
626 740
 {
627 741
 	switch (event) {
628 742
 		case EVENT_USER_BUTTONS:
629 743
 			dbg_out("button event %d\n", *(int *)data);
630
-			handle_stop_watch_buttons(*(watch_button *)data);
631
-			update_stop_watch_screen(&stopwatch_screen);
744
+			return handle_stop_watch_buttons(*(watch_button *)data);
745
+			//update_stop_watch_screen(&stopwatch_screen);
746
+			draw_stop_watch_screen(&stopwatch_screen);
632 747
 			break;
633 748
 		case EVENT_SCREEN_VISIBLE:
634 749
 			hal_lcd_clear_display();
635 750
 			draw_stop_watch_screen(&stopwatch_screen);
751
+			return EVENT_RET_HANDLED;
636 752
 			break;
637 753
 		case EVENT_SCREEN_DESTROY:
638 754
 			hal_disable_centisecond_timer();
639 755
 			stopwatch_screen.running = FALSE;
756
+			return EVENT_RET_HANDLED;
640 757
 			break;
641 758
 		case EVENT_CS_TIMER:
642 759
 			stopwatch_screen.csec++;
... ...
@@ -656,11 +773,15 @@ void stop_watch_handle_events(u16t event, void *data)
656 773
 				stopwatch_screen.hr = 0;
657 774
 			};
658 775
 			if (stopwatch_screen.csec % 10 == 0)
659
-				update_stop_watch_screen(&stopwatch_screen);
776
+				draw_stop_watch_screen(&stopwatch_screen);
777
+				//update_stop_watch_screen(&stopwatch_screen);
778
+			return EVENT_RET_HANDLED;
660 779
 			break;
661 780
 		default:
781
+			return EVENT_RET_UNHANDLED;
662 782
 			break;
663 783
 	};
784
+	return EVENT_RET_HANDLED;
664 785
 }
665 786
 
666 787
 
... ...
@@ -671,39 +792,42 @@ void draw_alarm_screen(void)
671 792
 {
672 793
 	hal_lcd_clear_display();
673 794
 
674
-//	SetFont(MetaWatch16);
675
-//	WriteLcdString(2, 2, "ALARM !");
676 795
 	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
677 796
 
678
-
679 797
 	hal_lcd_update_display();
680 798
 }
681 799
 
682
-void alarm_handle_events(u16t event, void *data)
800
+event_ret_t alarm_handle_events(uint16_t event, void *data)
683 801
 {
684 802
 	switch (event) {
685 803
 		case EVENT_SCREEN_VISIBLE:
686 804
 			draw_alarm_screen();
687 805
 			hal_enable_halfsecond_timer();
688 806
 			hal_vibration_set_state(TRUE);
807
+			return EVENT_RET_HANDLED;
689 808
 			break;
690 809
 		case EVENT_SCREEN_DESTROY:
691 810
 			hal_disable_halfsecond_timer();
692 811
 			hal_lcd_set_backlight(FALSE);
693 812
 			hal_vibration_set_state(FALSE);
813
+			return EVENT_RET_HANDLED;
694 814
 			break;
695 815
 		case EVENT_USER_BUTTONS:
696 816
 			dbg_out("button event %d\n", *(int *)data);
697 817
 			// hal_lcd_set_backlight(FALSE);
818
+			return EVENT_RET_HANDLED;
698 819
 			break;
699 820
 		case EVENT_HALF_SEC_TIMER:
700 821
 			hal_lcd_set_backlight(!hal_lcd_get_backlight());
701 822
 			hal_vibration_set_state(!hal_vibration_get_state());
702 823
 			dbg_out("timer\n");
824
+			return EVENT_RET_HANDLED;
703 825
 			break;
704 826
 		default:
827
+			return EVENT_RET_UNHANDLED;
705 828
 			break;
706 829
 	};
830
+	return EVENT_RET_HANDLED;
707 831
 }
708 832
 
709 833
 
... ...
@@ -711,13 +835,15 @@ void alarm_handle_events(u16t event, void *data)
711 835
  * Bluetooth screen
712 836
  */
713 837
 typedef struct {
714
-	u8t pos;
838
+	uint8_t pos;
715 839
 	boolean bt_en;
840
+	boolean set_mode;
716 841
 	boolean on;
717 842
 } bluetooth_data_t;
718 843
 static bluetooth_data_t bluetooth_screen = {
719 844
 	0,
720 845
 	FALSE,
846
+	FALSE,
721 847
 	TRUE
722 848
 };
723 849
 
... ...
@@ -733,40 +859,40 @@ void draw_bluetooth_screen(bluetooth_data_t *sdata)
733 859
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
734 860
 	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
735 861
 
736
-	SetFont(MetaWatch5);
737
-	WriteLcdString(2, 30, "Enable:");
862
+	oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
738 863
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
739
-		WriteLcdCharacter(45, 30, bluetooth_screen.bt_en ? 'x' : '_');
864
+		oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
740 865
 	}
741
-	WriteLcdString(2, 39, "State:");
866
+	oswald_write_string(1, 40, FONT_DROID8x12, "State:");
742 867
 	switch (hal_bluetooth_get_state()) {
743 868
 		case BLUETOOTH_OFF:
744
-			WriteLcdString(45, 39, "off");
869
+			oswald_write_string(53, 40, FONT_DROID8x12, "off");
745 870
 			break;
746 871
 		case BLUETOOTH_ON:
747
-			WriteLcdString(45, 39, "on");
872
+			oswald_write_string(53, 40, FONT_DROID8x12, "on");
748 873
 			break;
749 874
 		case BLUETOOTH_CONNECTED:
750
-			WriteLcdString(45, 39, "conn.");
875
+			oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
751 876
 			break;
752 877
 		default:
753 878
 			break;
754 879
 	};
880
+	oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
881
+	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
882
+		oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
883
+	}
884
+
755 885
 	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
756 886
 		bd_addr = hal_bluetooth_get_local_bdaddr();
757 887
 		snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
758
-		WriteLcdString(2, 48, bstr);
888
+		oswald_write_string(2, 85, FONT_5x7, bstr);
759 889
 	} else {
760 890
 	}
761
-	WriteLcdString(2, 57, "Visible:");
762
-	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
763
-		WriteLcdCharacter(45, 57, hal_bluetooth_get_visible() ? 'x' : '_');
764
-	}
765 891
 
766 892
 	hal_lcd_update_display();
767 893
 }
768 894
 
769
-void bluetooth_handle_updown(u8t pos, s8t incr)
895
+void bluetooth_handle_updown(uint8_t pos, int8_t incr)
770 896
 {
771 897
 	switch (pos) {
772 898
 		case 0:
... ...
@@ -804,26 +930,44 @@ void bluetooth_handle_updown(u8t pos, s8t incr)
804 930
 	};
805 931
 }
806 932
 
807
-void handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
933
+event_ret_t handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
808 934
 {
809
-	switch (button) {
810
-		case BUTTON_A:
811
-			bluetooth_handle_updown(sdata->pos, 1);
812
-			break;
813
-		case BUTTON_B:
814
-			bluetooth_handle_updown(sdata->pos, -1);
815
-			break;
816
-		case BUTTON_F:
817
-			sdata->pos++;
818
-			sdata->pos %= 2;
819
-			break;
820
-		default:
821
-			break;
935
+	if (bluetooth_screen.set_mode) {
936
+		switch (button) {
937
+			case BUTTON_A:
938
+				bluetooth_handle_updown(sdata->pos, 1);
939
+				break;
940
+			case BUTTON_B:
941
+				bluetooth_handle_updown(sdata->pos, -1);
942
+				break;
943
+			case BUTTON_C:
944
+				sdata->pos++;
945
+				sdata->pos %= 2;
946
+				break;
947
+			case BUTTON_F:
948
+				bluetooth_screen.set_mode = FALSE;
949
+				break;
950
+			default:
951
+				return EVENT_RET_UNHANDLED;
952
+				break;
953
+		}
954
+	} else {
955
+		switch (button) {
956
+			case BUTTON_F:
957
+				bluetooth_screen.set_mode = TRUE;
958
+				break;
959
+			default:
960
+				return EVENT_RET_UNHANDLED;
961
+				break;
962
+		}
822 963
 	}
964
+
823 965
 	draw_bluetooth_screen(sdata);
966
+
967
+	return EVENT_RET_HANDLED;
824 968
 }
825 969
 
826
-void bluetooth_screen_events(u16t event, void *data)
970
+event_ret_t bluetooth_screen_events(uint16_t event, void *data)
827 971
 {
828 972
 	switch (event) {
829 973
 		case EVENT_SCREEN_VISIBLE:
... ...
@@ -837,17 +981,22 @@ void bluetooth_screen_events(u16t event, void *data)
837 981
 			break;
838 982
 		case EVENT_USER_BUTTONS:
839 983
 			dbg_out("button event %d\n", *(int *)data);
840
-			handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
984
+			return handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
841 985
 			break;
842 986
 		case EVENT_HALF_SEC_TIMER:
843
-			if (bluetooth_screen.on)
844
-				bluetooth_screen.on = FALSE;
845
-			else
987
+			if (bluetooth_screen.set_mode) {
988
+				if (bluetooth_screen.on)
989
+					bluetooth_screen.on = FALSE;
990
+				else
991
+					bluetooth_screen.on = TRUE;
992
+			} else
846 993
 				bluetooth_screen.on = TRUE;
847 994
 			draw_bluetooth_screen(&bluetooth_screen);
848 995
 			break;
849 996
 		default:
997
+			return EVENT_RET_UNHANDLED;
850 998
 			break;
851 999
 	};
1000
+	return EVENT_RET_HANDLED;
852 1001
 }
853 1002
 
Browse code

Starting to get rid of borrowed code (LcdDisplay, Fonts), integrate new fonts and stuff

Nils Faerber authored on 28/04/2013 22:38:41
Showing 1 changed files
... ...
@@ -3,20 +3,46 @@
3 3
 #include "oswald.h"
4 4
 #include "oswald_main.h"
5 5
 #include "oswald_watch_faces.h"
6
-#include "Fonts.h"
7
-#include "LcdDisplay.h"
6
+#include "oswald_graphics.h"
8 7
 #include "oswald_hal.h"
9 8
 
10 9
 #include "oswald_screens.h"
11 10
 
12
-#include "timesetup_icon.xbm"
13
-#include "stopwatch_icon.xbm"
14
-#include "alarm_icon.xbm"
15
-#include "startstopbutton_icon.xbm"
16
-#include "lapsebutton_icon.xbm"
17
-#include "upbutton_icon.xbm"
18
-#include "downbutton_icon.xbm"
19
-#include "Bluetooth_icon.xbm"
11
+#include "LcdDisplay.h"
12
+#include "Fonts.h"
13
+
14
+#if defined(__GNUC__) && (__MSP430X__ > 0)
15
+__attribute__((__far__))
16
+#endif
17
+#include "bitmaps/timesetup_icon.xbm"
18
+#if defined(__GNUC__) && (__MSP430X__ > 0)
19
+__attribute__((__far__))
20
+#endif
21
+#include "bitmaps/stopwatch_icon.xbm"
22
+#if defined(__GNUC__) && (__MSP430X__ > 0)
23
+__attribute__((__far__))
24
+#endif
25
+#include "bitmaps/alarm_icon.xbm"
26
+#if defined(__GNUC__) && (__MSP430X__ > 0)
27
+__attribute__((__far__))
28
+#endif
29
+#include "bitmaps/startstopbutton_icon.xbm"
30
+#if defined(__GNUC__) && (__MSP430X__ > 0)
31
+__attribute__((__far__))
32
+#endif
33
+#include "bitmaps/lapsebutton_icon.xbm"
34
+#if defined(__GNUC__) && (__MSP430X__ > 0)
35
+__attribute__((__far__))
36
+#endif
37
+#include "bitmaps/upbutton_icon.xbm"
38
+#if defined(__GNUC__) && (__MSP430X__ > 0)
39
+__attribute__((__far__))
40
+#endif
41
+#include "bitmaps/downbutton_icon.xbm"
42
+#if defined(__GNUC__) && (__MSP430X__ > 0)
43
+__attribute__((__far__))
44
+#endif
45
+#include "bitmaps/Bluetooth_icon.xbm"
20 46
 
21 47
 
22 48
 typedef struct {
... ...
@@ -87,17 +113,20 @@ static accelscreen_data_t accel_screen = {
87 113
 void draw_accel_screen(accel_data_t *accel_data)
88 114
 {
89 115
 	hal_lcd_clear_display();
90
-	SetFont(MetaWatch16);
91
-	WriteLcdString(2, 2, "X:");
92
-	WriteLcdNumber(20, 2, accel_data->x);
93
-	WriteLcdString(2, 18, "Y:");
94
-	WriteLcdNumber(20, 18, accel_data->y);
95
-	WriteLcdString(2, 34, "Z:");
96
-	WriteLcdNumber(20, 34, accel_data->z);
97 116
 
98
-	WriteLcdString(2, 54, "Light:");
99
-	WriteLcdNumber(40, 54, accel_data->z);
117
+	oswald_write_string(0, 2, FONT_7x12b, "X:");
118
+	oswald_write_number(20, 2, FONT_7x12b, accel_data->x);
119
+	oswald_write_string(0, 18, FONT_7x12b, "Y:");
120
+	oswald_write_number(20, 18, FONT_7x12b, accel_data->y);
121
+#if 0
122
+	oswald_write_string(0, 34, FONT_8x12, "Z:");
123
+	oswald_write_number(20, 34, FONT_8x12, accel_data->z);
100 124
 
125
+	oswald_write_string(0, 54, FONT_12x16, "Light:");
126
+	oswald_write_number(50, 54, FONT_12x16, accel_data->z);
127
+
128
+	oswald_write_string(0, 70, FONT_12x20, "23:59");
129
+#endif
101 130
 	hal_lcd_update_display();
102 131
 }
103 132
 
... ...
@@ -136,8 +165,7 @@ static datetime_setup_data_t dt_setup_screen = {
136 165
 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
137 166
 {
138 167
 	hal_lcd_clear_display();
139
-//	SetFont(MetaWatch16);
140
-//	WriteLcdString(2, 2, "Set");
168
+
141 169
 	oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
142 170
 
143 171
 	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
... ...
@@ -154,14 +182,7 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
154 182
 		WriteLcdCharacter(31, 30, (OswaldClk.minute / 10));
155 183
 		WriteLcdCharacter(43, 30, (OswaldClk.minute % 10));
156 184
 	}
157
-/*
158
-	WriteLcdCharacter(55, 20, TIME_CHARACTER_COLON_INDEX);
159 185
 
160
-	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
161
-		WriteLcdCharacter(60, 20, (OswaldClk.second / 10));
162
-		WriteLcdCharacter(72, 20, (OswaldClk.second % 10));
163
-	}
164
-*/
165 186
 	SetFont(MetaWatch16);
166 187
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
167 188
 		WriteLcdCharacter(59, 36, 0x30 + (OswaldClk.second / 10));
Browse code

Bluetooth handling, screen reworks for icons

Nils Faerber authored on 21/04/2013 23:10:13
Showing 1 changed files
... ...
@@ -9,6 +9,15 @@
9 9
 
10 10
 #include "oswald_screens.h"
11 11
 
12
+#include "timesetup_icon.xbm"
13
+#include "stopwatch_icon.xbm"
14
+#include "alarm_icon.xbm"
15
+#include "startstopbutton_icon.xbm"
16
+#include "lapsebutton_icon.xbm"
17
+#include "upbutton_icon.xbm"
18
+#include "downbutton_icon.xbm"
19
+#include "Bluetooth_icon.xbm"
20
+
12 21
 
13 22
 typedef struct {
14 23
 	void (*screendraw_func)(boolean show_seconds);
... ...
@@ -85,6 +94,10 @@ void draw_accel_screen(accel_data_t *accel_data)
85 94
 	WriteLcdNumber(20, 18, accel_data->y);
86 95
 	WriteLcdString(2, 34, "Z:");
87 96
 	WriteLcdNumber(20, 34, accel_data->z);
97
+
98
+	WriteLcdString(2, 54, "Light:");
99
+	WriteLcdNumber(40, 54, accel_data->z);
100
+
88 101
 	hal_lcd_update_display();
89 102
 }
90 103
 
... ...
@@ -123,57 +136,67 @@ static datetime_setup_data_t dt_setup_screen = {
123 136
 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
124 137
 {
125 138
 	hal_lcd_clear_display();
126
-	SetFont(MetaWatch16);
127
-	WriteLcdString(2, 2, "Set");
139
+//	SetFont(MetaWatch16);
140
+//	WriteLcdString(2, 2, "Set");
141
+	oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
142
+
143
+	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
144
+	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
128 145
 
129 146
 	SetFont(MetaWatchTime);
130 147
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
131
-		WriteLcdCharacter(2, 20, (OswaldClk.hour / 10));
132
-		WriteLcdCharacter(14, 20, (OswaldClk.hour % 10));
148
+		WriteLcdCharacter(2, 30, (OswaldClk.hour / 10));
149
+		WriteLcdCharacter(14, 30, (OswaldClk.hour % 10));
133 150
 	}
134
-	WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
151
+	WriteLcdCharacter(26, 30, TIME_CHARACTER_COLON_INDEX);
135 152
 
136 153
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
137
-		WriteLcdCharacter(31, 20, (OswaldClk.minute / 10));
138
-		WriteLcdCharacter(43, 20, (OswaldClk.minute % 10));
154
+		WriteLcdCharacter(31, 30, (OswaldClk.minute / 10));
155
+		WriteLcdCharacter(43, 30, (OswaldClk.minute % 10));
139 156
 	}
140
-
157
+/*
141 158
 	WriteLcdCharacter(55, 20, TIME_CHARACTER_COLON_INDEX);
142 159
 
143 160
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
144 161
 		WriteLcdCharacter(60, 20, (OswaldClk.second / 10));
145 162
 		WriteLcdCharacter(72, 20, (OswaldClk.second % 10));
146 163
 	}
147
-
164
+*/
148 165
 	SetFont(MetaWatch16);
166
+	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
167
+		WriteLcdCharacter(59, 36, 0x30 + (OswaldClk.second / 10));
168
+		WriteLcdCharacter(66, 36, 0x30 + (OswaldClk.second % 10));
169
+	}
170
+
171
+
149 172
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
150
-		WriteLcdNumber(2, 45, OswaldClk.day);
173
+		WriteLcdNumber(2, 55, OswaldClk.day);
151 174
 	}
152
-	WriteLcdString(18, 45, ".");
175
+	WriteLcdString(18, 55, ".");
153 176
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
154
-		WriteLcdNumber(22, 45, OswaldClk.month);
177
+		WriteLcdNumber(22, 55, OswaldClk.month);
155 178
 	}
156
-	WriteLcdString(38, 45, ".");
179
+	WriteLcdString(38, 55, ".");
157 180
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
158
-		WriteLcdNumber(42, 45, OswaldClk.year);
181
+		WriteLcdNumber(42, 55, OswaldClk.year);
159 182
 	}
160 183
 
161 184
 	SetFont(MetaWatch7);
162 185
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
163 186
 		if (OswaldClk.clk24hr)
164
-			WriteLcdString(2, 66, "x");
187
+			WriteLcdString(2, 76, "x");
165 188
 		else
166
-			WriteLcdString(2, 66, "_");
189
+			WriteLcdString(2, 76, "_");
167 190
 	}
168
-	WriteLcdString(15, 66, "24hr");
191
+	WriteLcdString(15, 76, "24hr");
169 192
 
170 193
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
171 194
 		if (OswaldClk.day_first)
172
-			WriteLcdString(2, 79, "x");
195
+			WriteLcdString(2, 89, "x");
173 196
 		else
174
-			WriteLcdString(2, 79, "_");
197
+			WriteLcdString(2, 89, "_");
175 198
 	}
176
-	WriteLcdString(15, 79, "dd.mm.  mm/dd");
199
+	WriteLcdString(15, 89, "dd.mm.  mm/dd");
177 200
 
178 201
 	hal_lcd_update_display();
179 202
 }
... ...
@@ -290,6 +313,11 @@ void datetime_setup_events(u16t event, void *data)
290 313
 	};
291 314
 }
292 315
 
316
+
317
+/*
318
+ * Alarm setup
319
+ */
320
+
293 321
 typedef struct {
294 322
 	u8t pos;
295 323
 	boolean on;
... ...
@@ -303,63 +331,47 @@ void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
303 331
 {
304 332
 	hal_lcd_clear_display();
305 333
 
306
-	SetFont(MetaWatch16);
307
-	WriteLcdString(2, 2, "Alarm");
334
+	oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
335
+
336
+	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
337
+	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
308 338
 
309 339
 	SetFont(MetaWatchTime);
310 340
 	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
311
-		WriteLcdCharacter(2, 20, (OswaldAlarm.hour / 10));
312
-		WriteLcdCharacter(14, 20, (OswaldAlarm.hour % 10));
341
+		WriteLcdCharacter(22, 30, (OswaldAlarm.hour / 10));
342
+		WriteLcdCharacter(34, 30, (OswaldAlarm.hour % 10));
313 343
 	}
314
-	WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
344
+	WriteLcdCharacter(46, 30, TIME_CHARACTER_COLON_INDEX);
315 345
 
316 346
 	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
317
-		WriteLcdCharacter(31, 20, (OswaldAlarm.minute / 10));
318
-		WriteLcdCharacter(43, 20, (OswaldAlarm.minute % 10));
347
+		WriteLcdCharacter(51, 30, (OswaldAlarm.minute / 10));
348
+		WriteLcdCharacter(63, 30, (OswaldAlarm.minute % 10));
319 349
 	}
320 350
 
321 351
 	SetFont(MetaWatchMonospaced10);
322
-	WriteLcdCharacter(3, 45, 'S');
323
-	WriteLcdCharacter(15, 45, 'M');
324
-	WriteLcdCharacter(27, 45, 'T');
325
-	WriteLcdCharacter(39, 45, 'W');
326
-	WriteLcdCharacter(51, 45, 'T');
327
-	WriteLcdCharacter(63, 45, 'F');
328
-	WriteLcdCharacter(75, 45, 'S');
352
+	WriteLcdCharacter(3, 55, 'S');
353
+	WriteLcdCharacter(15, 55, 'M');
354
+	WriteLcdCharacter(27, 55, 'T');
355
+	WriteLcdCharacter(39, 55, 'W');
356
+	WriteLcdCharacter(51, 55, 'T');
357
+	WriteLcdCharacter(63, 55, 'F');
358
+	WriteLcdCharacter(75, 55, 'S');
329 359
 
330 360
 	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
331
-		WriteLcdCharacter(3, 55, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
361
+		WriteLcdCharacter(3, 65, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
332 362
 	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
333
-		WriteLcdCharacter(15, 55, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
363
+		WriteLcdCharacter(15, 65, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
334 364
 	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
335
-		WriteLcdCharacter(27, 55, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
365
+		WriteLcdCharacter(27, 65, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
336 366
 	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
337
-		WriteLcdCharacter(39, 55, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
367
+		WriteLcdCharacter(39, 65, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
338 368
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
339
-		WriteLcdCharacter(51, 55, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
369
+		WriteLcdCharacter(51, 65, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
340 370
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
341
-		WriteLcdCharacter(63, 55, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
371
+		WriteLcdCharacter(63, 65, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
342 372
 	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
343
-		WriteLcdCharacter(75, 55, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
373
+		WriteLcdCharacter(75, 65, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
344 374
 
345
-#if 0
346
-	SetFont(MetaWatch7);
347
-	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
348
-		if (OswaldClk.clk24hr)
349
-			WriteLcdString(2, 66, "x");
350
-		else
351
-			WriteLcdString(2, 66, "_");
352
-	}
353
-	WriteLcdString(15, 66, "24hr");
354
-
355
-	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
356
-		if (OswaldClk.day_first)
357
-			WriteLcdString(2, 79, "x");
358
-		else
359
-			WriteLcdString(2, 79, "_");
360
-	}
361
-	WriteLcdString(15, 79, "dd.mm.  mm/dd");
362
-#endif
363 375
 	hal_lcd_update_display();
364 376
 }
365 377
 
... ...
@@ -457,6 +469,10 @@ void alarm_setup_events(u16t event, void *data)
457 469
 }
458 470
 
459 471
 
472
+/*
473
+ * Test menu
474
+ */
475
+
460 476
 typedef struct {
461 477
 	u8t menu_pos;
462 478
 } test_menu_t;
... ...
@@ -512,6 +528,10 @@ void test_menu_handle_events(u16t event, void *data)
512 528
 }
513 529
 
514 530
 
531
+/*
532
+ * Stop Watch
533
+ */
534
+
515 535
 typedef struct {
516 536
 	u8t hr;
517 537
 	u8t min;
... ...
@@ -531,36 +551,19 @@ static void update_stop_watch_screen(stopwatch_data_t *sdata)
531 551
 	char tstr[16];
532 552
 	SetFont(MetaWatchMonospaced10);
533 553
 
534
-#if 0
535
-	WriteLcdNumber(0, 30, sdata->hr);
536
-	WriteLcdCharacter(14, 30, ':');
537
-	WriteLcdNumber(19, 30, sdata->min);
538
-	WriteLcdCharacter(33, 30, ':');
539
-	WriteLcdNumber(38, 30, sdata->sec);
540
-	WriteLcdCharacter(52, 30, '.');
541
-	WriteLcdNumber(57, 30, sdata->csec / 10);
542
-
543
-	WriteLcdNumber(0, 50, sdata->lapse_hr);
544
-	WriteLcdCharacter(14, 50, ':');
545
-	WriteLcdNumber(19, 50, sdata->lapse_min);
546
-	WriteLcdCharacter(33, 50, ':');
547
-	WriteLcdNumber(38, 50, sdata->lapse_sec);
548
-	WriteLcdCharacter(52, 50, '.');
549
-	WriteLcdNumber(57, 50, sdata->lapse_csec / 10);
550
-#else
551 554
 	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
552
-	WriteLcdString(0, 30, tstr);
555
+	WriteLcdString(5, 40, tstr);
553 556
 	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
554
-	WriteLcdString(0, 50, tstr);
555
-#endif
557
+	WriteLcdString(5, 60, tstr);
556 558
 
557 559
 	hal_lcd_update_display();
558 560
 }
559 561
 
560 562
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
561 563
 {
562
-	SetFont(MetaWatch16);
563
-	WriteLcdString(2, 5, "StopWatch");
564
+	oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
565
+	oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
566
+	oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
564 567
 
565 568
 	update_stop_watch_screen(sdata);
566 569
 }
... ...
@@ -640,12 +643,17 @@ void stop_watch_handle_events(u16t event, void *data)
640 643
 }
641 644
 
642 645
 
646
+/*
647
+ * when alarm is fired
648
+ */
643 649
 void draw_alarm_screen(void)
644 650
 {
645 651
 	hal_lcd_clear_display();
646 652
 
647
-	SetFont(MetaWatch16);
648
-	WriteLcdString(2, 2, "ALARM !");
653
+//	SetFont(MetaWatch16);
654
+//	WriteLcdString(2, 2, "ALARM !");
655
+	oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
656
+
649 657
 
650 658
 	hal_lcd_update_display();
651 659
 }
... ...
@@ -677,3 +685,148 @@ void alarm_handle_events(u16t event, void *data)
677 685
 	};
678 686
 }
679 687
 
688
+
689
+/*
690
+ * Bluetooth screen
691
+ */
692
+typedef struct {
693
+	u8t pos;
694
+	boolean bt_en;
695
+	boolean on;
696
+} bluetooth_data_t;
697
+static bluetooth_data_t bluetooth_screen = {
698
+	0,
699
+	FALSE,
700
+	TRUE
701
+};
702
+
703
+void draw_bluetooth_screen(bluetooth_data_t *sdata)
704
+{
705
+	char bstr[20];
706
+	uint8_t *bd_addr;
707
+
708
+	hal_lcd_clear_display();
709
+
710
+	oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
711
+
712
+	oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
713
+	oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
714
+
715
+	SetFont(MetaWatch5);
716
+	WriteLcdString(2, 30, "Enable:");
717
+	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
718
+		WriteLcdCharacter(45, 30, bluetooth_screen.bt_en ? 'x' : '_');
719
+	}
720
+	WriteLcdString(2, 39, "State:");
721
+	switch (hal_bluetooth_get_state()) {
722
+		case BLUETOOTH_OFF:
723
+			WriteLcdString(45, 39, "off");
724
+			break;
725
+		case BLUETOOTH_ON:
726
+			WriteLcdString(45, 39, "on");
727
+			break;
728
+		case BLUETOOTH_CONNECTED:
729
+			WriteLcdString(45, 39, "conn.");
730
+			break;
731
+		default:
732
+			break;
733
+	};
734
+	if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
735
+		bd_addr = hal_bluetooth_get_local_bdaddr();
736
+		snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
737
+		WriteLcdString(2, 48, bstr);
738
+	} else {
739
+	}
740
+	WriteLcdString(2, 57, "Visible:");
741
+	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
742
+		WriteLcdCharacter(45, 57, hal_bluetooth_get_visible() ? 'x' : '_');
743
+	}
744
+
745
+	hal_lcd_update_display();
746
+}
747
+
748
+void bluetooth_handle_updown(u8t pos, s8t incr)
749
+{
750
+	switch (pos) {
751
+		case 0:
752
+			if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
753
+				hal_bluetooth_set_state(BLUETOOTH_OFF);
754
+				bluetooth_screen.bt_en = FALSE;
755
+			} else {
756
+				hal_bluetooth_set_state(BLUETOOTH_ON);
757
+				bluetooth_screen.bt_en = TRUE;
758
+			}
759
+			break;
760
+		case 1:
761
+			if (hal_bluetooth_get_state() >= BLUETOOTH_ON && !hal_bluetooth_get_visible()) {
762
+				hal_bluetooth_set_visible(TRUE);
763
+			} else {
764
+				hal_bluetooth_set_visible(FALSE);
765
+			}
766
+			break;
767
+		case 2:
768
+			break;
769
+		case 3:
770
+			break;
771
+		case 4:
772
+			break;
773
+		case 5:
774
+			break;
775
+		case 6:
776
+			break;
777
+		case 7:
778
+			break;
779
+		case 8:
780
+			break;
781
+		default:
782
+			break;
783
+	};
784
+}
785
+
786
+void handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
787
+{
788
+	switch (button) {
789
+		case BUTTON_A:
790
+			bluetooth_handle_updown(sdata->pos, 1);
791
+			break;
792
+		case BUTTON_B:
793
+			bluetooth_handle_updown(sdata->pos, -1);
794
+			break;
795
+		case BUTTON_F:
796
+			sdata->pos++;
797
+			sdata->pos %= 2;
798
+			break;
799
+		default:
800
+			break;
801
+	}
802
+	draw_bluetooth_screen(sdata);
803
+}
804
+
805
+void bluetooth_screen_events(u16t event, void *data)
806
+{
807
+	switch (event) {
808
+		case EVENT_SCREEN_VISIBLE:
809
+			bluetooth_screen.pos = 0;
810
+			bluetooth_screen.bt_en = (hal_bluetooth_get_state() > 0);
811
+			draw_bluetooth_screen(&bluetooth_screen);
812
+			hal_enable_halfsecond_timer();
813
+			break;
814
+		case EVENT_SCREEN_DESTROY:
815
+			hal_disable_halfsecond_timer();
816
+			break;
817
+		case EVENT_USER_BUTTONS:
818
+			dbg_out("button event %d\n", *(int *)data);
819
+			handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
820
+			break;
821
+		case EVENT_HALF_SEC_TIMER:
822
+			if (bluetooth_screen.on)
823
+				bluetooth_screen.on = FALSE;
824
+			else
825
+				bluetooth_screen.on = TRUE;
826
+			draw_bluetooth_screen(&bluetooth_screen);
827
+			break;
828
+		default:
829
+			break;
830
+	};
831
+}
832
+
Browse code

Oh boy... lots of changes, too many to describe

Nils Faerber authored on 21/04/2013 14:26:38
Showing 1 changed files
... ...
@@ -1,8 +1,11 @@
1
+#include <stdio.h>
2
+
1 3
 #include "oswald.h"
2 4
 #include "oswald_main.h"
3 5
 #include "oswald_watch_faces.h"
4 6
 #include "Fonts.h"
5 7
 #include "LcdDisplay.h"
8
+#include "oswald_hal.h"
6 9
 
7 10
 #include "oswald_screens.h"
8 11
 
... ...
@@ -14,7 +17,7 @@ typedef struct {
14 17
 } idle_data_t;
15 18
 static idle_data_t idle_screen = {
16 19
 	DrawLcdDigitalClock,
17
-	FALSE,
20
+	TRUE,
18 21
 	FALSE,
19 22
 };
20 23
  
... ...
@@ -36,7 +39,7 @@ void idle_handle_user_buttons(watch_button button)
36 39
 				idle_screen.screendraw_func = DrawLcdAnaClock;
37 40
 			};
38 41
 			break;
39
-		case BUTTON_D:
42
+		case BUTTON_F:
40 43
 			OswaldState.screen_id = DATETIME_SETTING_SCREEN;
41 44
 			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
42 45
 			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
... ...
@@ -74,7 +77,7 @@ static accelscreen_data_t accel_screen = {
74 77
 
75 78
 void draw_accel_screen(accel_data_t *accel_data)
76 79
 {
77
-	lcd_clear_display();
80
+	hal_lcd_clear_display();
78 81
 	SetFont(MetaWatch16);
79 82
 	WriteLcdString(2, 2, "X:");
80 83
 	WriteLcdNumber(20, 2, accel_data->x);
... ...
@@ -82,7 +85,7 @@ void draw_accel_screen(accel_data_t *accel_data)
82 85
 	WriteLcdNumber(20, 18, accel_data->y);
83 86
 	WriteLcdString(2, 34, "Z:");
84 87
 	WriteLcdNumber(20, 34, accel_data->z);
85
-	lcd_update_display();
88
+	hal_lcd_update_display();
86 89
 }
87 90
 
88 91
 void accel_handle_events(u16t event, void *data)
... ...
@@ -119,7 +122,7 @@ static datetime_setup_data_t dt_setup_screen = {
119 122
 
120 123
 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
121 124
 {
122
-	lcd_clear_display();
125
+	hal_lcd_clear_display();
123 126
 	SetFont(MetaWatch16);
124 127
 	WriteLcdString(2, 2, "Set");
125 128
 
... ...
@@ -172,7 +175,7 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
172 175
 	}
173 176
 	WriteLcdString(15, 79, "dd.mm.  mm/dd");
174 177
 
175
-	lcd_update_display();
178
+	hal_lcd_update_display();
176 179
 }
177 180
 
178 181
 void datetime_handle_updown(u8t pos, s8t incr)
... ...
@@ -235,6 +238,10 @@ void datetime_handle_updown(u8t pos, s8t incr)
235 238
 		default:
236 239
 			break;
237 240
 	};
241
+	if (pos == 2)
242
+		hal_set_rtc(&OswaldClk, TRUE);
243
+	else
244
+		hal_set_rtc(&OswaldClk, FALSE);
238 245
 }
239 246
 
240 247
 void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
... ...
@@ -246,7 +253,7 @@ void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *s
246 253
 		case BUTTON_B:
247 254
 			datetime_handle_updown(sdata->pos, -1);
248 255
 			break;
249
-		case BUTTON_D:
256
+		case BUTTON_F:
250 257
 			sdata->pos++;
251 258
 			sdata->pos %= 8;
252 259
 			break;
... ...
@@ -260,11 +267,12 @@ void datetime_setup_events(u16t event, void *data)
260 267
 {
261 268
 	switch (event) {
262 269
 		case EVENT_SCREEN_VISIBLE:
270
+			dt_setup_screen.pos = 0;
263 271
 			draw_datetime_setup_screen(&dt_setup_screen);
264
-			enable_halfsecond_timer();
272
+			hal_enable_halfsecond_timer();
265 273
 			break;
266 274
 		case EVENT_SCREEN_DESTROY:
267
-			disable_halfsecond_timer();
275
+			hal_disable_halfsecond_timer();
268 276
 			break;
269 277
 		case EVENT_USER_BUTTONS:
270 278
 			dbg_out("button event %d\n", *(int *)data);
... ...
@@ -282,6 +290,172 @@ void datetime_setup_events(u16t event, void *data)
282 290
 	};
283 291
 }
284 292
 
293
+typedef struct {
294
+	u8t pos;
295
+	boolean on;
296
+} alarm_setup_data_t;
297
+static alarm_setup_data_t alarm_setup_screen = {
298
+	0,
299
+	TRUE
300
+};
301
+
302
+void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
303
+{
304
+	hal_lcd_clear_display();
305
+
306
+	SetFont(MetaWatch16);
307
+	WriteLcdString(2, 2, "Alarm");
308
+
309
+	SetFont(MetaWatchTime);
310
+	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
311
+		WriteLcdCharacter(2, 20, (OswaldAlarm.hour / 10));
312
+		WriteLcdCharacter(14, 20, (OswaldAlarm.hour % 10));
313
+	}
314
+	WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
315
+
316
+	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
317
+		WriteLcdCharacter(31, 20, (OswaldAlarm.minute / 10));
318
+		WriteLcdCharacter(43, 20, (OswaldAlarm.minute % 10));
319
+	}
320
+
321
+	SetFont(MetaWatchMonospaced10);
322
+	WriteLcdCharacter(3, 45, 'S');
323
+	WriteLcdCharacter(15, 45, 'M');
324
+	WriteLcdCharacter(27, 45, 'T');
325
+	WriteLcdCharacter(39, 45, 'W');
326
+	WriteLcdCharacter(51, 45, 'T');
327
+	WriteLcdCharacter(63, 45, 'F');
328
+	WriteLcdCharacter(75, 45, 'S');
329
+
330
+	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
331
+		WriteLcdCharacter(3, 55, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
332
+	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
333
+		WriteLcdCharacter(15, 55, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
334
+	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
335
+		WriteLcdCharacter(27, 55, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
336
+	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
337
+		WriteLcdCharacter(39, 55, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
338
+	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
339
+		WriteLcdCharacter(51, 55, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
340
+	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
341
+		WriteLcdCharacter(63, 55, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
342
+	if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
343
+		WriteLcdCharacter(75, 55, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
344
+
345
+#if 0
346
+	SetFont(MetaWatch7);
347
+	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
348
+		if (OswaldClk.clk24hr)
349
+			WriteLcdString(2, 66, "x");
350
+		else
351
+			WriteLcdString(2, 66, "_");
352
+	}
353
+	WriteLcdString(15, 66, "24hr");
354
+
355
+	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
356
+		if (OswaldClk.day_first)
357
+			WriteLcdString(2, 79, "x");
358
+		else
359
+			WriteLcdString(2, 79, "_");
360
+	}
361
+	WriteLcdString(15, 79, "dd.mm.  mm/dd");
362
+#endif
363
+	hal_lcd_update_display();
364
+}
365
+
366
+void alarm_handle_updown(u8t pos, s8t incr)
367
+{
368
+	switch (pos) {
369
+		case 0: // hour
370
+			if (OswaldAlarm.hour == 0 && incr == -1) {
371
+				OswaldAlarm.hour = 23;
372
+				break;
373
+			};
374
+			OswaldAlarm.hour += incr;
375
+			if (OswaldAlarm.hour > 23)
376
+				OswaldAlarm.hour = 0;
377
+			break;
378
+		case 1: // minute
379
+			if (OswaldAlarm.minute == 0 && incr == -1) {
380
+				OswaldAlarm.minute = 59;
381
+				break;
382
+			};
383
+			OswaldAlarm.minute += incr;
384
+			if (OswaldAlarm.minute > 59)
385
+				OswaldAlarm.minute = 0;
386
+			break;
387
+		case 2: // sunday
388
+			OswaldAlarm.wday ^= WDAY_SUNDAY;
389
+			break;
390
+		case 3: // monday
391
+			OswaldAlarm.wday ^= WDAY_MONDAY;
392
+			break;
393
+		case 4: // tuesday
394
+			OswaldAlarm.wday ^= WDAY_TUESDAY;
395
+			break;
396
+		case 5: // wednesday
397
+			OswaldAlarm.wday ^= WDAY_WEDNESDAY;
398
+			break;
399
+		case 6: // thursday
400
+			OswaldAlarm.wday ^= WDAY_THURSDAY;
401
+			break;
402
+		case 7: // friday
403
+			OswaldAlarm.wday ^= WDAY_FRIDAY;
404
+			break;
405
+		case 8: // saturday
406
+			OswaldAlarm.wday ^= WDAY_SATURDAY;
407
+			break;
408
+		default:
409
+			break;
410
+	};
411
+}
412
+
413
+void handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
414
+{
415
+	switch (button) {
416
+		case BUTTON_A:
417
+			alarm_handle_updown(sdata->pos, 1);
418
+			break;
419
+		case BUTTON_B:
420
+			alarm_handle_updown(sdata->pos, -1);
421
+			break;
422
+		case BUTTON_F:
423
+			sdata->pos++;
424
+			sdata->pos %= 9;
425
+			break;
426
+		default:
427
+			break;
428
+	}
429
+	draw_alarm_setup_screen(sdata);
430
+}
431
+
432
+void alarm_setup_events(u16t event, void *data)
433
+{
434
+	switch (event) {
435
+		case EVENT_SCREEN_VISIBLE:
436
+			alarm_setup_screen.pos = 0;
437
+			draw_alarm_setup_screen(&alarm_setup_screen);
438
+			hal_enable_halfsecond_timer();
439
+			break;
440
+		case EVENT_SCREEN_DESTROY:
441
+			hal_disable_halfsecond_timer();
442
+			break;
443
+		case EVENT_USER_BUTTONS:
444
+			dbg_out("button event %d\n", *(int *)data);
445
+			handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
446
+			break;
447
+		case EVENT_HALF_SEC_TIMER:
448
+			if (alarm_setup_screen.on)
449
+				alarm_setup_screen.on = FALSE;
450
+			else
451
+				alarm_setup_screen.on = TRUE;
452
+			draw_alarm_setup_screen(&alarm_setup_screen);
453
+			break;
454
+		default:
455
+			break;
456
+	};
457
+}
458
+
285 459
 
286 460
 typedef struct {
287 461
 	u8t menu_pos;
... ...
@@ -290,7 +464,7 @@ static test_menu_t test_menu = { 0 };
290 464
 
291 465
 void draw_menu_test_screen(void)
292 466
 {
293
-	lcd_clear_display();
467
+	hal_lcd_clear_display();
294 468
 	SetFont(MetaWatch16);
295 469
 	WriteLcdString(2, 2, "Menu");
296 470
 	SetFont(MetaWatch7);
... ...
@@ -301,7 +475,7 @@ void draw_menu_test_screen(void)
301 475
 	WriteLcdString(2, 56, "Item 5");
302 476
 
303 477
 	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
304
-	lcd_update_display();
478
+	hal_lcd_update_display();
305 479
 }
306 480
 
307 481
 static void handle_menu_user_buttons(watch_button button)
... ...
@@ -354,8 +528,10 @@ static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
354 528
 
355 529
 static void update_stop_watch_screen(stopwatch_data_t *sdata)
356 530
 {
531
+	char tstr[16];
357 532
 	SetFont(MetaWatchMonospaced10);
358 533
 
534
+#if 0
359 535
 	WriteLcdNumber(0, 30, sdata->hr);
360 536
 	WriteLcdCharacter(14, 30, ':');
361 537
 	WriteLcdNumber(19, 30, sdata->min);
... ...
@@ -371,8 +547,14 @@ static void update_stop_watch_screen(stopwatch_data_t *sdata)
371 547
 	WriteLcdNumber(38, 50, sdata->lapse_sec);
372 548
 	WriteLcdCharacter(52, 50, '.');
373 549
 	WriteLcdNumber(57, 50, sdata->lapse_csec / 10);
374
-
375
-	lcd_update_display();
550
+#else
551
+	snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
552
+	WriteLcdString(0, 30, tstr);
553
+	snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
554
+	WriteLcdString(0, 50, tstr);
555
+#endif
556
+
557
+	hal_lcd_update_display();
376 558
 }
377 559
 
378 560
 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
... ...
@@ -388,10 +570,10 @@ static void handle_stop_watch_buttons(watch_button button)
388 570
 	switch (button) {
389 571
 		case BUTTON_A: // start/stop
390 572
 			if (stopwatch_screen.running) {
391
-				disable_centisecond_timer();
573
+				hal_disable_centisecond_timer();
392 574
 				stopwatch_screen.running = FALSE;
393 575
 			} else {
394
-				enable_centisecond_timer();
576
+				hal_enable_centisecond_timer();
395 577
 				stopwatch_screen.running = TRUE;
396 578
 			}
397 579
 			break;
... ...
@@ -401,7 +583,7 @@ static void handle_stop_watch_buttons(watch_button button)
401 583
 			stopwatch_screen.lapse_sec = stopwatch_screen.sec;
402 584
 			stopwatch_screen.lapse_csec = stopwatch_screen.csec;
403 585
 			break;
404
-		case BUTTON_D: // reset
586
+		case BUTTON_F: // reset
405 587
 			stopwatch_screen.hr = 0;
406 588
 			stopwatch_screen.min = 0;
407 589
 			stopwatch_screen.sec = 0;
... ...
@@ -425,11 +607,11 @@ void stop_watch_handle_events(u16t event, void *data)
425 607
 			update_stop_watch_screen(&stopwatch_screen);
426 608
 			break;
427 609
 		case EVENT_SCREEN_VISIBLE:
428
-			lcd_clear_display();
610
+			hal_lcd_clear_display();
429 611
 			draw_stop_watch_screen(&stopwatch_screen);
430 612
 			break;
431 613
 		case EVENT_SCREEN_DESTROY:
432
-			disable_centisecond_timer();
614
+			hal_disable_centisecond_timer();
433 615
 			stopwatch_screen.running = FALSE;
434 616
 			break;
435 617
 		case EVENT_CS_TIMER:
... ...
@@ -456,3 +638,42 @@ void stop_watch_handle_events(u16t event, void *data)
456 638
 			break;
457 639
 	};
458 640
 }
641
+
642
+
643
+void draw_alarm_screen(void)
644
+{
645
+	hal_lcd_clear_display();
646
+
647
+	SetFont(MetaWatch16);
648
+	WriteLcdString(2, 2, "ALARM !");
649
+
650
+	hal_lcd_update_display();
651
+}
652
+
653
+void alarm_handle_events(u16t event, void *data)
654
+{
655
+	switch (event) {
656
+		case EVENT_SCREEN_VISIBLE:
657
+			draw_alarm_screen();
658
+			hal_enable_halfsecond_timer();
659
+			hal_vibration_set_state(TRUE);
660
+			break;
661
+		case EVENT_SCREEN_DESTROY:
662
+			hal_disable_halfsecond_timer();
663
+			hal_lcd_set_backlight(FALSE);
664
+			hal_vibration_set_state(FALSE);
665
+			break;
666
+		case EVENT_USER_BUTTONS:
667
+			dbg_out("button event %d\n", *(int *)data);
668
+			// hal_lcd_set_backlight(FALSE);
669
+			break;
670
+		case EVENT_HALF_SEC_TIMER:
671
+			hal_lcd_set_backlight(!hal_lcd_get_backlight());
672
+			hal_vibration_set_state(!hal_vibration_get_state());
673
+			dbg_out("timer\n");
674
+			break;
675
+		default:
676
+			break;
677
+	};
678
+}
679
+
Browse code

Add fixes for it to work properly on microcontroller

Nils Faerber authored on 19/03/2013 19:22:58
Showing 1 changed files
... ...
@@ -82,6 +82,7 @@ void draw_accel_screen(accel_data_t *accel_data)
82 82
 	WriteLcdNumber(20, 18, accel_data->y);
83 83
 	WriteLcdString(2, 34, "Z:");
84 84
 	WriteLcdNumber(20, 34, accel_data->z);
85
+	lcd_update_display();
85 86
 }
86 87
 
87 88
 void accel_handle_events(u16t event, void *data)
... ...
@@ -170,6 +171,8 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
170 171
 			WriteLcdString(2, 79, "_");
171 172
 	}
172 173
 	WriteLcdString(15, 79, "dd.mm.  mm/dd");
174
+
175
+	lcd_update_display();
173 176
 }
174 177
 
175 178
 void datetime_handle_updown(u8t pos, s8t incr)
... ...
@@ -298,6 +301,7 @@ void draw_menu_test_screen(void)
298 301
 	WriteLcdString(2, 56, "Item 5");
299 302
 
300 303
 	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
304
+	lcd_update_display();
301 305
 }
302 306
 
303 307
 static void handle_menu_user_buttons(watch_button button)
... ...
@@ -333,3 +337,122 @@ void test_menu_handle_events(u16t event, void *data)
333 337
 	};
334 338
 }
335 339
 
340
+
341
+typedef struct {
342
+	u8t hr;
343
+	u8t min;
344
+	u8t sec;
345
+	u8t csec;
346
+	u8t lapse_hr;
347
+	u8t lapse_min;
348
+	u8t lapse_sec;
349
+	u8t lapse_csec;
350
+	boolean running;
351
+} stopwatch_data_t;
352
+static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
353
+
354
+
355
+static void update_stop_watch_screen(stopwatch_data_t *sdata)
356
+{
357
+	SetFont(MetaWatchMonospaced10);
358
+
359
+	WriteLcdNumber(0, 30, sdata->hr);
360
+	WriteLcdCharacter(14, 30, ':');
361
+	WriteLcdNumber(19, 30, sdata->min);
362
+	WriteLcdCharacter(33, 30, ':');
363
+	WriteLcdNumber(38, 30, sdata->sec);
364
+	WriteLcdCharacter(52, 30, '.');
365
+	WriteLcdNumber(57, 30, sdata->csec / 10);
366
+
367
+	WriteLcdNumber(0, 50, sdata->lapse_hr);
368
+	WriteLcdCharacter(14, 50, ':');
369
+	WriteLcdNumber(19, 50, sdata->lapse_min);
370
+	WriteLcdCharacter(33, 50, ':');
371
+	WriteLcdNumber(38, 50, sdata->lapse_sec);
372
+	WriteLcdCharacter(52, 50, '.');
373
+	WriteLcdNumber(57, 50, sdata->lapse_csec / 10);
374
+
375
+	lcd_update_display();
376
+}
377
+
378
+static void draw_stop_watch_screen(stopwatch_data_t *sdata)
379
+{
380
+	SetFont(MetaWatch16);
381
+	WriteLcdString(2, 5, "StopWatch");
382
+
383
+	update_stop_watch_screen(sdata);
384
+}
385
+
386
+static void handle_stop_watch_buttons(watch_button button)
387
+{
388
+	switch (button) {
389
+		case BUTTON_A: // start/stop
390
+			if (stopwatch_screen.running) {
391
+				disable_centisecond_timer();
392
+				stopwatch_screen.running = FALSE;
393
+			} else {
394
+				enable_centisecond_timer();
395
+				stopwatch_screen.running = TRUE;
396
+			}
397
+			break;
398
+		case BUTTON_B: // lapse
399
+			stopwatch_screen.lapse_hr = stopwatch_screen.hr;
400
+			stopwatch_screen.lapse_min = stopwatch_screen.min;
401
+			stopwatch_screen.lapse_sec = stopwatch_screen.sec;
402
+			stopwatch_screen.lapse_csec = stopwatch_screen.csec;
403
+			break;
404
+		case BUTTON_D: // reset
405
+			stopwatch_screen.hr = 0;
406
+			stopwatch_screen.min = 0;
407
+			stopwatch_screen.sec = 0;
408
+			stopwatch_screen.csec = 0;
409
+			stopwatch_screen.lapse_hr = 0;
410
+			stopwatch_screen.lapse_min = 0;
411
+			stopwatch_screen.lapse_sec = 0;
412
+			stopwatch_screen.lapse_csec = 0;
413
+			break;
414
+		default:
415
+			break;
416
+	}
417
+}
418
+
419
+void stop_watch_handle_events(u16t event, void *data)
420
+{
421
+	switch (event) {
422
+		case EVENT_USER_BUTTONS:
423
+			dbg_out("button event %d\n", *(int *)data);
424
+			handle_stop_watch_buttons(*(watch_button *)data);
425
+			update_stop_watch_screen(&stopwatch_screen);
426
+			break;
427
+		case EVENT_SCREEN_VISIBLE:
428
+			lcd_clear_display();
429
+			draw_stop_watch_screen(&stopwatch_screen);
430
+			break;
431
+		case EVENT_SCREEN_DESTROY:
432
+			disable_centisecond_timer();
433
+			stopwatch_screen.running = FALSE;
434
+			break;
435
+		case EVENT_CS_TIMER:
436
+			stopwatch_screen.csec++;
437
+			if (stopwatch_screen.csec > 99) {
438
+				stopwatch_screen.csec = 0;
439
+				stopwatch_screen.sec++;
440
+			};
441
+			if (stopwatch_screen.sec > 59) {
442
+				stopwatch_screen.sec = 0;
443
+				stopwatch_screen.min++;
444
+			};
445
+			if (stopwatch_screen.min > 59) {
446
+				stopwatch_screen.min = 0;
447
+				stopwatch_screen.hr++;
448
+			};
449
+			if (stopwatch_screen.hr > 59) {
450
+				stopwatch_screen.hr = 0;
451
+			};
452
+			if (stopwatch_screen.csec % 10 == 0)
453
+				update_stop_watch_screen(&stopwatch_screen);
454
+			break;
455
+		default:
456
+			break;
457
+	};
458
+}
Browse code

Countless fixes and enhancements

Nils Faerber authored on 12/08/2012 21:14:19
Showing 1 changed files
... ...
@@ -1,12 +1,14 @@
1 1
 #include "oswald.h"
2
+#include "oswald_main.h"
2 3
 #include "oswald_watch_faces.h"
3 4
 #include "Fonts.h"
4 5
 #include "LcdDisplay.h"
5 6
 
6 7
 #include "oswald_screens.h"
7 8
 
9
+
8 10
 typedef struct {
9
-	void (*screendraw_func)(boolean shoq_seconds);
11
+	void (*screendraw_func)(boolean show_seconds);
10 12
 	boolean show_seconds;
11 13
 	boolean analogue;
12 14
 } idle_data_t;
... ...
@@ -19,13 +21,13 @@ static idle_data_t idle_screen = {
19 21
 void idle_handle_user_buttons(watch_button button)
20 22
 {
21 23
 	switch (button) {
22
-		case BUTTON_D:
24
+		case BUTTON_A:
23 25
 			if (idle_screen.show_seconds)
24 26
 				idle_screen.show_seconds = FALSE;
25 27
 			else
26 28
 				idle_screen.show_seconds = TRUE;
27 29
 			break;
28
-		case BUTTON_E:
30
+		case BUTTON_B:
29 31
 			if (idle_screen.analogue == TRUE) {
30 32
 				idle_screen.analogue = FALSE;
31 33
 				idle_screen.screendraw_func = DrawLcdDigitalClock;
... ...
@@ -34,6 +36,12 @@ void idle_handle_user_buttons(watch_button button)
34 36
 				idle_screen.screendraw_func = DrawLcdAnaClock;
35 37
 			};
36 38
 			break;
39
+		case BUTTON_D:
40
+			OswaldState.screen_id = DATETIME_SETTING_SCREEN;
41
+			OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
42
+			OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
43
+			return;
44
+			break;
37 45
 		default:
38 46
 			break;
39 47
 	};
... ...
@@ -57,23 +65,38 @@ void idle_handle_events(u16t event, void *data)
57 65
 }
58 66
 
59 67
 
60
-void draw_accel_screen(void)
68
+typedef struct {
69
+	accel_data_t accdata;
70
+} accelscreen_data_t;
71
+static accelscreen_data_t accel_screen = {
72
+	{ 0, 0, 0},
73
+};
74
+
75
+void draw_accel_screen(accel_data_t *accel_data)
61 76
 {
62 77
 	lcd_clear_display();
63 78
 	SetFont(MetaWatch16);
64 79
 	WriteLcdString(2, 2, "X:");
65
-	WriteLcdString(20, 2, "123");
66
-	WriteLcdString(2, 18, "Z:");
67
-	WriteLcdString(20, 18, "123");
68
-	WriteLcdString(2, 34, "Y:");
69
-	WriteLcdString(20, 34, "123");
80
+	WriteLcdNumber(20, 2, accel_data->x);
81
+	WriteLcdString(2, 18, "Y:");
82
+	WriteLcdNumber(20, 18, accel_data->y);
83
+	WriteLcdString(2, 34, "Z:");
84
+	WriteLcdNumber(20, 34, accel_data->z);
70 85
 }
71 86
 
72 87
 void accel_handle_events(u16t event, void *data)
73 88
 {
74 89
 	switch (event) {
75 90
 		case EVENT_SCREEN_VISIBLE:
76
-			draw_accel_screen();
91
+			draw_accel_screen(&accel_screen.accdata);
92
+			break;
93
+		case EVENT_ACCEL_UPDATE: {
94
+			accel_data_t *accel_data = (accel_data_t *)data;
95
+			accel_screen.accdata.x = accel_data->x;
96
+			accel_screen.accdata.y = accel_data->y;
97
+			accel_screen.accdata.z = accel_data->z;
98
+			draw_accel_screen(&accel_screen.accdata);
99
+			};
77 100
 			break;
78 101
 		case EVENT_USER_BUTTONS:
79 102
 			dbg_out("button event %d\n", *(int *)data);
... ...
@@ -84,24 +107,172 @@ void accel_handle_events(u16t event, void *data)
84 107
 }
85 108
 
86 109
 
87
-void draw_datetime_setup_screen(void)
110
+typedef struct {
111
+	u8t pos;
112
+	boolean on;
113
+} datetime_setup_data_t;
114
+static datetime_setup_data_t dt_setup_screen = {
115
+	0,
116
+	TRUE
117
+};
118
+
119
+void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
88 120
 {
89 121
 	lcd_clear_display();
90 122
 	SetFont(MetaWatch16);
91
-	WriteLcdString(2, 2, "Date / Time");
92
-	WriteLcdString(2, 18, "Setting");
93
-	WriteLcdString(2, 34, "22:39");
94
-	WriteLcdString(2, 50, "07.08.2012");
123
+	WriteLcdString(2, 2, "Set");
124
+
125
+	SetFont(MetaWatchTime);
126
+	if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
127
+		WriteLcdCharacter(2, 20, (OswaldClk.hour / 10));
128
+		WriteLcdCharacter(14, 20, (OswaldClk.hour % 10));
129
+	}
130
+	WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
131
+
132
+	if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
133
+		WriteLcdCharacter(31, 20, (OswaldClk.minute / 10));
134
+		WriteLcdCharacter(43, 20, (OswaldClk.minute % 10));
135
+	}
136
+
137
+	WriteLcdCharacter(55, 20, TIME_CHARACTER_COLON_INDEX);
138
+
139
+	if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
140
+		WriteLcdCharacter(60, 20, (OswaldClk.second / 10));
141
+		WriteLcdCharacter(72, 20, (OswaldClk.second % 10));
142
+	}
143
+
144
+	SetFont(MetaWatch16);
145
+	if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
146
+		WriteLcdNumber(2, 45, OswaldClk.day);
147
+	}
148
+	WriteLcdString(18, 45, ".");
149
+	if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
150
+		WriteLcdNumber(22, 45, OswaldClk.month);
151
+	}
152
+	WriteLcdString(38, 45, ".");
153
+	if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
154
+		WriteLcdNumber(42, 45, OswaldClk.year);
155
+	}
156
+
157
+	SetFont(MetaWatch7);
158
+	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
159
+		if (OswaldClk.clk24hr)
160
+			WriteLcdString(2, 66, "x");
161
+		else
162
+			WriteLcdString(2, 66, "_");
163
+	}
164
+	WriteLcdString(15, 66, "24hr");
165
+
166
+	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
167
+		if (OswaldClk.day_first)
168
+			WriteLcdString(2, 79, "x");
169
+		else
170
+			WriteLcdString(2, 79, "_");
171
+	}
172
+	WriteLcdString(15, 79, "dd.mm.  mm/dd");
173
+}
174
+
175
+void datetime_handle_updown(u8t pos, s8t incr)
176
+{
177
+	switch (pos) {
178
+		case 0: // hour
179
+			if (OswaldClk.hour == 0 && incr == -1) {
180
+				OswaldClk.hour = 23;
181
+				break;
182
+			};
183
+			OswaldClk.hour += incr;
184
+			if (OswaldClk.hour > 23)
185
+				OswaldClk.hour = 0;
186
+			break;
187
+		case 1: // minute
188
+			if (OswaldClk.minute == 0 && incr == -1) {
189
+				OswaldClk.minute = 59;
190
+				break;
191
+			};
192
+			OswaldClk.minute += incr;
193
+			if (OswaldClk.minute > 59)
194
+				OswaldClk.minute = 0;
195
+			break;
196
+		case 2: // second
197
+			OswaldClk.second = 0;
198
+			break;
199
+		case 3: // day
200
+			if (OswaldClk.day == 1 && incr == -1) {
201
+				OswaldClk.day = 31;
202
+				break;
203
+			};
204
+			OswaldClk.day += incr;
205
+			if (OswaldClk.day > 31)
206
+				OswaldClk.day = 1;
207
+			break;
208
+		case 4: // month
209
+			if (OswaldClk.month == 1 && incr == -1) {
210
+				OswaldClk.month = 12;
211
+				break;
212
+			};
213
+			OswaldClk.month += incr;
214
+			if (OswaldClk.month > 12)
215
+				OswaldClk.month = 1;
216
+			break;
217
+		case 5: // year
218
+			OswaldClk.year += incr;
219
+			break;
220
+		case 6: // 24hr / 12hr
221
+			if (OswaldClk.clk24hr)
222
+				OswaldClk.clk24hr = FALSE;
223
+			else
224
+				OswaldClk.clk24hr = TRUE;
225
+			break;
226
+		case 7: // dd.mm. / mm/dd
227
+			if (OswaldClk.day_first)
228
+				OswaldClk.day_first = FALSE;
229
+			else
230
+				OswaldClk.day_first = TRUE;
231
+			break;
232
+		default:
233
+			break;
234
+	};
235
+}
236
+
237
+void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
238
+{
239
+	switch (button) {
240
+		case BUTTON_A:
241
+			datetime_handle_updown(sdata->pos, 1);
242
+			break;
243
+		case BUTTON_B:
244
+			datetime_handle_updown(sdata->pos, -1);
245
+			break;
246
+		case BUTTON_D:
247
+			sdata->pos++;
248
+			sdata->pos %= 8;
249
+			break;
250
+		default:
251
+			break;
252
+	}
253
+	draw_datetime_setup_screen(sdata);
95 254
 }
96 255
 
97 256
 void datetime_setup_events(u16t event, void *data)
98 257
 {
99 258
 	switch (event) {
100 259
 		case EVENT_SCREEN_VISIBLE:
101
-			draw_datetime_setup_screen();
260
+			draw_datetime_setup_screen(&dt_setup_screen);
261
+			enable_halfsecond_timer();
262
+			break;
263
+		case EVENT_SCREEN_DESTROY:
264
+			disable_halfsecond_timer();
102 265
 			break;
103 266
 		case EVENT_USER_BUTTONS:
104 267
 			dbg_out("button event %d\n", *(int *)data);
268
+			handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
269
+			break;
270
+		case EVENT_HALF_SEC_TIMER:
271
+			if (dt_setup_screen.on)
272
+				dt_setup_screen.on = FALSE;
273
+			else
274
+				dt_setup_screen.on = TRUE;
275
+			draw_datetime_setup_screen(&dt_setup_screen);
105 276
 			break;
106 277
 		default:
107 278
 			break;
Browse code

Make idle selectable

Nils Faerber authored on 12/08/2012 02:11:30
Showing 1 changed files
... ...
@@ -5,24 +5,58 @@
5 5
 
6 6
 #include "oswald_screens.h"
7 7
 
8
+typedef struct {
9
+	void (*screendraw_func)(boolean shoq_seconds);
10
+	boolean show_seconds;
11
+	boolean analogue;
12
+} idle_data_t;
13
+static idle_data_t idle_screen = {
14
+	DrawLcdDigitalClock,
15
+	FALSE,
16
+	FALSE,
17
+};
18
+ 
8 19
 void idle_handle_user_buttons(watch_button button)
9 20
 {
21
+	switch (button) {
22
+		case BUTTON_D:
23
+			if (idle_screen.show_seconds)
24
+				idle_screen.show_seconds = FALSE;
25
+			else
26
+				idle_screen.show_seconds = TRUE;
27
+			break;
28
+		case BUTTON_E:
29
+			if (idle_screen.analogue == TRUE) {
30
+				idle_screen.analogue = FALSE;
31
+				idle_screen.screendraw_func = DrawLcdDigitalClock;
32
+			} else {
33
+				idle_screen.analogue = TRUE;
34
+				idle_screen.screendraw_func = DrawLcdAnaClock;
35
+			};
36
+			break;
37
+		default:
38
+			break;
39
+	};
40
+	idle_screen.screendraw_func(idle_screen.show_seconds);
10 41
 }
42
+
11 43
 void idle_handle_events(u16t event, void *data)
12 44
 {
13 45
 	switch (event) {
14 46
 		case EVENT_ONE_SEC_TIMER:
15 47
 		case EVENT_SCREEN_VISIBLE:
16
-			DrawLcdDigitalClock();
48
+			idle_screen.screendraw_func(idle_screen.show_seconds);
17 49
 			break;
18 50
 		case EVENT_USER_BUTTONS:
19 51
 			dbg_out("button event %d\n", *(int *)data);
52
+			idle_handle_user_buttons(*(watch_button *)data);
20 53
 			break;
21 54
 		default:
22 55
 			break;
23 56
 	};
24 57
 }
25 58
 
59
+
26 60
 void draw_accel_screen(void)
27 61
 {
28 62
 	lcd_clear_display();
... ...
@@ -34,6 +68,7 @@ void draw_accel_screen(void)
34 68
 	WriteLcdString(2, 34, "Y:");
35 69
 	WriteLcdString(20, 34, "123");
36 70
 }
71
+
37 72
 void accel_handle_events(u16t event, void *data)
38 73
 {
39 74
 	switch (event) {
... ...
@@ -48,6 +83,7 @@ void accel_handle_events(u16t event, void *data)
48 83
 	};
49 84
 }
50 85
 
86
+
51 87
 void draw_datetime_setup_screen(void)
52 88
 {
53 89
 	lcd_clear_display();
... ...
@@ -57,6 +93,7 @@ void draw_datetime_setup_screen(void)
57 93
 	WriteLcdString(2, 34, "22:39");
58 94
 	WriteLcdString(2, 50, "07.08.2012");
59 95
 }
96
+
60 97
 void datetime_setup_events(u16t event, void *data)
61 98
 {
62 99
 	switch (event) {
... ...
@@ -71,7 +108,11 @@ void datetime_setup_events(u16t event, void *data)
71 108
 	};
72 109
 }
73 110
 
74
-static u8t test_menu_pos = 0;
111
+
112
+typedef struct {
113
+	u8t menu_pos;
114
+} test_menu_t;
115
+static test_menu_t test_menu = { 0 };
75 116
 
76 117
 void draw_menu_test_screen(void)
77 118
 {
... ...
@@ -85,19 +126,19 @@ void draw_menu_test_screen(void)
85 126
 	WriteLcdString(2, 47, "Item 4");
86 127
 	WriteLcdString(2, 56, "Item 5");
87 128
 
88
-	WriteLcdString(50, 20+(9*test_menu_pos), "*");
129
+	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
89 130
 }
90 131
 
91 132
 static void handle_menu_user_buttons(watch_button button)
92 133
 {
93 134
 	switch (button) {
94 135
 		case BUTTON_A:
95
-			test_menu_pos--;
96
-			test_menu_pos%=5;
136
+			test_menu.menu_pos--;
137
+			test_menu.menu_pos%=5;
97 138
 			break;
98 139
 		case BUTTON_B:
99
-			test_menu_pos++;
100
-			test_menu_pos%=5;
140
+			test_menu.menu_pos++;
141
+			test_menu.menu_pos%=5;
101 142
 			break;
102 143
 		default:
103 144
 			break;
... ...
@@ -113,7 +154,7 @@ void test_menu_handle_events(u16t event, void *data)
113 154
 			handle_menu_user_buttons(*(watch_button *)data);
114 155
 			break;
115 156
 		case EVENT_SCREEN_VISIBLE:
116
-			test_menu_pos = 0;
157
+			test_menu.menu_pos = 0;
117 158
 			draw_menu_test_screen();
118 159
 			break;
119 160
 		default:
Browse code

Redesign to an event based handling

Nils Faerber authored on 07/08/2012 22:09:29
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,123 @@
1
+#include "oswald.h"
2
+#include "oswald_watch_faces.h"
3
+#include "Fonts.h"
4
+#include "LcdDisplay.h"
5
+
6
+#include "oswald_screens.h"
7
+
8
+void idle_handle_user_buttons(watch_button button)
9
+{
10
+}
11
+void idle_handle_events(u16t event, void *data)
12
+{
13
+	switch (event) {
14
+		case EVENT_ONE_SEC_TIMER:
15
+		case EVENT_SCREEN_VISIBLE:
16
+			DrawLcdDigitalClock();
17
+			break;
18
+		case EVENT_USER_BUTTONS:
19
+			dbg_out("button event %d\n", *(int *)data);
20
+			break;
21
+		default:
22
+			break;
23
+	};
24
+}
25
+
26
+void draw_accel_screen(void)
27
+{
28
+	lcd_clear_display();
29
+	SetFont(MetaWatch16);
30
+	WriteLcdString(2, 2, "X:");
31
+	WriteLcdString(20, 2, "123");
32
+	WriteLcdString(2, 18, "Z:");
33
+	WriteLcdString(20, 18, "123");
34
+	WriteLcdString(2, 34, "Y:");
35
+	WriteLcdString(20, 34, "123");
36
+}
37
+void accel_handle_events(u16t event, void *data)
38
+{
39
+	switch (event) {
40
+		case EVENT_SCREEN_VISIBLE:
41
+			draw_accel_screen();
42
+			break;
43
+		case EVENT_USER_BUTTONS:
44
+			dbg_out("button event %d\n", *(int *)data);
45
+			break;
46
+		default:
47
+			break;
48
+	};
49
+}
50
+
51
+void draw_datetime_setup_screen(void)
52
+{
53
+	lcd_clear_display();
54
+	SetFont(MetaWatch16);
55
+	WriteLcdString(2, 2, "Date / Time");
56
+	WriteLcdString(2, 18, "Setting");
57
+	WriteLcdString(2, 34, "22:39");
58
+	WriteLcdString(2, 50, "07.08.2012");
59
+}
60
+void datetime_setup_events(u16t event, void *data)
61
+{
62
+	switch (event) {
63
+		case EVENT_SCREEN_VISIBLE:
64
+			draw_datetime_setup_screen();
65
+			break;
66
+		case EVENT_USER_BUTTONS:
67
+			dbg_out("button event %d\n", *(int *)data);
68
+			break;
69
+		default:
70
+			break;
71
+	};
72
+}
73
+
74
+static u8t test_menu_pos = 0;
75
+
76
+void draw_menu_test_screen(void)
77
+{
78
+	lcd_clear_display();
79
+	SetFont(MetaWatch16);
80
+	WriteLcdString(2, 2, "Menu");
81
+	SetFont(MetaWatch7);
82
+	WriteLcdString(2, 20, "Item 1");
83
+	WriteLcdString(2, 29, "Item 2");
84
+	WriteLcdString(2, 38, "Item 3");
85
+	WriteLcdString(2, 47, "Item 4");
86
+	WriteLcdString(2, 56, "Item 5");
87
+
88
+	WriteLcdString(50, 20+(9*test_menu_pos), "*");
89
+}
90
+
91
+static void handle_menu_user_buttons(watch_button button)
92
+{
93
+	switch (button) {
94
+		case BUTTON_A:
95
+			test_menu_pos--;
96
+			test_menu_pos%=5;
97
+			break;
98
+		case BUTTON_B:
99
+			test_menu_pos++;
100
+			test_menu_pos%=5;
101
+			break;
102
+		default:
103
+			break;
104
+	}
105
+	draw_menu_test_screen();
106
+}
107
+
108
+void test_menu_handle_events(u16t event, void *data)
109
+{
110
+	switch (event) {
111
+		case EVENT_USER_BUTTONS:
112
+			dbg_out("button event %d\n", *(int *)data);
113
+			handle_menu_user_buttons(*(watch_button *)data);
114
+			break;
115
+		case EVENT_SCREEN_VISIBLE:
116
+			test_menu_pos = 0;
117
+			draw_menu_test_screen();
118
+			break;
119
+		default:
120
+			break;
121
+	};
122
+}
123
+