It took very little time to pull that together but getting it to be configurable by other people on various different devices was a nightmare.
The answers I came up with in the end were much simpler than anything else I tried.
If anyone wants to take a look at it, there is an spk at http://hudl.sgarman.net/public/spk/SJGclock001.spk
The code looks like
//global
var lastMinute;
var granularity = app.LoadNumber("granularity", 99);
var alarmHour = app.LoadNumber("alarmHour", 99);
var alarmMin = app.LoadNumber("alarmMin", 0);
var alarmOn = app.LoadBoolean("alarmOn", false);
var timout;// for use with clearTimeout
//Called when application is started
function OnStart() {
app.EnableBackKey(false);
//Create a layout with objects vertically centered.
lay = app.CreateLayout("linear", "VCenter,FillX");
// add top bar
lay_bar = app.CreateLayout("Linear", "Horizontal,Left, FillX");
lay_bar.SetBackColor("#222222");
speakTxt = app.CreateText(gran_message(granularity));
speakTxt.SetTextSize(16);
speakTxt.SetTextColor("#00ffff");
speakTxt.SetPadding(0.01, 0, 0.01, 0);
speakTxt.SetOnTouchUp(speakTxt_OnTouchUp);
lay_bar.AddChild(speakTxt);
msgTxt = app.CreateText("Alarm time");
msgTxt.SetTextSize(16);
// msgTxt.SetTextColor( "#ff00ff" );
msgTxt.SetPadding(0.01, 0, 0.01, 0);
lay_bar.AddChild(msgTxt);
txtAlarm = app.CreateText(populate_alarm());
txtAlarm.SetTextSize(16);
txtAlarm.SetTextColor("#ffff00");
txtAlarm.SetPadding(0.01, 0, 0.01, 0);
txtAlarm.SetOnTouchUp(txtAlarm_OnTouchUp);
lay_bar.AddChild(txtAlarm);
chkAlarm = app.CreateCheckBox("Alarm on");
chkAlarm.SetChecked(alarmOn);
lay_bar.AddChild(chkAlarm);
lay.AddChild(lay_bar);
//Create a text label and add it to layout.
txt = app.CreateText("");
txt.SetTextSize(64);
lay.AddChild(txt);
//Add layout to app.
app.AddLayout(lay);
pause = createAskDialog();
displayTime();
}
function displayTime() {
var d = new Date();
var minute = d.getMinutes();
//if no change, do nothing
if (minute != lastMinute) {
var hr = d.getHours();
var min = (("0" + minute).slice(-2));
txt.SetText(hr + ":" + min);
//speak as often as required
if ((granularity < 61) && (minute % granularity == 0)) {
app.TextToSpeech(hr + ". " + min);
}
lastMinute = minute;
if ((chkAlarm.GetChecked()) && (minute == alarmMin)
&& (hr == alarmHour)) {
app.TextToSpeech("Alarm sounding");
}
}
setTimeout(displayTime, 3000);
}
function speakTxt_OnTouchUp() {
//lstGran.SetVisibility("Show");
switch (granularity){
case 99: granularity=1;break;
case 1: granularity=5;break;
case 5: granularity=15;break;
case 15: granularity=30;break;
case 30: granularity=60;break;
case 60: granularity=99;break;
}
speakTxt.SetText(gran_message(granularity));
}
function gran_message() {
switch (granularity) {
case 60:
return "Speak every hour";
break;
case 30:
return "Speak at 30 mins";
break;
case 15:
return "Speak at 15 mins";
break;
case 5:
return "Speak at 5 mins";
break;
case 1:
return "Speak every minute";
break;
case 99:
return "No speech";
break;
}
}
//////
function populate_alarm() {
if (alarmHour > 24) {
var d = new Date();
alarmHour = d.getHours();
alarmMin = d.getMinutes();
}
return alarmHour + ":" + (("0" + alarmMin).slice(-2));
}
function txtAlarm_OnTouchUp() {
ask("Type a time (hh:mm)", txtAlarm.GetText());
}
function OnBack() {
//save current settings
app.SaveNumber("granularity", granularity);
app.SaveNumber("alarmHour", alarmHour);
app.SaveNumber("alarmMin", alarmMin);
app.SaveBoolean("alarmOn", chkAlarm.GetChecked());
//only exit if user presses Back again
//within 4 seconds
doubleBackKeyExit(4000);
}
function doubleBackKeyExit(millisecs) {
app.EnableBackKey(true);
app.ShowPopup("Press Back again to exit", "Bottom");
setTimeout(disableBackKey, millisecs);
}
function disableBackKey() {
app.EnableBackKey(false);
}
//Called when user touches Ok button.
function btnAskOk_OnTouch(){
tmp = edtAsk.GetText().split( ":");
if( tmp.length == 2 ){
tmphr = parseInt((tmp[0]).trim());
tmpmin = parseInt((tmp[1]).trim());
if( isFinite(tmphr) && isFinite(tmpmin)
&& (tmphr > -1) && (tmphr < 24)
&& (tmpmin > -1) && (tmpmin < 60) ){
alarmHour = tmphr;
alarmMin = tmpmin;
txtAlarm.SetText(populate_alarm());
}
}
unAsk();
}
/////////
//ask functionality
function createAskDialog( ){
//Create a layout for Ask dialog
layAsk = app.CreateLayout( "Linear", "FillXY" );
layAsk.SetPadding( 0, 0.1, 0, 0 );
layAsk.SetBackColor( "#dd008800" );
layAsk.SetPosition(0, 0, 0.5, 0.5);
layAsk.SetVisibility( "Hide" );
txtAsk = app.CreateText("");
layAsk.AddChild(txtAsk);
txtAsk.SetTextSize(12);
txtAsk.SetMargins( 0, 0, 0, 0.05 );
edtAsk = app.CreateTextEdit("");
edtAsk.SetMargins( 0, 0, 0, 0.05 )
layAsk.AddChild(edtAsk);
//Create button and add to layout.
btnAskOk = app.CreateButton( "Ok", 0.3, 0.06, "gray" );
btnAskOk.SetOnTouch( btnAskOk_OnTouch );
layAsk.AddChild( btnAskOk );
app.AddLayout(layAsk);
return true;
}
function ask(msg, dflt){
//open dialog
txtAsk.SetText( msg );
edtAsk.SetText( dflt );
layAsk.Animate("SlideFromTop");
}
function unAsk(){
//close dialog
app.HideKeyboard();//just in case
layAsk.Animate("SlideToTop");
}
////////
No comments:
Post a Comment