[C] Waarde ophalen uit key dictionary

Pagina: 1
Acties:
  • 622 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CoachKoos
  • Registratie: Maart 2015
  • Laatst online: 18-09 12:26
Gm,

Ik heb het volgende issue. Via een JS haal ik een waarde op uit een API. Middels een KEY dictionary schrijf ik deze code weg. Nu wil ik in C de waarde weer ophalen en er vervolgens mee aan de slag.

Ik heb op allerlei forums gezocht welke code ik dan in C zou kunnen gebruiken, maar kom er niet uit. Daarnaast weet ik niet waar ik de code dan in de C zou moeten schrijven om te gebruiken, daarom ook die code.

Zou volgens mij met een vrij simpel commando moeten, maar zoals gezegd geen idee welke dat is....

Hoop dat iemand me op weg kan helpen! Thx!

Zo schrijf ik de code weg in JS:
JavaScript:
1
2
3
4
5
         //Construct a key-value dictionary 
    var dict = {"KEY_LOCATION" : location, "KEY_TEMPERATURE": temperature};
    
    //Send data to watch for display
    Pebble.sendAppMessage(dict);
;

In deze code wil ik de waarde terug laten komen als s_num_drinks

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "pebble.h"

#define REPEAT_INTERVAL_MS 50

// This is a custom defined key for saving our count field
#define NUM_DRINKS_PKEY 1

// You can define defaults for values in persistent storage
#define NUM_DRINKS_DEFAULT 0

static Window *s_main_window;

static ActionBarLayer *s_action_bar;
static TextLayer *s_header_layer, *s_body_layer, *s_label_layer;
static GBitmap *s_icon_plus, *s_icon_minus;

static int s_num_drinks = NUM_DRINKS_DEFAULT;

static void update_text() {
  static char s_body_text[18];
  snprintf(s_body_text, sizeof(s_body_text), "%u Bottles", s_num_drinks);
  text_layer_set_text(s_body_layer, s_body_text);
}

static void increment_click_handler(ClickRecognizerRef recognizer, void *context) {
  s_num_drinks++;
  update_text();
}

static void decrement_click_handler(ClickRecognizerRef recognizer, void *context) {
  if (s_num_drinks <= 0) {
    // Keep the counter at zero
    return;
  }

  s_num_drinks--;
  update_text();
}

static void click_config_provider(void *context) {
  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, increment_click_handler);
  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, decrement_click_handler);
}

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

  s_action_bar = action_bar_layer_create();
  action_bar_layer_add_to_window(s_action_bar, window);
  action_bar_layer_set_click_config_provider(s_action_bar, click_config_provider);

  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_UP, s_icon_plus);
  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_DOWN, s_icon_minus);

  int width = layer_get_frame(window_layer).size.w - ACTION_BAR_WIDTH - 3;

  s_header_layer = text_layer_create(GRect(4, 0, width, 60));
  text_layer_set_font(s_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24));
  text_layer_set_background_color(s_header_layer, GColorClear);
  text_layer_set_text(s_header_layer, "Drink Counter");
  layer_add_child(window_layer, text_layer_get_layer(s_header_layer));

  s_body_layer = text_layer_create(GRect(4, 44, width, 60));
  text_layer_set_font(s_body_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
  text_layer_set_background_color(s_body_layer, GColorClear);
  layer_add_child(window_layer, text_layer_get_layer(s_body_layer));

  s_label_layer = text_layer_create(GRect(4, 44 + 28, width, 60));
  text_layer_set_font(s_label_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18));
  text_layer_set_background_color(s_label_layer, GColorClear);
  text_layer_set_text(s_label_layer, "of drinks on the wall");
  layer_add_child(window_layer, text_layer_get_layer(s_label_layer));

  update_text();
}

static void main_window_unload(Window *window) {
  text_layer_destroy(s_header_layer);
  text_layer_destroy(s_body_layer);
  text_layer_destroy(s_label_layer);

  action_bar_layer_destroy(s_action_bar);
}

static void init() {
  s_icon_plus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_PLUS);
  s_icon_minus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_MINUS);

  // Get the count from persistent storage for use if it exists, otherwise use the default
  s_num_drinks = persist_exists(NUM_DRINKS_PKEY) ? persist_read_int(NUM_DRINKS_PKEY) : NUM_DRINKS_DEFAULT;

  s_main_window = window_create();
  window_set_window_handlers(s_main_window, (WindowHandlers) {
    .load = main_window_load,
    .unload = main_window_unload,
  });
  window_stack_push(s_main_window, true);
}

static void deinit() {
  // Save the count into persistent storage on app exit
  persist_write_int(NUM_DRINKS_PKEY, s_num_drinks);

  window_destroy(s_main_window);

  gbitmap_destroy(s_icon_plus);
  gbitmap_destroy(s_icon_minus);
}

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

[ Voor 0% gewijzigd door RobIII op 24-06-2015 14:54 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ten eerste: waarom heb je het over C# terwijl je C-code post (met de code-tag C++)? Dat is iets heel anders. Probeer eerst eens te begrijpen met welke talen en frameworks je nou aan het werk bent.

Ten tweede, in je Javascript code post je een AppMessage, in de C-code kijk je ineens naar persistent storage. Dit is toch niet hetzelfde?
edit: persistant storage gebruik je denk ik alleen voor het saven/restoren van de state bij afsluiten van de applicatie.

Ik neem aan de je in watchApp het bericht wilt ontvangen, dus zul je iets met AppMessage API moeten doen. Een snelle google leverde mij dit op :

http://developer.getpebble.com/docs/c/Foundation/AppMessage/

[ Voor 29% gewijzigd door EddoH op 24-06-2015 14:10 ]


Acties:
  • 0 Henk 'm!

  • CoachKoos
  • Registratie: Maart 2015
  • Laatst online: 18-09 12:26
@Eddoh

Sorry, ging iets te snel.... Het is C code, heb het aangepast. En de persistant is idd om de waarde na aanpassen weg te schrijven bij afsluiten van de app.

Het is voor een Pebble, maar in de voorbeelden op hun site schrijven ze de waarde gelijk weg om te tonen. Ik wil de waarde graag aanpassen, waarvoor de C code is zoals in m'n post.

Zo wordt de waarde opgeroepen om te tonen op de Pebble:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void process_tuple(Tuple *t)
{

  //Get key
  int key = t->key;

  //Get integer value, if present
  int value = t->value->int32;

  //Get string value, if present
  char string_value[32];
  strcpy(string_value, t->value->cstring);

  //Decide what to do
  switch(key) {
    case KEY_LOCATION:

      //Location received
      snprintf(location_buffer, sizeof("Location: couldbereallylongname"), "Location: %s", string_value);
      text_layer_set_text(location_layer, (char*) &location_buffer);
      break;

    case KEY_TEMPERATURE:
      //Temperature received
      snprintf(temperature_buffer, sizeof("Temperature: XX \u00B0C"), "Temperature: %d \u00B0C", value);
      text_layer_set_text(temperature_layer, (char*) &temperature_buffer);
      break;
  }
;

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Wat lukt er nu niet? De waarde binnenkrijgen vanaf de Javascript kant, of de waarde aanpassen? Wat heb je al geprobeerd? Waar loop je vast?

Acties:
  • 0 Henk 'm!

  • CoachKoos
  • Registratie: Maart 2015
  • Laatst online: 18-09 12:26
De waarde binnenkrijgen. Ik heb de code uit mijn reply laten zien om te tonen wat een ander template er mee doet: de waarde wordt binnengehaald, maar gelijk middels de text_layer weggeschreven.

In mijn geval zou ik willen dat de waarde wordt toegeschreven aan het veld: s_num_drinks. Van daaruit kan ik er in C mee "aan de slag".

Ik heb allerlei templates en documentatie geraadpleegd van Pebble om te achterhalen hoe zij gegevens van JS naar C krijgen, maar krijg dat niet werkend in mijn app.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

De code die je post haalt helemaal geen waarde op, die wordt als tuple meegegeven aan de functie. Het binnenkrijgen zal daarvoor moeten gebeuren, waarna waarschijnlijk de functie process_tuple wordt aangeroepen.

Kijk eens naar de link die ik stuurde. Daar zie ik bijvoorbeeld
C:
1
AppMessageInboxReceived app_message_register_inbox_received(AppMessageInboxReceived received_callback)


Als je niet je volledige code hebt gepost en je komt daadwerkelijk al in die process_tuple terecht, dan is het toch simpelweg een kwestie van waarde 'value' aan s_num_drinks assignen.

[ Voor 17% gewijzigd door EddoH op 24-06-2015 15:15 ]


Acties:
  • 0 Henk 'm!

  • CoachKoos
  • Registratie: Maart 2015
  • Laatst online: 18-09 12:26
Voor de functie zit geen code behalve:

C:
1
2
3
4
enum {
  KEY_LOCATION = 0,
  KEY_TEMPERATURE = 1,
};


De code is ter illustratie, ik probeer te achterhalen hoe ik deze code kan gebruiken/aanpassen om de value dan te assignen. Dus binnen de Switch.

Met AppMessage wordt er (volgens mij) alleen gecommuniceerd tussen de telefoon en terug. Of het zenden en ontvangen goed gegaan is...

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

CoachKoos schreef op woensdag 24 juni 2015 @ 15:34:


De code is ter illustratie, ik probeer te achterhalen hoe ik deze code kan gebruiken/aanpassen om de value dan te assignen. Dus binnen de Switch.
Geen flauw idee wat je nu wilt bereiken maar:

C:
1
2
3
4
5
6
7
//Decide what to do
  switch(key) {
    case KEY_TEMPERATURE:
      //Temperature received
      s_num_drinks = value;
      break;
  }


:? :? :?

[ Voor 9% gewijzigd door EddoH op 24-06-2015 15:53 ]


Acties:
  • 0 Henk 'm!

  • CoachKoos
  • Registratie: Maart 2015
  • Laatst online: 18-09 12:26
Het kan zo simpel zijn....

Ik heb nu de code verwerkt in C. Maar als ik het nu test blijft de s_num_drinks waarde op 0 pakken en niet de nieuwe waarde die ik ophaal uit het JS.

Enig idee waar dat fout gaat?

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "pebble.h"

#define REPEAT_INTERVAL_MS 50

// Sleutel toevoegen
enum {
    KEY_LOCATION = 0,
    KEY_TEMPERATURE = 1,
};  
  
static Window *s_main_window;

static ActionBarLayer *s_action_bar;
static TextLayer *s_header_layer, *s_body_layer, *s_label_layer;
static GBitmap *s_icon_plus, *s_icon_minus;

static int s_num_drinks;

// Sleutel ophalen
void process_tuple(Tuple *t)
{
    //Get key
    int key = t->key;

    //Get integer value, if present
    int value = t->value->int32;

    //Get string value, if present
    char string_value[32];
    strcpy(string_value, t->value->cstring);


switch(key) {
    case KEY_TEMPERATURE:
      //Temperature received
      s_num_drinks = value;
      break;
  }
}

static void update_text() {
  static char s_body_text[18];
  snprintf(s_body_text, sizeof(s_body_text), "%u Bottles", s_num_drinks);
  text_layer_set_text(s_body_layer, s_body_text);
}

static void increment_click_handler(ClickRecognizerRef recognizer, void *context) {
  s_num_drinks++;
  update_text();
}

static void decrement_click_handler(ClickRecognizerRef recognizer, void *context) {
  if (s_num_drinks <= 0) {
    // Keep the counter at zero
    return;
  }

  s_num_drinks--;
  update_text();
}

static void click_config_provider(void *context) {
  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, increment_click_handler);
  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, decrement_click_handler);
}

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

  s_action_bar = action_bar_layer_create();
  action_bar_layer_add_to_window(s_action_bar, window);
  action_bar_layer_set_click_config_provider(s_action_bar, click_config_provider);

  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_UP, s_icon_plus);
  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_DOWN, s_icon_minus);

  int width = layer_get_frame(window_layer).size.w - ACTION_BAR_WIDTH - 3;

  s_header_layer = text_layer_create(GRect(4, 0, width, 60));
  text_layer_set_font(s_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24));
  text_layer_set_background_color(s_header_layer, GColorClear);
  text_layer_set_text(s_header_layer, "Drink Counter");
  layer_add_child(window_layer, text_layer_get_layer(s_header_layer));

  s_body_layer = text_layer_create(GRect(4, 44, width, 60));
  text_layer_set_font(s_body_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
  text_layer_set_background_color(s_body_layer, GColorClear);
  layer_add_child(window_layer, text_layer_get_layer(s_body_layer));

  s_label_layer = text_layer_create(GRect(4, 44 + 28, width, 60));
  text_layer_set_font(s_label_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18));
  text_layer_set_background_color(s_label_layer, GColorClear);
  text_layer_set_text(s_label_layer, "of drinks on the wall");
  layer_add_child(window_layer, text_layer_get_layer(s_label_layer));

  update_text();
}

static void main_window_unload(Window *window) {
  text_layer_destroy(s_header_layer);
  text_layer_destroy(s_body_layer);
  text_layer_destroy(s_label_layer);

  action_bar_layer_destroy(s_action_bar);
}

static void init() {
  s_icon_plus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_PLUS);
  s_icon_minus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_MINUS);

  s_main_window = window_create();
  window_set_window_handlers(s_main_window, (WindowHandlers) {
    .load = main_window_load,
    .unload = main_window_unload,
  });
  window_stack_push(s_main_window, true);
}

static void deinit() {
  window_destroy(s_main_window);

  gbitmap_destroy(s_icon_plus);
  gbitmap_destroy(s_icon_minus);
}

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

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ik ben geen debugmachine. Ga eerst maar eens kijken of value de goede waarde krijgt en waarom wel/niet.

Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Volgens mij heb je je voorbeeldcode hier vandaan. Je hebt de process_tuple(...) wel goed over genomen, maar lees eens goed alle stappen onder het kopje Setting up AppMessage.

De functie process_tuple(...) wordt niet 'automagisch' aangeroepen, daar moet je wel wat voor doen..

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Precies wat ik al eerder zei dus. Je moet zorgen dat je je AppMessages binnenkrijgt, daarna roep je met de data die je daarin binnenkrijgt je process_tuple aan.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Dus alsnog eerst echt concreet zelf aan de slag en niet het forum gebruiken om jouw werk te doen. Ik kan dan ook niet anders dan je topic sluiten aangezien je het forum maar blijft gebruiken als persoonlijke debugger. Zelf lijk je niet daadwerkelijk moeite te doen om daadwerkelijk de tutorial te willen begrijpen. En dat verwachten we hier wel van je.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.