2014-04-15 4 views
1

Я использую программу примера погоды в Пеббле, не измененную, за исключением двух изменений: я добавил некоторые вызовы 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/a -Получение-AppSync-начально-значения, когда-отправка: новые-значения-из-КСН-приложение). – Chris

+0

Спасибо, я тоже видел это, но это было не так. –

ответ

3

решаемая, благодаря pedrolane на Pebble forums. я забыл добавить AppKeys в appinfo.json:

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

(Примечание: Если вы используете CloudPebble, определить их как так, на странице Настройки:

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

, т. Е. Без "appKeys":, в противном случае страница настроек может не сэкономить)