The Cookie Machine - Click here to drag window

DUMMY TEXT - Real text set in assets/js/theCookieMachine.js

A sample project for doing Laundry appears when you have no projects defined. After adding your own project(s), you can delete the sample project.

You can have an unlimited number of projects. Each project can have an unlimited number of Tasks.


Top ToS Skip

Table of Contents


Top ToS ToC Skip

Upload Custom Sound Files

Selected Sounds in Memory

Upload multiple files with the file dialog or by dragging and dropping files onto the dashed region

Remove files
Upload files

Top ToS ToC Skip

Custom Sound Files (Uploaded)

These are all the custom sound files that have been uploaded so far.

NOTE:

The Firefox Web Browser limits localStorage to 5MB. This doesnโ€™t allow for many custom sound files. The other web browsers have a larger quota. To increase quota in Firefox, follow these steps:

Enter โ€œabout:configโ€ in the address bar -> search for โ€œdom.storage.default_quotaโ€ -> edit value and enter larger value (e.g. 25120) (default is 5120).

WARNING:

Firefox doesnโ€™t support .wav files very well. It is recommended you convert them to .mp3 or similar format before uploading.

ffmpeg -i track01.wav -acodec mp3 track01.mp3

Or use an free online conversion service.


Top ToS ToC Skip

Stock Sound Files

The following sound files are always available direct from the Pippim Website.

These are Tim-ta stock sound files you can use when a timer task ends:


Top ToS ToC Skip

Download Tim-ta Configuration

Download your TIm-ta Configuration from Local Storage to back it up. You can also send the download to another device or browser.


Upload Tim-ta Configuration

Upload TIm-ta Configuration to Local Storage. New Projects and new Tasks will be added. Existing Projects and Tasks will be updated.

Projects and Tasks are never be deleted.

Imported Sound filenames are ignored because they may not exist.

Selected Configuration in Memory

Upload multiple files with the file dialog or by dragging and dropping files onto the dashed region

Remove files
Upload files

Top ToS ToC Skip
Tim-ta Under Construction.png
Tim-ta Under Construction.png

Work In Progress

Tim-ta development started April 11, 2022. A budget of two months has been given to this project.

Initially all the features in Multi-Timer will be provided. After that, new features will be added.

NOTE: Some Multi-timer features such as locking the screen cannot be done from a web browser.

As of May 8, 2022, these features have been developed:

May 14, 2022 update:

May 27, 2022 update:

May 31, 2022 update:

June 12, 2022 update:

June 25, 2022 update:


Top ToS ToC Skip
Tim-ta Alarm Clock Image
Tim-ta alarm-clock.jpg

Introduction

Tim-ta (Timed-tasks) gives a countdown timer where each task is always a predetermined amount of time. For example, when doing the laundry it might be:

16 minutes and 30 seconds for the wash cycle

13 minutes and 15 seconds for the rinse cycle

58 minutes for the dryer

With Tim-ta you arrive at the washer and dryer the exact second you need to be there. Youโ€™ll Never miss the rinse cycle fabric softener to eliminate static cling. Youโ€™ll never have wrinkled clothes from being left overnight in the dryer.

There are other examples where you can use Tim-ta:


Top ToS ToC Skip

Tim-ta Buttons

These are the buttons used in Tim-ta.


โ™ซโ€ƒ Listen to sound file.


โนโ€ƒ Stop listening to sound file.


โš™โ€ƒ In the footer, edit configuration settings. On detail line for small screen, open more buttons control box.


+โ€ƒ Add a new project or a new task.


โŒซโ€ƒ Go back one screen or cancel operation.


โ˜ฐโ€ƒ Display list of projects or list of tasks.


โœโ€ƒ Edit a Project or Task.


๐Ÿ—‘โ€ƒ Delete a Project or Task.


โ–ถโ€ƒ Run Projectโ€™s Timed Tasks.


โ‡งโ€ƒ Move a Project or Task up in list.


โ‡ฉโ€ƒ Move a Project or Task down in list.


Top ToS ToC Skip

Timer Countdown Override Buttons

While a Task Timer is counting down, you can click on the progress bar and an action/controls override box appears.


โฎโ€ƒ skip to Task start. If at start, go to previous Task.


โชโ€ƒ If last button fast forward, fast backwards half the fast forward amount. Otherwise, fast backwards 10%.


โฏโ€ƒ If playing, then pause. If paused, then play.


โฉโ€ƒ If last button fast backwards, then fast forward half the fast backwards amount. Otherwise, fast forward 10%


โญโ€ƒ Skip to next Task.


A note about alternating fast backward and fast forward button clicks:


Top ToS ToC Skip

Local Storage Files

A single file called ttaConfig is used to store Settings, Projects and Tasks. ttaConfig is kept in โ€œLocal Storageโ€. Local Storage is also used to store every stock and custom sound file.

To view Local Storage (from Chrome and Firefox browsers):

// Configuration & Container for all Tim-ta Projects
// Default below for creation, overwritten when retrieved from localStorage
// The order arrProjects names appear is order they are displayed
var tta_store = {
    arrProjects: [],
    objProjects: {},
    task_prompt: "true",
    task_end_alarm: "true",
    task_end_filename: "Alarm_03.mp3",
    task_end_notification: "false",
    run_set_times: 1,
    set_prompt: "false",
    set_end_alarm: "false",
    set_end_filename: "Alarm_05.mp3",
    set_end_notification: "false",
    all_sets_prompt: "false",
    all_sets_end_alarm: "false",
    all_sets_end_filename: "Alarm_12.mp3",
    all_sets_end_notification: "false",
    progress_bar_update_seconds: 1,
    confirm_delete_phrase: "y"
}

// SINGLE Tim-ta Project
// When value is "default" it is inherited from Configuration
// The order arrTasks names appear is order they are displayed
var tta_project = {
    project_name: null,
    arrTasks: [],
    objTasks: {},
    task_prompt: "default",
    task_end_alarm: "default",
    task_end_filename: "default",
    task_end_notification: "default",
    run_set_times: "default",
    set_prompt: "default",
    set_end_alarm: "default",
    set_end_filename: "default",
    set_end_notification: "default",
    all_sets_prompt: "default",
    all_sets_end_alarm: "default",
    all_sets_end_filename: "default",
    all_sets_end_notification: "default",
    progress_bar_update_seconds: "default",
    confirm_delete_phrase: "default"
}

// SINGLE Timer within a Tim-ta Project
// When value is "default" it is inherited from Project
var tta_task = {
    task_name: null,
    hours: null,
    minutes: null,
    seconds: null,
    task_prompt: "default",
    task_end_alarm: "default",
    task_end_filename: "default",
    task_end_notification: "default",
    progress_bar_update_seconds: "default",
    confirm_delete_phrase: "default"
}

var data_dictionary = {
    project_name: "Project Name|text|non-blank",
    task_name: "Task Name|text|non-blank",
    hours: "Hours|number|0|1000",
    minutes: "Minutes|number|0|1000",
    seconds: "Seconds|number|0|1000",
    task_prompt: "Prompt to begin Task?|switch",
    task_end_alarm: "Play sound when Task ends?|switch",
    task_end_filename: "Task ending sound filename|select|sound_filenames",
    task_end_notification: "Desktop notification when Task ends?|switch",
    run_set_times: "Number of times to run Set|number|1|1000",
    set_prompt: "Prompt to begin Set?|switch",
    set_end_alarm: "Play sound when Set ends?|switch",
    set_end_filename: "Set ending sound filename|select|sound_filenames",
    set_end_notification: "Desktop notification when Set ends?|switch",
    all_sets_prompt: "Prompt to begin All Sets?|switch",
    all_sets_end_alarm: "Play sound when All Sets end?|switch",
    all_sets_end_filename: "All Sets ending sound filename|select|sound_filenames",
    all_sets_end_notification: "Desktop notification when All Sets end?|switch",
    progress_bar_update_seconds: "Seconds between countdown updates|number|1|1000",
    fail_test_1: "Hello World",
    fail_test_2: "Good-bye Cruel World...|text|lower|upper|No such place!",
    confirm_delete_phrase: "Text to confirm delete action|text"
}

var dd_field = {
    name: "",
    label: "",
    type: "",
    lower: "",
    upper: ""
}

function get_dd_field (name) {
    /* Extract dd_field from data_dictionary for easier referencing
       NOTE: lower is generic term, it can be "non-blank" for keys and
             there is no upper. If numeric and lower or upper is blank
             they are converted to 0. If select it contains all the
             possible values.
    */
    const raw = data_dictionary[name];
    if (raw == null) {
        alert("Critical Error. Data dictionary field doesn't exist: " + name);
        console.trace();
        return false;
    }
    const arr = raw.split('|')
    if (arr.length < 2) {
        alert("Critical Error. Data dictionary field has < 3 parts: " + name);
        console.trace();
        return false;
    }
    dd_field.name = name;       // Used programmatically as field name
    dd_field.label = arr[0];    // Used for labels on forms & tables
    dd_field.type = arr[1];     // Used for <table> <input> type="dd_field.type"
    if (arr.length >= 3) { dd_field.lower = arr[2]; }
    else dd_field.lower = "";   // See top of function comments
    if (arr.length >= 4) { dd_field.upper = arr[3]; }
    else dd_field.upper = "";
    if (arr.length > 4 && dd_field.type != "select") {       // See top of function comments
        alert("Critical Error. Non-Select field has > 4 parts: " + name);
        console.trace();
        return false;
    }
    return true;
}

/* UNIT TESTING
    get_dd_field("haha")
    get_dd_field("fail_test_1")
    get_dd_field("fail_test_2")
*/


Top ToS ToC