KNX IoT
KNX IoT Point API stack implementation
lsab_minimal_all.c File Reference

Example device implementing Function Block LSABExample code for Function Block LSAB. More...

#include "oc_api.h"
#include "oc_core_res.h"
#include "api/oc_knx_fp.h"
#include "port/oc_clock.h"
#include <signal.h>
#include "api/oc_knx_dev.h"
#include <stdio.h>
#include <unistd.h>

Go to the source code of this file.

Macros

#define _WIN32_WINNT   0x8000
 
#define btoa(x)   ((x) ? "true" : "false")
 
#define GetCurrentDir   getcwd
 
#define MY_NAME   "Actuator (LSAB) 417"
 The name of the application. More...
 
#define STATIC   static
 

Functions

int app_init (void)
 function to set up the device. More...
 
void factory_presets_cb (size_t device, void *data)
 initiate preset for device current implementation: device reset as command line argument More...
 
STATIC void get_o_1_1 (oc_request_t *request, oc_interface_mask_t interfaces, void *user_data)
 get method for "p/o_1_1" resource. More...
 
void handle_signal (int signal)
 handle Ctrl-C More...
 
void hostname_cb (size_t device_index, oc_string_t host_name, void *data)
 set the host name on the device (application depended) More...
 
void initialize_variables (void)
 initializes the global variables registers and starts the handler More...
 
int main (int argc, char *argv[])
 main application. More...
 
void print_usage ()
 print usage and quits More...
 
STATIC void put_o_1_1 (oc_request_t *request, oc_interface_mask_t interfaces, void *user_data)
 Put method for "p/o_1_1" resource. More...
 
void register_resources (void)
 register all the resources to the stack this function registers all application level resources: More...
 
void reset_cb (size_t device_index, int reset_value, void *data)
 application reset More...
 
void restart_cb (size_t device_index, void *data)
 restart the device (application depended) More...
 
void swu_cb (size_t device, oc_separate_response_t *response, size_t binary_size, size_t offset, uint8_t *payload, size_t len, void *data)
 software update callback More...
 

Variables

bool g_mystate = false
 the state of the dpa 417.61 More...
 
bool g_reset = false
 reset the device (from startup) More...
 
volatile int quit = 0
 stop variable, used by handle_signal More...
 

Detailed Description

Example device implementing Function Block LSAB

Example code for Function Block LSAB.

Implements data point 61: switch on/off. This implementation is a actuator, e.g. receives data and acts on it.

Application Design

Support functions:

  • app_init:
    • initializes the stack values.
  • register_resources:
    • function that registers all endpoints,
    • sets the GET/PUT/POST/DELETE handlers for each end point
  • main:

    • starts the stack, with the registered resources.
    • can be compiled out with NO_MAIN

    Handlers for the implemented methods (get/post):

    • get_[path] :
      • function that is being called when a GET is called on [path]
      • set the global variables in the output
    • post_[path] :
      • function that is being called when a POST is called on [path]
      • checks the input data
      • if input data is correct
        • updates the global variables

Defines

stack specific defines:

  • linux build for Linux
  • WIN32 build for windows
  • OC_OSCORE oscore is enabled as compile flag

File specific defines:

  • NO_MAIN compile out the function main()
  • INCLUDE_EXTERNAL includes header file "external_header.h", so that other tools/dependencies can be included without changing this code

Definition in file lsab_minimal_all.c.

Macro Definition Documentation

◆ MY_NAME

#define MY_NAME   "Actuator (LSAB) 417"

The name of the application.

Definition at line 100 of file lsab_minimal_all.c.

Function Documentation

◆ app_init()

int app_init ( void  )

function to set up the device.

sets the:

  • serial number
  • base path
  • knx spec version
  • hardware version
  • firmware version
  • hardware type
  • device model

Definition at line 134 of file lsab_minimal_all.c.

135 {
136  /* set the manufacturer name */
137  int ret = oc_init_platform("Cascoda", NULL, NULL);
138 
139  /* set the application name, version, base url, device serial number */
140  ret |= oc_add_device(MY_NAME, "1.0.0", "//", "00FA10010701", NULL, NULL);
141 
143  PRINT("Serial Number: %s\n", oc_string_checked(device->serialnumber));
144 
145  /* set the hardware version 1.0.0 */
146  oc_core_set_device_hwv(0, 1, 0, 0);
147 
148  /* set the firmware version 1.0.0 */
149  oc_core_set_device_fwv(0, 1, 0, 0);
150 
151  /* set the hardware type*/
152  oc_core_set_device_hwt(0, "Pi");
153 
154  /* set the application info*/
155  oc_core_set_device_ap(0, 1, 0, 0);
156 
157  /* set the manufacturer info*/
158  oc_core_set_device_mid(0, 12);
159 
160  /* set the model */
161  oc_core_set_device_model(0, "Cascoda Actuator");
162 
163 #ifdef OC_SPAKE
164 #define PASSWORD "LETTUCE"
165  oc_spake_set_password(PASSWORD);
166  PRINT(" SPAKE password %s\n", PASSWORD);
167 #endif
168 
169  return ret;
170 }
#define MY_NAME
The name of the application.
int oc_add_device(const char *name, const char *version, const char *base, const char *serial_number, oc_add_device_cb_t add_device_cb, void *data)
Add an a device to the stack.
int oc_init_platform(const char *mfg_name, oc_init_platform_cb_t init_platform_cb, void *data)
Initialize the platform.
int oc_core_set_device_fwv(size_t device_index, int major, int minor, int patch)
set the firmware version
int oc_core_set_device_hwt(size_t device_index, const char *hardware_type)
sets the hardware type (string) input string should not be larger than 6, note that if the input is l...
int oc_core_set_device_model(size_t device_index, const char *model)
sets the model (string)
int oc_core_set_device_mid(size_t device_index, uint32_t mid)
sets the manufacturer id
int oc_core_set_device_hwv(size_t device_index, int major, int minor, int patch)
sets the hardware version number
int oc_core_set_device_ap(size_t device_index, int major, int minor, int patch)
sets the application version number
oc_device_info_t * oc_core_get_device_info(size_t device)
retrieve the device info from the device index
#define oc_string_checked(ocstring)
cast oc_string to string, replace null pointer results with a pointer to "NULL"
Definition: oc_helpers.h:56
device information
Definition: oc_core_res.h:158
oc_string_t serialnumber
knx serial number
Definition: oc_core_res.h:159

References MY_NAME, oc_add_device(), oc_core_get_device_info(), and oc_init_platform().

◆ factory_presets_cb()

void factory_presets_cb ( size_t  device,
void *  data 
)

initiate preset for device current implementation: device reset as command line argument

Parameters
devicethe device identifier of the list of devices
datathe supplied data.

Definition at line 377 of file lsab_minimal_all.c.

378 {
379  (void)device;
380  (void)data;
381 
382  if (g_reset) {
383  PRINT("factory_presets_cb: resetting device\n");
385  }
386 }
bool g_reset
reset the device (from startup)
void oc_knx_device_storage_reset(size_t device_index, int reset_mode)
clear the persistent storage reset behavior according to the supplied erase code

References g_reset.

◆ get_o_1_1()

STATIC void get_o_1_1 ( oc_request_t request,
oc_interface_mask_t  interfaces,
void *  user_data 
)

get method for "p/o_1_1" resource.

function is called to initialize the return values of the GET method. initialization of the returned values are done from the global property values. Resource Description: This Resource describes a binary switch (on/off). The Property "value" is a boolean. A value of 'true' means that the switch is on. A value of 'false' means that the switch is off.

Parameters
requestthe request representation.
interfacesthe interface used for this call
user_datathe user data.

Definition at line 185 of file lsab_minimal_all.c.

187 {
188  (void)user_data; /* variable not used */
189 
190  /* TODO: SENSOR add here the code to talk to the HW if one implements a
191  sensor. the call to the HW needs to fill in the global variable before it
192  returns to this function here. alternative is to have a callback from the
193  hardware that sets the global variables.
194  */
195  bool error_state = false; /* the error state, the generated code */
197 
198  PRINT("-- Begin get_dpa_417_61: interface %d\n", interfaces);
199  /* check if the accept header is CBOR */
200  if (oc_check_accept_header(request, APPLICATION_CBOR) == false) {
202  return;
203  }
204 
205  // check the query parameter m with the various values
206  char *m;
207  char *m_key;
208  size_t m_key_len;
209  size_t m_len = (int)oc_get_query_value(request, "m", &m);
210  if (m_len != -1) {
211  PRINT(" Query param: %.*s", (int)m_len, m);
213  size_t device_index = request->resource->device;
214  oc_device_info_t *device = oc_core_get_device_info(device_index);
215  if (device != NULL) {
217  while (oc_iterate_query(request, &m_key, &m_key_len, &m, &m_len) != -1) {
218  // unique identifier
219  if ((strncmp(m, "id", m_len) == 0) | (strncmp(m, "*", m_len) == 0)) {
220  char mystring[100];
221  snprintf(mystring, 99, "urn:knx:sn:%s%s",
222  oc_string(device->serialnumber),
223  oc_string(request->resource->uri));
224  oc_rep_i_set_text_string(root, 0, mystring);
225  }
226  // resource types
227  if ((strncmp(m, "rt", m_len) == 0) | (strncmp(m, "*", m_len) == 0)) {
228  oc_rep_set_text_string(root, rt, "urn:knx:dpa.417.61");
229  }
230  // interfaces
231  if ((strncmp(m, "if", m_len) == 0) | (strncmp(m, "*", m_len) == 0)) {
232  oc_rep_set_text_string(root, if, "if.s");
233  }
234  if ((strncmp(m, "dpt", m_len) == 0) | (strncmp(m, "*", m_len) == 0)) {
235  oc_rep_set_text_string(root, dpt, oc_string(request->resource->dpt));
236  }
237  // ga
238  if ((strncmp(m, "ga", m_len) == 0) | (strncmp(m, "*", m_len) == 0)) {
240  oc_string(request->resource->uri));
241  if (index > -1) {
242  oc_group_object_table_t *got_table_entry =
244  if (got_table_entry) {
245  oc_rep_set_int_array(root, ga, got_table_entry->ga,
246  got_table_entry->ga_len);
247  }
248  }
249  }
250  } /* query iterator */
252  } else {
253  /* device is NULL */
255  }
257  return;
258  }
259 
260  CborError error;
264  error = g_err;
265 
266  if (error) {
267  oc_status_code = true;
268  }
269  PRINT("CBOR encoder size %d\n", oc_rep_get_encoded_payload_size());
270 
271  if (error_state == false) {
273  } else {
275  }
276  PRINT("-- End get_dpa_417_61\n");
277 }
void oc_init_query_iterator(void)
This resets the query iterator to the start of the URI query parameter.
void oc_send_response_no_format(oc_request_t *request, oc_status_t response_code)
Called after the response to a GET, PUT, POST or DELETE call has been prepared completed.
int oc_iterate_query(oc_request_t *request, char **key, size_t *key_len, char **value, size_t *value_len)
Iterate through the URI query parameters and get each key=value pair.
void oc_send_cbor_response(oc_request_t *request, oc_status_t response_code)
Called after the response to a GET, PUT, POST or DELETE call has been prepared completed.
int oc_get_query_value(oc_request_t *request, const char *key, char **value)
Get a pointer to the start of the value in a URL query parameter key=value pair.
bool g_mystate
the state of the dpa 417.61
#define oc_string(ocstring)
cast oc_string to string
Definition: oc_helpers.h:49
int oc_core_find_group_object_table_url(const char *url)
find (first) index in the group address table via url
oc_group_object_table_t * oc_core_get_group_object_table_entry(int index)
retrieve the group object table entry
#define oc_rep_set_text_string(object, key, value)
Add an string value to the cbor object under the key name Example:
Definition: oc_rep.h:401
#define oc_rep_i_set_boolean(object, key, value)
Add an boolean value to the cbor object under the integer key name Example:
Definition: oc_rep.h:378
#define oc_rep_end_root_object()
End the root object.
Definition: oc_rep.h:624
#define oc_rep_begin_root_object()
Begin the root object.
Definition: oc_rep.h:607
#define oc_rep_i_set_text_string(object, key, value)
Add an string value to the cbor object under the integer key name Example:
Definition: oc_rep.h:428
int oc_rep_get_encoded_payload_size(void)
Get the size of the cbor encoded data.
#define oc_rep_set_int_array(object, key, values, length)
Add an integer array with values of length to the cbor object under the key name.
Definition: oc_rep.h:1103
@ OC_STATUS_OK
OK 2.00.
Definition: oc_ri.h:153
@ OC_STATUS_BAD_OPTION
Bad Option 4.02.
Definition: oc_ri.h:160
bool oc_check_accept_header(oc_request_t *request, oc_content_format_t accept)
checks if the accept header is correct note that if the accept header is not there,...
@ APPLICATION_CBOR
application/cbor
Definition: oc_ri.h:207
int oc_status_code(oc_status_t key)
convert the (internal) status code to coap status as integer
Group Object Table Resource (/fp/g) The payload is an array of objects.
Definition: oc_knx_fp.h:119
int ga_len
length of the array of ga identifiers
Definition: oc_knx_fp.h:123
uint32_t * ga
array of group addresses (unsigned integers)
Definition: oc_knx_fp.h:124
const oc_resource_t * resource
resource structure
Definition: oc_ri.h:414
size_t device
device index
Definition: oc_ri.h:484
oc_string_t dpt
dpt of the resource
Definition: oc_ri.h:488
oc_string_t uri
uri of the resource
Definition: oc_ri.h:486

References oc_status_code(), and OC_STATUS_OK.

◆ handle_signal()

void handle_signal ( int  signal)

handle Ctrl-C

Parameters
signalthe captured signal

Definition at line 522 of file lsab_minimal_all.c.

523 {
524  (void)signal;
525  signal_event_loop();
526  quit = 1;
527 }
volatile int quit
stop variable, used by handle_signal

References quit.

Referenced by main().

◆ hostname_cb()

void hostname_cb ( size_t  device_index,
oc_string_t  host_name,
void *  data 
)

set the host name on the device (application depended)

Parameters
device_indexthe device identifier of the list of devices
host_namethe host name to be set on the device
datathe supplied data.

Definition at line 428 of file lsab_minimal_all.c.

429 {
430  (void)device_index;
431  (void)data;
432 
433  PRINT("-----host name ------- %s\n", oc_string_checked(host_name));
434 }

◆ initialize_variables()

void initialize_variables ( void  )

initializes the global variables registers and starts the handler

Definition at line 485 of file lsab_minimal_all.c.

486 {
487  /* initialize global variables for resources */
488 }

◆ main()

int main ( int  argc,
char *  argv[] 
)

main application.

initializes the global variables registers and starts the handler handles (in a loop) the next event. shuts down the stack

Definition at line 551 of file lsab_minimal_all.c.

552 {
553  int init;
554  oc_clock_time_t next_event;
555  char *fname = "my_software_image";
556 
557 #ifdef WIN32
558  /* windows specific */
559  InitializeCriticalSection(&cs);
560  InitializeConditionVariable(&cv);
561  /* install Ctrl-C */
562  signal(SIGINT, handle_signal);
563 #endif
564 #ifdef __linux__
565  /* Linux specific */
566  struct sigaction sa;
567  sigfillset(&sa.sa_mask);
568  sa.sa_flags = 0;
569  sa.sa_handler = handle_signal;
570  /* install Ctrl-C */
571  sigaction(SIGINT, &sa, NULL);
572 #endif
573 
574  for (int i = 0; i < argc; i++) {
575  PRINT("argv[%d] = %s\n", i, argv[i]);
576  }
577  if (argc > 1) {
578  if (strcmp(argv[1], "reset") == 0) {
579  PRINT(" internal reset\n");
580  g_reset = true;
581  }
582  if (strcmp(argv[1], "-help") == 0) {
583  print_usage();
584  }
585  }
586 
587  PRINT("KNX-IOT Server name : \"%s\"\n", MY_NAME);
588 
589  char buff[FILENAME_MAX];
590  char *retbuf = NULL;
591  retbuf = GetCurrentDir(buff, FILENAME_MAX);
592  if (retbuf != NULL) {
593  PRINT("Current working dir: %s\n", buff);
594  }
595 
596  /*
597  The storage folder depends on the build system
598  the folder is created in the makefile, with $target as name with _cred as
599  post fix.
600  */
601  PRINT("\tstorage at './LSAB_minimal_creds' \n");
602  oc_storage_config("./LSAB_minimal_creds");
603 
604  /*initialize the variables */
606 
607  /* initializes the handlers structure */
608  STATIC const oc_handler_t handler = { .init = app_init,
609  .signal_event_loop = signal_event_loop,
610  .register_resources = register_resources
611 #ifdef OC_CLIENT
612  ,
613  .requests_entry = 0
614 #endif
615  };
616 
617  /* set the application callbacks */
619  oc_set_reset_cb(reset_cb, NULL);
622  oc_set_swu_cb(swu_cb, (void *)fname);
623 
624  /* start the stack */
625  init = oc_main_init(&handler);
626 
627  if (init < 0) {
628  PRINT("oc_main_init failed %d, exiting.\n", init);
629  return init;
630  }
631 #ifdef OC_OSCORE
632  PRINT("OSCORE - Enabled\n");
633 #else
634  PRINT("OSCORE - Disabled\n");
635 #endif /* OC_OSCORE */
636 
638  PRINT("serial number: %s\n", oc_string_checked(device->serialnumber));
639 
641  if (my_ep != NULL) {
642  PRINTipaddr(*my_ep);
643  PRINT("\n");
644  }
645  PRINT("Server \"%s\" running, waiting on incoming "
646  "connections.\n",
647  MY_NAME);
648 
649 #ifdef WIN32
650  /* windows specific loop */
651  while (quit != 1) {
652  next_event = oc_main_poll();
653  if (next_event == 0) {
654  SleepConditionVariableCS(&cv, &cs, INFINITE);
655  } else {
656  oc_clock_time_t now = oc_clock_time();
657  if (now < next_event) {
658  SleepConditionVariableCS(
659  &cv, &cs, (DWORD)((next_event - now) * 1000 / OC_CLOCK_SECOND));
660  }
661  }
662  }
663 #endif
664 
665 #ifdef __linux__
666  /* Linux specific loop */
667  while (quit != 1) {
668  next_event = oc_main_poll();
669  pthread_mutex_lock(&mutex);
670  if (next_event == 0) {
671  pthread_cond_wait(&cv, &mutex);
672  } else {
673  ts.tv_sec = (next_event / OC_CLOCK_SECOND);
674  ts.tv_nsec = (next_event % OC_CLOCK_SECOND) * 1.e09 / OC_CLOCK_SECOND;
675  pthread_cond_timedwait(&cv, &mutex, &ts);
676  }
677  pthread_mutex_unlock(&mutex);
678  }
679 #endif
680 
681  /* shut down the stack */
682 
684  return 0;
685 }
void initialize_variables(void)
initializes the global variables registers and starts the handler
int app_init(void)
function to set up the device.
void swu_cb(size_t device, oc_separate_response_t *response, size_t binary_size, size_t offset, uint8_t *payload, size_t len, void *data)
software update callback
void reset_cb(size_t device_index, int reset_value, void *data)
application reset
void factory_presets_cb(size_t device, void *data)
initiate preset for device current implementation: device reset as command line argument
void handle_signal(int signal)
handle Ctrl-C
void print_usage()
print usage and quits
void register_resources(void)
register all the resources to the stack this function registers all application level resources:
void restart_cb(size_t device_index, void *data)
restart the device (application depended)
void hostname_cb(size_t device_index, oc_string_t host_name, void *data)
set the host name on the device (application depended)
void oc_set_reset_cb(oc_reset_cb_t cb, void *data)
Set the reset callback.
void oc_set_restart_cb(oc_restart_cb_t cb, void *data)
Set the restart callback.
void oc_set_factory_presets_cb(oc_factory_presets_cb_t cb, void *data)
Set the factory presets callback.
void oc_main_shutdown(void)
Shutdown and free all stack related resources.
oc_clock_time_t oc_main_poll(void)
poll to process tasks
int oc_main_init(const oc_handler_t *handler)
Register and call handler functions responsible for controlling the stack.
void oc_set_hostname_cb(oc_hostname_cb_t cb, void *data)
Set the host name callback.
oc_clock_time_t oc_clock_time(void)
Get the current clock time.
oc_endpoint_t * oc_connectivity_get_endpoints(size_t device)
retrieve list of endpoints for the device
void oc_set_swu_cb(oc_swu_cb_t cb, void *data)
Set the software update callback.
int oc_storage_config(const char *store)
open the storage NOTE: For embedded devices, this function doesn't do anything.
the endpoint information
Definition: oc_endpoint.h:78
Call back handlers that are invoked in response to oc_main_init()
Definition: oc_api.h:116
int(* init)(void)
Device initialization callback that is invoked to initialize the platform and device(s).
Definition: oc_api.h:141

References handle_signal().

◆ print_usage()

void print_usage ( )

print usage and quits

Definition at line 534 of file lsab_minimal_all.c.

535 {
536  PRINT("Usage:\n");
537  PRINT("no arguments : starts the server\n");
538  PRINT("-help : this message\n");
539  PRINT("reset : does an full reset of the device\n");
540  exit(0);
541 }

◆ put_o_1_1()

STATIC void put_o_1_1 ( oc_request_t request,
oc_interface_mask_t  interfaces,
void *  user_data 
)

Put method for "p/o_1_1" resource.

The function has as input the request body, which are the input values of the PUT method. The input values (as a set) are checked if all supplied values are correct. If the input values are correct, they will be assigned to the global property values. Resource Description:

Parameters
requestthe request representation.
interfacesthe used interfaces during the request.
user_datathe supplied user data.

Definition at line 292 of file lsab_minimal_all.c.

294 {
295  (void)interfaces;
296  (void)user_data;
297  bool error_state = false;
298  PRINT("-- Begin put_dpa_417_61:\n");
299 
300  oc_rep_t *rep = NULL;
301  // handle the different requests
302  if (oc_is_redirected_request(request)) {
303  PRINT(" S-MODE or /P\n");
304  }
305  rep = request->request_payload;
306  while (rep != NULL) {
307  if (rep->type == OC_REP_BOOL) {
308  if (rep->iname == 1) {
309  PRINT(" put_dpa_417_61 received : %d\n", rep->value.boolean);
310  g_mystate = rep->value.boolean;
312  PRINT("-- End put_dpa_417_61\n");
313  return;
314  }
315  }
316  rep = rep->next;
317  }
318 
320  PRINT("-- End put_dpa_417_61\n");
321 }
bool oc_is_redirected_request(oc_request_t *request)
checks if the request is a redirected request from /k or /p when that happened, extra information can...
@ OC_STATUS_BAD_REQUEST
Bad Request 4.00.
Definition: oc_ri.h:158
@ OC_STATUS_CHANGED
Changed 2.04.
Definition: oc_ri.h:155
parsed entry of a cbor object This represents a link list of response values one can iterate over the...
Definition: oc_rep.h:1642
oc_rep_value_type_t type
type of the data
Definition: oc_rep.h:1643
union oc_rep_s::oc_rep_value value
the value as union
struct oc_rep_s * next
next in list
Definition: oc_rep.h:1644
int iname
integer (identifier) as tag name
Definition: oc_rep.h:1646
oc_rep_t * request_payload
request payload structure
Definition: oc_ri.h:419

◆ register_resources()

void register_resources ( void  )

register all the resources to the stack this function registers all application level resources:

  • each resource path is bind to a specific function for the supported methods (GET, POST, PUT, DELETE)
  • each resource is:
    • secure
    • observable
    • discoverable
    • used interfaces

URL Table

resource url functional block/dpa GET PUT
p/o_1_1 urn:knx:dpa.417.61 Yes Yes

Definition at line 340 of file lsab_minimal_all.c.

341 {
342  PRINT("Register Resource with local path \"/p/o_1_1\"\n");
343  PRINT("Light Switching actuator 417 (LSAB) : SwitchOnOff \n");
344  PRINT("Data point 417.61 (DPT_Switch) \n");
345  oc_resource_t *res_light =
346  oc_new_resource("light actuation", "/p/o_1_1", 2, 0);
347  oc_resource_bind_resource_type(res_light, "urn:knx:dpa.417.61");
348  oc_resource_bind_dpt(res_light, "urn:knx:dpt.Switch");
350  oc_resource_bind_resource_interface(res_light, OC_IF_A); /* if.a */
351  oc_resource_set_discoverable(res_light, true);
352  /* periodic observable
353  to be used when one wants to send an event per time slice
354  period is 1 second */
356  /* set observable
357  events are send when oc_notify_observers(oc_resource_t *resource) is
358  called. this function must be called when the value changes, preferable on
359  an interrupt when something is read from the hardware. */
360  // oc_resource_set_observable(res_352, true);
361  // set the GET handler
363  // set the PUT handler
365  // register this resource,
366  // this means that the resource will be listed in /.well-known/core
367  oc_add_resource(res_light);
368 }
void oc_resource_set_discoverable(oc_resource_t *resource, bool state)
Specify if a resource can be found using .well-known/core discover mechanisms.
oc_resource_t * oc_new_resource(const char *name, const char *uri, uint8_t num_resource_types, size_t device)
Allocate and populate a new oc_resource_t.
void oc_resource_bind_content_type(oc_resource_t *resource, oc_content_format_t content_type)
set the content type on the resource
void oc_resource_bind_dpt(oc_resource_t *resource, const char *dpt)
Add a Data Point Type "dpt" property to the resource.
bool oc_add_resource(oc_resource_t *resource)
Add a resource to the stack.
void oc_resource_bind_resource_type(oc_resource_t *resource, const char *type)
Add a Resource Type "rt" property to the resource.
void oc_resource_set_periodic_observable(oc_resource_t *resource, uint16_t seconds)
The resource will periodically notify observing clients of is property values.
void oc_resource_bind_resource_interface(oc_resource_t *resource, oc_interface_mask_t iface_mask)
Add the supported interface(s) to the resource.
void oc_resource_set_request_handler(oc_resource_t *resource, oc_method_t method, oc_request_callback_t callback, void *user_data)
Specify a request_callback for GET, PUT, POST, and DELETE methods.
STATIC void put_o_1_1(oc_request_t *request, oc_interface_mask_t interfaces, void *user_data)
Put method for "p/o_1_1" resource.
STATIC void get_o_1_1(oc_request_t *request, oc_interface_mask_t interfaces, void *user_data)
get method for "p/o_1_1" resource.
@ OC_PUT
PUT.
Definition: oc_ri.h:127
@ OC_GET
GET.
Definition: oc_ri.h:125
@ OC_IF_A
if.a (128)
Definition: oc_ri.h:269
resource structure
Definition: oc_ri.h:482

◆ reset_cb()

void reset_cb ( size_t  device_index,
int  reset_value,
void *  data 
)

application reset

Parameters
device_indexthe device identifier of the list of devices
reset_valuethe knx reset value
datathe supplied data.

Definition at line 396 of file lsab_minimal_all.c.

397 {
398  (void)device_index;
399  (void)data;
400 
401  PRINT("reset_cb %d\n", reset_value);
402 }

◆ restart_cb()

void restart_cb ( size_t  device_index,
void *  data 
)

restart the device (application depended)

Parameters
device_indexthe device identifier of the list of devices
datathe supplied data.

Definition at line 411 of file lsab_minimal_all.c.

412 {
413  (void)device_index;
414  (void)data;
415 
416  PRINT("-----restart_cb -------\n");
417  // exit(0);
418 }

◆ swu_cb()

void swu_cb ( size_t  device,
oc_separate_response_t response,
size_t  binary_size,
size_t  offset,
uint8_t *  payload,
size_t  len,
void *  data 
)

software update callback

Parameters
devicethe device index
responsethe instance of an internal struct that is used to track the state of the separate response
binary_sizethe full size of the binary
offsetthe offset of the image
payloadthe image data
lenthe length of the image data
datathe user data

Definition at line 465 of file lsab_minimal_all.c.

467 {
468  (void)device;
469  (void)binary_size;
470  char filename[] = "./downloaded.bin";
471  PRINT(" swu_cb %s block=%d size=%d \n", filename, (int)offset, (int)len);
472 
473  FILE *write_ptr = fopen("downloaded_bin", "ab");
474  size_t r = fwrite(payload, sizeof(*payload), len, write_ptr);
475  fclose(write_ptr);
476 
477  oc_set_delayed_callback(response, &send_delayed_response, 0);
478 }
void oc_set_delayed_callback(void *cb_data, oc_trigger_t callback, uint16_t seconds)
Schedule a callback to be invoked after a set number of seconds.

Variable Documentation

◆ g_mystate

bool g_mystate = false

the state of the dpa 417.61

Definition at line 116 of file lsab_minimal_all.c.

◆ g_reset

bool g_reset = false

reset the device (from startup)

Definition at line 118 of file lsab_minimal_all.c.

Referenced by factory_presets_cb().

◆ quit

volatile int quit = 0

stop variable, used by handle_signal

Definition at line 117 of file lsab_minimal_all.c.

Referenced by handle_signal().