【问题标题】:Sending boolean to Pebble with PebbleKit使用 PebbleKit 向 Pebble 发送布尔值
【发布时间】:2013-06-20 11:56:43
【问题描述】:

我从来没有真正做过太多的 C 语言,对于将布尔值从 Android 应用程序发送到 Pebble Watch 的最佳方式感到有些困惑。

我的字符串工作正常,但 PebbleDictionary 上似乎没有 addBoolean 方法。作为一种解决方法,我尝试使用 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 时不会振动。

【问题讨论】:

    标签: android c pebble-watch pebble-sdk


    【解决方案1】:

    在 Android 方面看起来不错。我认为这更像是一个 AppSync 问题。

    在手表应用程序中需要检查以下几点:

    • 确保在手表上创建具有初始值的元组列表。此列表需要包含您的密钥GPS_HAS_FIX_KEY;
    Tuplet initial_values[] = {
      TupletInteger(GPS_HAS_FIX_KEY, (uint8_t) 0),
      /* Other tuplets that you will synchronize */
    }; 
    
    • 确保将这些连音传递给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)。

    【讨论】:

    • 谢谢@sarfata。我错过了初始值 Tuplet 中的条目。我的 memcmp 不太正确,但如果我只是在每次更新时通知我,我至少现在会感到震动。
    • 我现在的比较逻辑也正常工作了。有关工作 memcmp 和 memcpy 命令,请参阅下面的答案。
    【解决方案2】:

    据我了解,您必须将键和对象字典发送到手表。在 Objective C 中它看起来像这样:

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

    键都是整数,我认为对象可以是布尔值。在我的情况下,只有 String 效果很好。

    在一个循环中,我在手表上执行类似的操作:

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

    但我得告诉你,我还是个菜鸟。

    【讨论】:

      【解决方案3】:

      感谢 sarfata 在上面接受的回答,我发现我没有将这个新项目添加到 Pebble 所期望的元组中。

      添加后,我的 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 个字节 - 我认为它是在做一些比较)并否定新值与旧值不同的情况的逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多