2014-04-15 49 views
1

我使用Pebble天氣示例程序,除了兩個更改之外未經修改:我添加了一些app_log調用調用,並且使用配置屏幕而不是應用程序來發送數據。問題是,app_log調用顯示沒有變量實際上從配置中更新。只使用初始值的Pebble AppSync Tuple

這裏是主要的應用程序weather.c:

#include "pebble.h" 

static Window *window; 

static TextLayer *temperature_layer; 
static char temperature[16]; 

static BitmapLayer *icon_layer; 
static GBitmap *icon_bitmap = NULL; 

static AppSync sync; 
static uint8_t sync_buffer[32]; 

enum WeatherKey { 
    WEATHER_ICON_KEY = 0x0,   // TUPLE_INT 
    WEATHER_TEMPERATURE_KEY = 0x1, // TUPLE_CSTRING 
}; 

static uint32_t WEATHER_ICONS[] = { 
    RESOURCE_ID_IMAGE_SUN, 
    RESOURCE_ID_IMAGE_CLOUD, 
    RESOURCE_ID_IMAGE_RAIN, 
    RESOURCE_ID_IMAGE_SNOW 
}; 

static void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) { 
    APP_LOG(APP_LOG_LEVEL_DEBUG, "App Message Sync Error: %d", app_message_error); 
} 

static void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) { 
    switch (key) { 
    case WEATHER_ICON_KEY: 
     if (icon_bitmap) { 
     gbitmap_destroy(icon_bitmap); 
     } 
    app_log(APP_LOG_LEVEL_DEBUG, "icon", new_tuple->value->uint8, "precedes"); 
     icon_bitmap = gbitmap_create_with_resource(WEATHER_ICONS[new_tuple->value->uint8]); 
     bitmap_layer_set_bitmap(icon_layer, icon_bitmap); 
     break; 

    case WEATHER_TEMPERATURE_KEY: 
     // App Sync keeps new_tuple in sync_buffer, so we may use it directly 
    app_log(APP_LOG_LEVEL_DEBUG, "temperature", 0, new_tuple->value->cstring); 
     text_layer_set_text(temperature_layer, new_tuple->value->cstring); 
     break; 
    } 
} 

static void window_load(Window *window) { 
    Layer *window_layer = window_get_root_layer(window); 

    icon_layer = bitmap_layer_create(GRect(32, 10, 80, 80)); 
    layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer)); 

    temperature_layer = text_layer_create(GRect(0, 100, 144, 68)); 
    text_layer_set_text_color(temperature_layer, GColorWhite); 
    text_layer_set_background_color(temperature_layer, GColorClear); 
    text_layer_set_font(temperature_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); 
    text_layer_set_text_alignment(temperature_layer, GTextAlignmentCenter); 
    text_layer_set_text(temperature_layer, temperature); 

    Tuplet initial_values[] = { 
    TupletInteger(WEATHER_ICON_KEY, (uint8_t) 1), 
    TupletCString(WEATHER_TEMPERATURE_KEY, "1234\u00B0C"), 
    }; 
    app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values), 
     sync_tuple_changed_callback, sync_error_callback, NULL); 

    layer_add_child(window_layer, text_layer_get_layer(temperature_layer)); 
} 

static void window_unload(Window *window) { 
    app_sync_deinit(&sync); 

    if (icon_bitmap) { 
    gbitmap_destroy(icon_bitmap); 
    } 

    text_layer_destroy(temperature_layer); 
    bitmap_layer_destroy(icon_layer); 
} 

static void init() { 
    window = window_create(); 
    window_set_background_color(window, GColorBlack); 
    window_set_fullscreen(window, true); 
    window_set_window_handlers(window, (WindowHandlers) { 
    .load = window_load, 
    .unload = window_unload 
    }); 

    const int inbound_size = 64; 
    const int outbound_size = 16; 
    app_message_open(inbound_size, outbound_size); 

    const bool animated = true; 
    window_stack_push(window, animated); 
} 

static void deinit() { 
    window_destroy(window); 
} 

int main(void) { 
    init(); 
    app_event_loop(); 
    deinit(); 
} 

(同樣,它是除了app_log電話不變。)下面是JavaScript文件:

var initialized = false; 

Pebble.addEventListener("ready", function() { 
    console.log("ready called!"); 
    initialized = true; 
}); 

Pebble.addEventListener("showConfiguration", function() { 
    console.log("showing configuration"); 
    Pebble.openURL('https://dl.dropboxusercontent.com/u/10948026/pebble/weather.html'); 
}); 

Pebble.addEventListener("webviewclosed", function(e) { 
    console.log("configuration closed"); 
    // webview closed 
    var options = JSON.parse(decodeURIComponent(e.response)); 
    console.log("Options = " + JSON.stringify(options)); 
    Pebble.sendAppMessage(options); 
}); 

這裏是HTML文件的配置:(我知道它的值不對應溫度或圖標的數字,但它應該仍然工作據我所知。)

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Configurable</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css" /> 
    <script src="https://code.jquery.com/jquery-1.9.1.min.js"></script> 
    <script src="https://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script> 
    </head> 
    <body> 
    <div data-role="page" id="main"> 
     <div data-role="header" class="jqm-header"> 
     <h1>Earth Daylight Time settings</h1> 
     </div> 

     <div data-role="content"> 

     <div data-role="fieldcontain"> 
      <label for="day-date">Display icon:</label> 
      <select name="day-date" id="day-date"> 
      <option value="3">On</option> 
      <option value="2">On</option> 
      <option value="1">On</option> 
      <option value="0">Off</option> 
      </select> 
     </div> 

     <div data-role="fieldcontain"> 
      <label for="gmt-offset">Please select a temp:</label> 
      <select name="gmt-offset" id="gmt-offset"> 
        <option value="-12">(GMT -12:00) Eniwetok, Kwajalein</option> 
        <option value="-11">(GMT -11:00) Midway Island, Samoa</option> 
        <option value="-10">(GMT -10:00) Hawaii</option> 
        <option value="-9">(GMT -9:00) Alaska</option> 
        <option value="-8">(GMT -8:00) Pacific Time (US &amp; Canada)</option> 
        <option value="-7">(GMT -7:00) Mountain Time (US &amp; Canada)</option> 
        <option value="-6">(GMT -6:00) Central Time (US &amp; Canada), Mexico City</option> 
        <option value="-5">(GMT -5:00) Eastern Time (US &amp; Canada), Bogota, Lima</option> 
        <option value="-4">(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz</option> 
        <option value="-3">(GMT -3:00) Brazil, Buenos Aires, Georgetown</option> 
        <option value="-2">(GMT -2:00) Mid-Atlantic</option> 
        <option value="-1">(GMT -1:00 hour) Azores, Cape Verde Islands</option> 
        <option value="0">(GMT) Western Europe Time, London, Lisbon, Casablanca</option> 
        <option value="1">(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris</option> 
        <option value="2">(GMT +2:00) Kaliningrad, South Africa</option> 
        <option value="3">(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg</option> 
        <option value="4">(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi</option> 
        <option value="5">(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent</option> 
        <option value="6">(GMT +6:00) Almaty, Dhaka, Colombo</option> 
        <option value="7">(GMT +7:00) Bangkok, Hanoi, Jakarta</option> 
        <option value="8">(GMT +8:00) Beijing, Perth, Singapore, Hong Kong</option> 
        <option value="9">(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk</option> 
        <option value="10">(GMT +10:00) Eastern Australia, Guam, Vladivostok</option> 
        <option value="11">(GMT +11:00) Magadan, Solomon Islands, New Caledonia</option> 
        <option value="12">(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka</option> 
      </select> 
      <legend>(Note: This will not change the time on the watch, just the accuracy of the Earth display.)</legend> 
      </div> 
     </div> 

     <div class="ui-body ui-body-b"> 
      <fieldset class="ui-grid-a"> 
       <div class="ui-block-a"><button type="submit" data-theme="d" id="b-cancel">Cancel</button></div> 
       <div class="ui-block-b"><button type="submit" data-theme="a" id="b-submit">Submit</button></div> 
      </fieldset> 
      </div> 
     </div> 
     </div> 
    </div> 
    <script> 
     function saveOptions() { 
     var options = { 
      'day-date': $("#day-date").val(), 
      'gmt-offset': $("#gmt-offset").val(), 
     } 
     return options; 
     } 

     $().ready(function() { 
     $("#b-cancel").click(function() { 
      console.log("Cancel"); 
      document.location = "pebblejs://close"; 
     }); 

     $("#b-submit").click(function() { 
      console.log("Submit"); 

      var location = "pebblejs://close#" + encodeURIComponent(JSON.stringify(saveOptions())); 
      console.log("Warping to: " + location); 
      console.log(location); 
      document.location = location; 
     }); 

     }); 
    </script> 
    </body> 
</html> 

最後,例如日誌:

[PHONE] pebble-app.js:?: weathertest__1/pebble-js-app.js:9 showing configuration 
[PHONE] pebble-app.js:?: {'runhost client uuid' = bec5b2fa-eb94-407b-8296-08e0b5c5fa22}:{'webapp uuid' = bec5b2fa-eb94-407b-8296-08e0b5c5fa22}: ++_JS_LIFECYCLE_++:KILLED 
[PHONE] pebble-app.js:?: {'runhost client uuid' = bec5b2fa-eb94-407b-8296-08e0b5c5fa22}:{'webapp uuid' = bec5b2fa-eb94-407b-8296-08e0b5c5fa22}: ++_JS_LIFECYCLE_++:KILLED 
[PHONE] pebble-app.js:?: weathertest__1/pebble-js-app.js:14 configuration closed 
[PHONE] pebble-app.js:?: weathertest__1/pebble-js-app.js:17 Options = {"day-date":"3","gmt-offset":"-12"} 
[DEBUG] icon:1: precedes 
[DEBUG] temperature:0: 1234°C 
[PHONE] pebble-app.js:?: weathertest__1/pebble-js-app.js:14 configuration closed 
[PHONE] pebble-app.js:?: {'runhost client uuid' = 00000000-0000-0000-0000-000000000000}:{'webapp uuid' = 362b81ee-f906-429a-807b-75a54367b715}: ++_JS_LIFECYCLE_++:PREVIOUSLY-RUNNING 
[PHONE] pebble-app.js:?: {'runhost client uuid' = 00000000-0000-0000-0000-000000000000}:{'webapp uuid' = 362b81ee-f906-429a-807b-75a54367b715}: ++_JS_LIFECYCLE_++:PREVIOUSLY-RUNNING 
+0

請搜索您的代碼,看看您是否有[額外的'app_sync_init'調用某處](http://stackoverflow.com/questions/22753946/always -getting-的AppSync-初始值 - 當送入用新值從 - IOS-應用程序)。 – Chris

+0

謝謝,我看到一個,但那不是。 –

回答

3

解決,這要歸功於對Pebble forums.我忘了添加AppKeys在appinfo.json pedrolane:

"appKeys": { "day-date": 0, "gmt-offset": 1 },

(注:如果您正在使用CloudPebble,定義這些像這樣,在設置頁面:

{ "day-date": 0, "gmt-offset": 1 }

即沒有"appKeys":,否則設置頁面可能不會保存)