Can save and load jobs now. Needs a lot of testing...

This commit is contained in:
Stefan Persson 2011-02-10 16:28:27 +00:00
parent 9e54aa619c
commit 858737c1ad
5 changed files with 222 additions and 115 deletions

View file

@ -94,10 +94,10 @@ Rectangle{
onClicked: {
if (mouse.button == Qt.RightButton){
pointRect.toggleType()
dialog.show(pointRect)
//dialog.show(pointRect)
}
else{
dialog.show(pointRect)
//dialog.show(pointRect)
}
}
@ -288,11 +288,9 @@ Rectangle{
break;
}
}
if(index == activeStates.length){
index = 0; //return to beginning again
}
pointRect.state = activeStates[index];
}
@ -317,6 +315,9 @@ Rectangle{
}
function updateChanges(){
if(pointRect.deviceRow == null || (pointRect.deviceRow.isLoading != undefined && pointRect.deviceRow.isLoading())){
return; //loading values from storage, wait until everything is in place
}
Scripts.updateParentWithCurrentValues();
Scripts.updateChildPoints();
if(pointRect.triggerstate == "absolute"){
@ -373,9 +374,9 @@ Rectangle{
return [hours, partOfHour];
}
function addState(state){
function addActiveState(state){
//print("Adding state: " + state);
Scripts.addState(state);
Scripts.addActiveState(state);
}
function setActiveStates(activeStates){

View file

@ -435,7 +435,6 @@
Rectangle{
id: inputAbsoluteMinute
property alias absoluteMinute: inputAbsoluteMinuteText.text
width: 35
height: inputAbsoluteMinuteText.height
border.width: 1

View file

@ -15,10 +15,12 @@ com.telldus.schedulersimplegui = function() {
addJobsToSchedule: addJobsToSchedule,
getJob: getJob,
getMethodFromState: getMethodFromState,
getStateFromMethod: getStateFromMethod,
getSunRiseTime: getSunRiseTime,
getSunSetTime: getSunSetTime,
getSunData: getSunData,
getTypeFromTriggerstate: getTypeFromTriggerstate
getTypeFromTriggerstate: getTypeFromTriggerstate,
getTriggerstateFromType: getTriggerstateFromType
});
//devices:
@ -34,49 +36,8 @@ com.telldus.schedulersimplegui = function() {
//Listen for device-change
com.telldus.core.deviceChange.connect(deviceChange);
//points:
//from storage...
var weekPointList = new com.telldus.qml.array();
var dummypoint = {};
dummypoint["day"] = 0;
dummypoint["deviceId"] = 1;
weekPointList.push(dummypoint);
dummypoint = {};
dummypoint["day"] = 1;
dummypoint["deviceId"] = 2;
weekPointList.push(dummypoint);
var now = new Date();
var time1 = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds();
print(time1); // 48880
time2 = time1 + 30;
time3 = time1 - 60;
time1 = time1 + 50;
var startdate = now; //new Date(2011,0,5).getTime();
//var startdate2 = new Date(2011,0,5).getTime();
//ID = ID for storage
//Key is position in list, returned from "addJob"
//var execFunc = function(job){ print("Custom execute function running"); print("Job: " + job.v.name); return 42; };
var job = new com.telldus.scheduler.JobRecurringWeek({id: 4, executeFunc: null, name: "testnamn14", type: com.telldus.scheduler.JOBTYPE_RECURRING_WEEK, startdate: startdate, lastRun: 0, device: 1, method: 1, value: ""});
var event = {};
event.d = {id: 0, value: 3, fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 0, time: 300}; //(new Date().getTime())/1000 + 20
job.addEvent(event);
//job.addEvent(new Event({id: 0, value: "", fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 10, time: (new Date().getTime())/1000 + 20}));
var jobs = new Array();
jobs.push(job);
job = new com.telldus.scheduler.JobRecurringWeek({id: 4, executeFunc: null, name: "testnamn15", type: com.telldus.scheduler.JOBTYPE_RECURRING_WEEK, startdate: startdate, lastRun: 0, device: 1, method: 1, value: ""});
var event = {};
event.d = {id: 0, value: 3, fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 0, time: 100}; //(new Date().getTime())/1000 + 20
job.addEvent(event);
jobs.push(job);
//END FROM STORAGE
view.setProperty('weekPointList', weekPointList);
var storedPoints = loadJobs();
view.setProperty('storedPoints', storedPoints);
//set images:
view.setProperty("imageTriggerSunrise", "sunrise.png");
@ -110,9 +71,8 @@ com.telldus.schedulersimplegui = function() {
deviceList.push(item);
}
}
function addJobsToSchedule(points, deviceTimerKeys){
function addJobsToSchedule(deviceId, points, deviceTimerKeys){
//delete all current schedules for this device:
if(deviceTimerKeys != undefined){
for(var i=0;i<deviceTimerKeys.length;i++){
@ -128,14 +88,45 @@ com.telldus.schedulersimplegui = function() {
jobs.push(jobtemp);
}
print("Adding some jobs " + jobs.length);
saveJobs(deviceId, jobs);
//return [];
return com.telldus.scheduler.addJobs(jobs);
}
function saveJobs(deviceId, devicejobs){
var settings = new com.telldus.settings();
var jobs = settings.value("jobs", "");
if(!jobs || jobs == undefined){
jobs = {}; //initialize new setting
}
jobs[deviceId] = devicejobs;
settings.setValue("jobs", jobs);
}
function loadJobs(){
var settings = new com.telldus.settings();
var temp = settings.value("jobs", "");
return settings.value("jobs", "");
/*
//from storage...
var weekPointList = new com.telldus.qml.array();
var dummypoint = {};
dummypoint["day"] = 0;
dummypoint["deviceId"] = 1;
weekPointList.push(dummypoint);
dummypoint = {};
dummypoint["day"] = 1;
dummypoint["deviceId"] = 2;
weekPointList.push(dummypoint);
*/
}
function getJob(pointArray){ //deviceId, pointName, startdate, lastrun, pointMethod, pointDimValue, pointTime, pointType, pointFuzzinessBefore, pointFuzzinessAfter, pointOffset, pointDays
//var execFunc = function(job){ print("Custom execute function running"); print("Job: " + job.v.name); return 42; }; //TODO default later
//TODO dimValue 0-100 ok? Or other number expected?
var job = new com.telldus.scheduler.JobRecurringWeek({id: pointArray[0], executeFunc: null, name: pointArray[1], type: com.telldus.scheduler.JOBTYPE_RECURRING_WEEK, startdate: pointArray[2], lastRun: pointArray[3], device: pointArray[0], method: pointArray[4], value: pointArray[5]});
var job = new com.telldus.scheduler.JobRecurringWeek({id: pointArray[0], executeFunc: null, name: pointArray[1], type: com.telldus.scheduler.JOBTYPE_RECURRING_WEEK, startdate: pointArray[2], lastRun: pointArray[3], device: pointArray[0], method: pointArray[4], value: pointArray[5], absoluteTime: pointArray[12]});
var event = {};
var pointFuzzinessBefore = (pointArray[8]*60);
var pointFuzzinessAfter = (pointArray[9]*60);
@ -170,6 +161,23 @@ com.telldus.schedulersimplegui = function() {
return pointMethod;
}
function getStateFromMethod(pointMethod){
var state = "";
if(pointMethod == com.telldus.core.TELLSTICK_TURNON){
state = "on";
}
else if(pointMethod == com.telldus.core.TELLSTICK_TURNOFF){
state = "off";
}
else if(pointMethod == com.telldus.core.TELLSTICK_DIM){
state = "dim";
}
else if(pointMethod == com.telldus.core.TELLSTICK_BELL){
state = "bell";
}
return state;
}
function getSun(riseset, rowWidth, pointWidth){
var date = new Date();
var timevalues = com.telldus.suncalculator.riseset(date);
@ -212,6 +220,20 @@ com.telldus.schedulersimplegui = function() {
}
return type;
}
function getTriggerstateFromType(type){
var triggerstate = "";
if(type == com.telldus.scheduler.EVENTTYPE_SUNRISE){
triggerstate = "sunrise";
}
else if(type == com.telldus.scheduler.EVENTTYPE_SUNSET){
triggerstate = "sunset";
}
else{
triggerstate = "absolute";
}
return triggerstate;
}
return { //Public functions
init:init

View file

@ -27,7 +27,9 @@ import "schedulerscripts.js" as Scripts
dynamicDay.state = "visible" //set last one as visible
weekDayText.text = Scripts.getCurrentDayName()
//Scripts.updateDeviceIndex();
Scripts.initiatePointsInGUI();
Scripts.setLoading();
Scripts.initiateStoredPointsInGUI();
Scripts.endLoading();
Scripts.updateEndsWith();
}
@ -296,10 +298,10 @@ import "schedulerscripts.js" as Scripts
dynamicPoint.border.color = "blue"
//TODO different states depending on the device
dynamicPoint.addState("on");
dynamicPoint.addState("off");
dynamicPoint.addState("dim");
dynamicPoint.addState("bell");
dynamicPoint.addActiveState("on");
dynamicPoint.addActiveState("off");
dynamicPoint.addActiveState("dim");
dynamicPoint.addActiveState("bell");
//dynamicPoint.setFirstState("dim"); //when type is a stored value
dynamicPoint.setFirstState();
@ -314,10 +316,10 @@ import "schedulerscripts.js" as Scripts
dynamicPoint2.parentPoint = dynamicPoint
dynamicPoint2.x = dynamicPoint2.getAbsoluteXValue();
dynamicPoint2.border.color = "blue"
dynamicPoint2.addState("on");
dynamicPoint2.addState("off");
dynamicPoint2.addState("dim");
dynamicPoint2.addState("bell");
dynamicPoint2.addActiveState("on");
dynamicPoint2.addActiveState("off");
dynamicPoint2.addActiveState("dim");
dynamicPoint2.addActiveState("bell");
dynamicPoint2.setFirstState();
*/
//SLUT TEST
@ -361,6 +363,10 @@ import "schedulerscripts.js" as Scripts
function setChanged(){
Scripts.setChanged(deviceId, true);
}
function isLoading(){
return Scripts.isLoading();
}
}
//}
}
@ -421,8 +427,8 @@ import "schedulerscripts.js" as Scripts
text: "Save changes"
anchors.horizontalCenter: parent.horizontalCenter
anchors.horizontalCenterOffset: -30
anchors.top: mainContent.bottom
anchors.topMargin: 30
anchors.top: mainRow.bottom
anchors.topMargin: -100
onClicked: {
saveAll();
}
@ -537,12 +543,13 @@ import "schedulerscripts.js" as Scripts
function saveAll(){
print("Save all and reset jobs");
//var jobs = new Array();
var points = new Array();
//var points = new Array();
var days = Scripts.getDays();
if(dialog.dialogOpacity == 1){
Scripts.setChanged(dialog.actionPoint.deviceRow.deviceId, true); //set the devicerow that the currently visible dialog is connected to as dirty
}
for(var i=0;i<deviceModel.length;i++){
var points = new Array();
var deviceId = deviceModel.get(i).id;
if(!Scripts.hasChanged(deviceId)){
//no point has been updated, removed or added, ignore this device
@ -566,7 +573,7 @@ import "schedulerscripts.js" as Scripts
}
var deviceTimerKeys = Scripts.getDeviceTimerKeys(deviceId); //get timer keys for this device, for removal
deviceTimerKeys = addJobsToSchedule.callWith(points, deviceTimerKeys); //remove all schedules for this device, and add them again
deviceTimerKeys = addJobsToSchedule.callWith(deviceId, points, deviceTimerKeys); //remove all schedules for this device, and add them again
Scripts.setDeviceTimerKeys(deviceId, deviceTimerKeys); //save the new timer keys
}
}
@ -580,6 +587,7 @@ import "schedulerscripts.js" as Scripts
var pointMethod = getMethodFromState.callWith(point.state);
var pointTime = point.absoluteHour * 3600 + point.absoluteMinute * 60;
var absolutePointTime = pointTime;
var pointType = getTypeFromTriggerstate.callWith(point.triggerstate);
if(point.triggerstate == "sunrise"){
var suntime = main.sunData[0].split(':');
@ -598,7 +606,8 @@ import "schedulerscripts.js" as Scripts
var childPoints = point.getChildPoints();
for(var child in childPoints){
pointDays.push(childPoints[child].deviceRow.parent.parent.daydate.getDay()); //different per event
print("GOT DAY " + childPoints[child].deviceRow.parent.parent.daydate.getDay());
}
return new Array(deviceId, pointName, startdate, lastrun, pointMethod, pointDimValue, pointTime, pointType, pointFuzzinessBefore, pointFuzzinessAfter, pointOffset, pointDays);
return new Array(deviceId, pointName, startdate, lastrun, pointMethod, pointDimValue, pointTime, pointType, pointFuzzinessBefore, pointFuzzinessAfter, pointOffset, pointDays, absolutePointTime);
}
}

View file

@ -5,7 +5,7 @@ var deviceIndex = [];
//TODO active states - move to actionPoint-only-js file
var activeStates = new Array();
function addState(state){
function addActiveState(state){
activeStates.push(state);
}
@ -310,17 +310,82 @@ function assignContinuingBarProperties(deviceRow, previousEndPoint, dayIndex, fi
return previousEndPoint;
}
//Upstart:
function initiatePointsInGUI(){ //weekPointList){
//för varje point, addPointToGUI, men ju även lägga till schemajobb... alltså i __init__.js... men därifrån kan inte denna anropas...
//så det får väl bli varsin iteration då...
//weekPointList -> från __init__.js
//for(var i in weekPointList){
for(var i=0;i<weekPointList.length;i++){
addWeekPointToGUI(weekPointList.get(i));
//Init:
function initiateStoredPointsInGUI(){
var k = 0;
for(var devicekey in storedPoints){
for(var i=0;i<storedPoints[devicekey].length;i++){
k++;
print("ADDED POINTS: " + k);
addPointToGUI(devicekey, storedPoints[devicekey][i]);
}
}
}
function addPointToGUI(key, job){
if(job == undefined){
return;
}
var deviceId = key;
var jobdata = job.v;
var state = getStateFromMethod.callWith(jobdata.method);
var activeStates = new Array("on", "off", "dim", "bell"); //TODO get dynamically, depending on device...
var dimvalue = jobdata.value;
var absoluteTime = jobdata.absoluteTime;
var events = jobdata.events;
var parentPoint;
for(var key in events){
var eventdata = events[key].d;
var dayIndex = eventdata.value;
var dayOfWeek = getDayIndexForDayOfWeek(dayIndex); //set dayOfWeek to correct index in the days-table
print("Inserting point at: " + weekday_name_array[days[dayOfWeek].daydate.getDay()] + " (" + dayOfWeek + ")" + ", id: " + deviceId);
var pointParentDevice = getDeviceRow(dayOfWeek, deviceId);
var component = Qt.createComponent("ActionPoint.qml");
var dynamicPoint = component.createObject(pointParentDevice);
if(parentPoint == undefined){
//set common values
var time = getTimeFromSeconds(absoluteTime); //eventdata.time);
dynamicPoint.absoluteHour = time[0]; //same time for all
dynamicPoint.absoluteMinute = time[1]; //same time for all
dynamicPoint.triggerstate = getTriggerstateFromType.callWith(eventdata.type);
dynamicPoint.fuzzyBefore = eventdata.fuzzinessBefore/60;
dynamicPoint.fuzzyAfter = eventdata.fuzzinessAfter/60;
dynamicPoint.offset = eventdata.offset;
if(dynamicPoint.triggerstate == "absolute"){
dynamicPoint.x = dynamicPoint.getAbsoluteXValue();
}
dynamicPoint.setActiveStates(activeStates); //TODO: active states depending on the device (get this from __init__ etc)
dynamicPoint.setFirstState(state);
dynamicPoint.dimvalue = dimvalue;
parentPoint = dynamicPoint;
}
else{
dynamicPoint.parentPoint = parentPoint;
dynamicPoint.setActiveStates(parentPoint.getActiveStates());
parentPoint.addChildPoint(dayIndex, dynamicPoint);
}
dynamicPoint.border.color = "blue"; //default blue at the moment
}
updateChildPoints(parentPoint); //if any child points exists, update them with parent values
}
function getTimeFromSeconds(seconds){
var totalMinutes = seconds/60;
var minutes = totalMinutes%60;
var hours = Math.floor(totalMinutes/60);
return [hours, minutes];
}
//End init
function getDeviceRow(dayOfWeek, deviceId){
var dayListViewComp = days[dayOfWeek];
if(dayListViewComp == undefined){
@ -336,31 +401,8 @@ function getDeviceRow(dayOfWeek, deviceId){
return pointParent;
}
function addWeekPointToGUI(point){
var deviceId = point.deviceId;
var dayOfWeek = point.day;
//set dayOfWeek to correct index in the days-table
print("DayOfWeek again: " + dayOfWeek);
dayOfWeek = getDayIndexForDayOfWeek(dayOfWeek);
print("Inserting point at: " + weekday_name_array[days[dayOfWeek].daydate.getDay()] + " (" + dayOfWeek + ")" + ", id: " + deviceId);
var pointParent = getDeviceRow(dayOfWeek, deviceId);
var component = Qt.createComponent("ActionPoint.qml")
var dynamicPoint = component.createObject(pointParent)
dynamicPoint.absoluteHour = 12
dynamicPoint.absoluteMinute = 30
dynamicPoint.x = dynamicPoint.getAbsoluteXValue();
dynamicPoint.border.color = "blue"
dynamicPoint.addState("on");
dynamicPoint.addState("off");
dynamicPoint.addState("dim");
dynamicPoint.addState("bell");
dynamicPoint.setFirstState("dim");
//also: states, fuzzy * 2, trigger, offset, dimvalue
}
//per point
var childPoints = [];
var childPoints = {};
function getChildPoint(index){
//print("INDEX");
@ -373,6 +415,7 @@ function getChildPoints(){
}
function addChildPoint(index, point){
print("Adding child point " + point + " at " + index);
childPoints[index] = point;
}
@ -405,15 +448,34 @@ function updateParentsInChildList(newParentPoint){
}
function updateChildPoints(parentPoint){
for(var point in childPoints){
childPoints[point].absoluteHour = pointRect.absoluteHour;
childPoints[point].absoluteMinute = pointRect.absoluteMinute;
childPoints[point].fuzzyBefore = pointRect.fuzzyBefore;
childPoints[point].fuzzyAfter = pointRect.fuzzyAfter;
childPoints[point].offset = pointRect.offset;
childPoints[point].triggerstate = pointRect.triggerstate;
childPoints[point].dimvalue = pointRect.dimvalue;
childPoints[point].state = pointRect.state;
var children;
if(parentPoint != undefined){
children = parentPoint.getChildPoints();
}
else{
if(pointRect.parentPoint != undefined){
children = pointRect.parentPoint.getChildPoints();
parentPoint = pointRect.parentPoint;
}
else{
children = getChildPoints();
parentPoint = pointRect;
}
}
for(var point in children){
children[point].absoluteHour = parentPoint.absoluteHour;
children[point].absoluteMinute = parentPoint.absoluteMinute;
children[point].fuzzyBefore = parentPoint.fuzzyBefore;
children[point].fuzzyAfter = parentPoint.fuzzyAfter;
children[point].offset = parentPoint.offset;
children[point].triggerstate = parentPoint.triggerstate;
children[point].dimvalue = parentPoint.dimvalue;
children[point].state = parentPoint.state;
if(children[point].triggerstate == "absolute"){
children[point].x = children[point].getAbsoluteXValue();
}
}
}
@ -433,9 +495,22 @@ function updateParentWithCurrentValues(){
//end per point
//must be run in "main"
var loading = false;
function setLoading(){
loading = true;
}
function endLoading(){
loading = false;
}
function isLoading(){
return loading;
}
function getDayIndexForDayOfWeek(dayOfWeek){
var offset = days[0].daydate.getDay();
dayOfWeek = days.length - offset + dayOfWeek;
dayOfWeek = days.length - offset + parseInt(dayOfWeek);
if(dayOfWeek == -1){
dayOfWeek = days.length - 1;
}
@ -452,6 +527,7 @@ function getOffsetWeekdayName(index){
function getOffsetWeekday(index){
//TODO this can be modified based on locale, not adding 1 of week should start with sunday
index = parseInt(index);
index = index + 1;
if(index == weekday_name_array.length){
index = 0;
@ -507,10 +583,10 @@ function createChildPoint(index, pointRect, deviceId){
dynamicPoint.setActiveStates(pointRect.getActiveStates());
/*
dynamicPoint.addState("on"); //TODO, add same states as in pointRect
dynamicPoint.addState("off");
dynamicPoint.addState("dim");
dynamicPoint.addState("bell");
dynamicPoint.addActiveState("on"); //TODO, add same states as in pointRect
dynamicPoint.addActiveState("off");
dynamicPoint.addActiveState("dim");
dynamicPoint.addActiveState("bell");
*/
dynamicPoint.setFirstState(pointRect.state);
//print("RETURNING " + dynamicPoint);