2013-06-20 8 views
1

Я никогда не делал много C, и я немного в тупике, чтобы наилучшим образом отправить логическое из приложения Android в Pebble Watch.Отправка булевых в Pebble с PebbleKit

У меня есть строки, отлично работающие, но, похоже, не существует метода addBoolean в PebbleDictionary. В качестве работы я пытаюсь использовать addUint8 для отправки 1 или 0, но у меня возникли проблемы с обработкой сообщения в Pebble.

Вот мой Android код:

PebbleDictionary data = new PebbleDictionary(); 
    if (isGPSFix()){ 
     data.addUint8(GPS_HAS_FIX_KEY, Byte.valueOf("1")); 
    } else { 
     data.addUint8(GPS_HAS_FIX_KEY, Byte.valueOf("0")); 
    } 
    PebbleKit.sendDataToPebble(app.getContext(), UUID, data); 

И в моем Pebble у меня-структуру данных:

static struct MyData { 
    uint8_t haveGPS[1]; 
    .... // other stuff ommitted 
    AppSync sync; 
    uint8_t sync_buffer[256]; 
} s_data; 

И тогда я пытаюсь сравнить его, как это в моем sync_tuple_changed обратного вызова.

static void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) { 
(void) old_tuple; 

    switch (key) { 
    case GPS_HAS_FIX_KEY: 
     if (memcmp(s_data.haveGPS, new_tuple->value->data, 8) == 0){ 
     memcpy(s_data.haveGPS,new_tuple->value->data, new_tuple->length); 
     vibes_short_pulse(); 
     } 
    break; 
    default: 
     return; 
    } 
} 

Часы не падают, он никогда не вибрирует, когда телефон падает или приобретает GPS.

ответ

0

Все выглядит хорошо на стороне Android. Я думаю, что это скорее проблема AppSync.

Вот несколько вещей, чтобы проверить в приложении часов:

  • Убедитесь, что вы создаете список кортежей с начальными значениями на часах. Этот список должен содержать ваш ключ GPS_HAS_FIX_KEY;
Tuplet initial_values[] = { 
    TupletInteger(GPS_HAS_FIX_KEY, (uint8_t) 0), 
    /* Other tuplets that you will synchronize */ 
}; 
  • Убедитесь, что вы передаете эти tuplets к функции app_sync_init():
app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), 
       initial_values, ARRAY_LENGTH(initial_values), 
       sync_tuple_changed_callback, sync_error_callback, NULL); 

Эти два шага необходимы для app_sync работы (ср AppSync reference documentation).

+0

Спасибо @sarfata. Мне не хватало записи в начальных значениях Tuplet. Я не совсем понял memcmp, но если я просто уведомлю о каждом обновлении, я, по крайней мере, сейчас получаю вибрации. –

+0

У меня теперь есть логика сравнения, работающая правильно. См. Мой ответ ниже для работы команд memcmp и memcpy. –

0

Насколько я понимаю, вы должны отправить словарь ключей и объектов на часы. В Objective C это выглядит следующим образом:

NSDictionary *update = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 

Ключи все целые и объекты, я думаю, может быть логическое значение. В моем случае только String работает хорошо.

В цикле я выполняю что-то вроде этого на часы:

t=dict_find(received,count); 
strcpy(strs[count], dict_find(received,count)->value->cstring); 

Но я должен сказать вам, что я еще новичок.

0

Благодаря принятому ответу сарфаты выше, я обнаружил, что я не добавил этот новый предмет в Кортеж, которого ожидал Пеббл.

Как только я добавил это, моя инструкция switch начала работать, и мне просто нужно было сравнить память с работой. Вот рабочий код для сравнения моей памяти, если он помогает кому-либо.

case GPS_HAS_FIX_KEY: 
if (memcmp(s_data.haveGPS, new_tuple->value->data, 1) != 0){ 
    memcpy(s_data.haveGPS,new_tuple->value->data, 1); 
    vibes_short_pulse(); 
} 
break; 

Это действительно было просто, как ожидал один байт (а не 8 байт - я думал, что это делает немного сравнить) и отрицая логику для случая, когда новое значение не так, как старый.