SingingCat  0
application
user_app_info.h
Go to the documentation of this file.
1 #ifndef USER_APP_INFO_H
2 #define USER_APP_INFO_H
3 #include "command.h"
4 #include "routing.h"
5 #include "stdarg.h"
6 #include "sctime.h"
7 #include "sensors/sensor_dev.h"
8 
19 typedef int MCULIB_HANDLE;
20 typedef void (*pin_irq_callback)(int pin);
21 typedef void (*irq_callback)(void);
22 typedef void (*serial_recv_callback)(int port, uint8_t b);
23 typedef void (*cpkt_callback)(struct command *com, struct command *reply);
27 typedef struct sc_firmware_api {
28  int version;
30  void (*debugf)(const char *format, ...);
32  void (*printf)(const char *format, ...);
39  int (*mculib_serialport_enable)(MCULIB_HANDLE handle, int portnum, int baudrate);
40  int (*mculib_serialport_disable)(MCULIB_HANDLE handle, int portnum);
44  int (*mculib_serialport_callback)(MCULIB_HANDLE handle, serial_recv_callback cb);
48  int (*mculib_serialport_write_char)(MCULIB_HANDLE handle, int portnum, uint8_t b);
53  int (*mculib_pin_out)(MCULIB_HANDLE handle, int pinnum, int speed);
58  int (*mculib_pin_out_opendrain)(MCULIB_HANDLE handle, int pinnum, int speed);
64  int (*mculib_pin_in)(MCULIB_HANDLE handle, int pinnum, int speed, int mode);
68  int (*mculib_pin_in_callback)(MCULIB_HANDLE handle, pin_irq_callback pic);
72  int (*mculib_pin_set)(MCULIB_HANDLE handle, int pinnum, int highlow);
76  int (*mculib_pin_release)(MCULIB_HANDLE handle, int pinnum);
81  int (*mculib_pin_get)(MCULIB_HANDLE handle, int pinnum);
85  int (*mculib_serialport_write_string)(MCULIB_HANDLE handle, int port, const char *txt);
86  uint8_t (*mculib_has_time_passed)(int secs_to_wait, long *ctr);
95  int (*mculib_spi_disable)(MCULIB_HANDLE handle, int portnum);
100  int (*mculib_spi_speed)(MCULIB_HANDLE handle, int portnum, long khz);
104  int (*mculib_spi_master_enable3)(MCULIB_HANDLE handle, int portnum, uint8_t wide, uint8_t clkpol, uint8_t cpha, uint8_t dir,uint32_t baud_in_khz);
111  int (*mculib_spi_write_and_read)(MCULIB_HANDLE handle, int portnum, const uint16_t write, uint16_t *read);
117  int (*mculib_spi_write_only)(MCULIB_HANDLE handle, int portnum, const uint16_t write);
121  int (*mculib_spi_read16_only)(MCULIB_HANDLE handle, int portnum, uint16_t *read);
122 /***************
123  * timers
124  */
125  int (*mculib_timer_enable_simple)(MCULIB_HANDLE handle, int timer, int freq, irq_callback callback);
126  int (*mculib_timer_disable)(MCULIB_HANDLE handle, int timer);
127  int (*mculib_timer_attach_pin_pwm)(MCULIB_HANDLE handle, int timer, int pin);
128  int (*mculib_timer_set_pwm)(MCULIB_HANDLE handle, int timer, int pin, uint16_t dutycycle);
129 
130 /******************
131  * ADC
132  */
133  int (*mculib_adc_read_once)(MCULIB_HANDLE handle, int pin, int *result);
134  int (*mculib_adc_get_resolution)(MCULIB_HANDLE handle, int pin);
135  int (*mculib_adc_enable)(MCULIB_HANDLE handle, int pin);
136  int (*mculib_adc_read)(MCULIB_HANDLE handle, int pin, int *result);
137  /***********************
138  * command handler
139  **********************/
143  const char *(*com_get_named_arg)(struct command *com, const char *name) ;
149  const char *(*com_get_arg)(const struct command *com, int index) ;
153  int (* com_get_arg_size)(const struct command *com, int index) ;
157  void (*com_add_arg)(struct command *com, const char *format, ...) ;
161  void (*com_add_varg)(struct command *com, const char *format, va_list args) ;
165  struct command * (*com_alloc)() ;
169  struct command *(*com_get_data_reply)(struct command *com) ;
173  int (*com_send_reply_with_args)(struct command *com, uint8_t flags, const char *format, ...) ;
177  int (*com_deliver_command)(struct command *com, cpkt_callback);
178 
179  /*********************************
180  * sensor stuff
181  *********************************/
185  int (*sensor_register)(struct sensordev *sensor);
186  /*********************************
187  * helper stuff
188  *********************************/
189  void (*snprintf)(char *buf, int size, const char *format, ...) ;
190  void (*vsnprintf)(char *buf, int size, const char *format, va_list args) ;
191  void (* strncpy)(char *dst, const char *src, int size) ;
192  int (*strlen)(const char *txt);
193  void (*memset)(void *buf, int c, int n) ;
194  int (*strcmp)(const char *c1, const char *c2) ;
195  int (* atoi)(const char *s);
196  /*********************************
197  * led
198  *********************************/
202  void (*led_blink) (int colour, int brightness, int on, int off);
203  /*********************************
204  * flags
205  *********************************/
209  int (*get_config_flag) (int flag);
213  int (*com_send_command)(struct command *com);
214 
215  /*********************************
216  * more spi
217  *********************************/
218  int (*mculib_spi_send_dma)(MCULIB_HANDLE handle, int portno,void *data, uint32_t size,uint32_t flags);
219  /*********************************
220  * more helpers
221  *********************************/
225  int (*com_get_named_arg_uint32)(struct command *com, const char *name, uint32_t *result ) ;
229  int (*com_get_named_arg_uint16)(struct command *com, const char *name, uint16_t *result ) ;
230  /*********************************
231  * userconfig
232  *********************************/
243  uint32_t (*userconfig_size)();
248  uint32_t (*userconfig_version)();
254  int (*userconfig_copy)(uint8_t *buf,uint16_t bufsize,uint16_t *actual_size);
259  int (* userconfig_write)(uint8_t *buf, uint32_t size);
263  void (*com_free)(struct command *com);
267  struct sensorruntime *(*sensor_get_runtime_by_index)(int idx);
271  int (*proto_buf_to_struct)(void *buf, int bufsize, void *iter, void *out) ;
275  int (*proto_struct_to_buf)(void *buf, int bufsize, void *iter, void *in) ;
279  void (*proto_release)(void *buf);
283  void (*pin_pwm)(int MCULIBHANDLE,int pin, uint32_t newstate, int flags);
287  int (*time_get_localtime_as_struct)(struct sctime *time);
292  int (*timer_softirq)(uint32_t hertz,uint32_t opaque, void (*callback)(uint32_t));
296  int (*time_get_diff)(struct sctime *time1,struct sctime *time2);
300  void (*time_bcd_to_timestruct)(uint32_t bcd_time,uint32_t bcd_date,struct sctime *out);
301 
302  /********************************* add calls above here ***************/
303 
304 
308  int (*unhandled_call1)();
312  int (*unhandled_call2)();
316  int (*unhandled_call3)();
320  int (*unhandled_call4)();
324  int (*unhandled_call5)();
328  int (*unhandled_call6)();
332  int (*unhandled_call7)();
336  int (*unhandled_call8)();
338 
339 
340 /**********************************************************************************/
341 
342 
346 typedef struct userapp_info {
347  /* \brief must contain "SCUA" (0x53435541) for the firmware to recognize this as valid userapp */
348  uint32_t magic;
349  /* \brief length of binary code. usually fuild in during build */
350  uint32_t length;
351  /* \brief checksum of binary code. usually fuild in during build */
352  uint32_t checksum;
353  /* \brief version of binary code. usually fuild in during build */
354  uint32_t version;
355  /* \brief used by the firmeware to determine which one is latest in flash. calculated and patched during installation */
356  uint32_t pad1;
357  uint32_t pad2;
358  /* \brief pointer to address at which userapp code must be loaded */
359  void *base;
360  /* \brief build_timestamp, usually patched in during build */
361  uint32_t build_timestamp;
362  /* \brief git repositoryid, usually patched in during build */
363  uint32_t repoid;
365  void (*start)(int MCULIBHANDLE, struct sc_firmware_api *api);
367  void (*stop)();
372  void (*user_loop)();
373 
385  int (*on_command_received)(struct command *com);
390  void (*on_new_node)(struct hostroute *host);
391  void *end_marker;
393 
394 
395 #endif
long host
Definition: routing.h:21
int(* sensor_register)(struct sensordev *sensor)
register a new sensor. returns 0 if ok
int(* mculib_serialport_write_char)(MCULIB_HANDLE handle, int portnum, uint8_t b)
write to serial port
Definition: user_app_info.h:48
int(* mculib_pin_in_callback)(MCULIB_HANDLE handle, pin_irq_callback pic)
set a callback to be called whenever a pin irq is triggered
Definition: user_app_info.h:68
void(* stop)()
last thing to be called. no more userloops or irqs afterwards
int(* time_get_localtime_as_struct)(struct sctime *time)
get the current time as time struct (return 0 if ok, otherwise error)
int(* mculib_pin_in)(MCULIB_HANDLE handle, int pinnum, int speed, int mode)
configure and enable an IO-Pin as input note: pinnum are sequential 0-99 are PAnn,...
Definition: user_app_info.h:64
void(* led_blink)(int colour, int brightness, int on, int off)
set the led to a certain colour or blink. to set a solid colour set off==0
int(* com_send_command)(struct command *com)
int(* mculib_spi_write_only)(MCULIB_HANDLE handle, int portnum, const uint16_t write)
write a byte, discard the read if a transmission is already in progress wait until transmission is do...
int(* mculib_pin_release)(MCULIB_HANDLE handle, int pinnum)
deconfigure a pin (MCULIB_HANDLE handle,used for a different purpose)
Definition: user_app_info.h:76
int(* com_get_named_arg_uint16)(struct command *com, const char *name, uint16_t *result)
0 == ok, otherwise error. if OK, value will be stored in "result"
int(* unhandled_call1)()
safety call, terminates the app
int(* unhandled_call3)()
safety call, terminates the app
int(* on_command_received)(struct command *com)
this is called for each command we receive
void(* com_add_arg)(struct command *com, const char *format,...)
add an argument to the command using a format strings (see printf)
long(* mculib_get_seconds_since_boot)(void)
get number of seconds elapsed since boot or power-up this counter is usually ever-increasing and roug...
Definition: user_app_info.h:91
int(* mculib_spi_master_enable3)(MCULIB_HANDLE handle, int portnum, uint8_t wide, uint8_t clkpol, uint8_t cpha, uint8_t dir, uint32_t baud_in_khz)
enable a spi port as master and set clkpol, cpha and width (wide=0 8bit, wide=1 16bit)(dir == 0=RW,...
void(* start)(int MCULIBHANDLE, struct sc_firmware_api *api)
guaranteed to be called by the firmware before any other functions
int(* proto_buf_to_struct)(void *buf, int bufsize, void *iter, void *out)
decode a buffer containing a serialised proto into a struct
uint32_t(* userconfig_size)()
the userconfig: this is a little unstructured piece of flash set aside for configuration of userapps....
void(* printf)(const char *format,...)
print a message on console and possibly forward to server into logfile as well (uses radio - expensiv...
Definition: user_app_info.h:32
void(* com_add_varg)(struct command *com, const char *format, va_list args)
add an argument to the command using vargs
int(* mculib_serialport_enable)(MCULIB_HANDLE handle, int portnum, int baudrate)
configure a serial port with specified parameters num == 1..n (depending on mcu) baudrate == ....
Definition: user_app_info.h:39
int(* timer_softirq)(uint32_t hertz, uint32_t opaque, void(*callback)(uint32_t))
a very simple, not-very-accurate softirq callback. May be called multiple times returns 0 if ok,...
int(* unhandled_call2)()
safety call, terminates the app
int(* userconfig_copy)(uint8_t *buf, uint16_t bufsize, uint16_t *actual_size)
this copies the userconfig into a ram buffer, IF the version has been updated and IF the destination ...
int(* mculib_pin_set)(MCULIB_HANDLE handle, int pinnum, int highlow)
set IOPin to high or low
Definition: user_app_info.h:72
int(* mculib_spi_disable)(MCULIB_HANDLE handle, int portnum)
disable the spi port
Definition: user_app_info.h:95
struct userapp_info _userapp_info_t
this must be implemented by the userapp, stored in flash at the beginning of the file (offset 0)
int(* unhandled_call5)()
safety call, terminates the app
struct sc_firmware_api _sc_firmware_api
these are the callbacks available. the firmware "api". provided to the app on startup
int(* com_deliver_command)(struct command *com, cpkt_callback)
queue a command for sending. This is asynchronous, transmission will be retried and re-routed as nece...
int(* mculib_spi_write_and_read)(MCULIB_HANDLE handle, int portnum, const uint16_t write, uint16_t *read)
write a byte and read from spi if a transmission is already in progress it waits. this writes and wai...
int(* unhandled_call8)()
safety call, terminates the app
int(* mculib_spi_read16_only)(MCULIB_HANDLE handle, int portnum, uint16_t *read)
there are weird devices, like tli4970, which aren't really spi. they basically start sending as soon ...
void(* debugf)(const char *format,...)
print a message on console/usb (only)
Definition: user_app_info.h:30
int(* mculib_pin_get)(MCULIB_HANDLE handle, int pinnum)
get current pin level (high or low) this is a bit funny: 0 or 1 indicate the pin level....
Definition: user_app_info.h:81
int(* time_get_diff)(struct sctime *time1, struct sctime *time2)
calculate seconds between two time structs
int(* userconfig_write)(uint8_t *buf, uint32_t size)
this saves a buf as "userconfig" RETURN VALUE: 0==ok, anything else is an error (same version is not ...
void(* on_new_node)(struct hostroute *host)
called when and if a new node is detected. this may be used, to, for example detect a route to the cl...
void(* user_loop)()
this is called frequently, but with no timing guarantees. essentially, it's called in the "idle-loop"...
int(* unhandled_call6)()
safety call, terminates the app
int(* unhandled_call4)()
safety call, terminates the app
int(* get_config_flag)(int flag)
get a userconfig flag (0..n)
void(* pin_pwm)(int MCULIBHANDLE, int pin, uint32_t newstate, int flags)
pwm a pin (mosfets, and some other pins as well)
void(* com_free)(struct command *com)
free a command
int(* com_get_arg_size)(const struct command *com, int index)
get size (in bytes) of an argument by index
int(* com_get_named_arg_uint32)(struct command *com, const char *name, uint32_t *result)
0 == ok, otherwise error. if OK, value will be stored in "result"
int(* mculib_serialport_write_string)(MCULIB_HANDLE handle, int port, const char *txt)
write a string to serial port
Definition: user_app_info.h:85
int(* mculib_pin_out)(MCULIB_HANDLE handle, int pinnum, int speed)
configure and enable an IO-Pin as output note: pinnum are sequential 0-99 are PAnn,...
Definition: user_app_info.h:53
void(* time_bcd_to_timestruct)(uint32_t bcd_time, uint32_t bcd_date, struct sctime *out)
convert BCDTime and BCDDate to timestruct
int(* com_send_reply_with_args)(struct command *com, uint8_t flags, const char *format,...)
send a reply together with arguments
int(* unhandled_call7)()
safety call, terminates the app
int(* mculib_pin_out_opendrain)(MCULIB_HANDLE handle, int pinnum, int speed)
configure and enable an IO-Pin as output note: pinnum are sequential 0-99 are PAnn,...
Definition: user_app_info.h:58
int(* mculib_spi_speed)(MCULIB_HANDLE handle, int portnum, long khz)
set the spi speed (after it's open and running) returns new speed or 0 if failure
int(* mculib_serialport_callback)(MCULIB_HANDLE handle, serial_recv_callback cb)
set callback for serialport receive irq
Definition: user_app_info.h:44
void(* proto_release)(void *buf)
release a proto struct
uint32_t(* userconfig_version)()
each time the config is updated, the version is incremented. in other words, unless the version is ch...
int(* proto_struct_to_buf)(void *buf, int bufsize, void *iter, void *in)
encode a struct to a buffer. returns number of bytes written. (-1 for error)
definitions of routing table structures
int com
Definition: command.h:22
int index
Definition: command.h:13
uint8_t flags
Definition: command.h:23
these are the callbacks available. the firmware "api". provided to the app on startup
Definition: user_app_info.h:27
Definition: sctime.h:3
runtime data per sensor (in-ram)
Definition: sensor_dev.h:33
this must be implemented by the userapp, stored in flash at the beginning of the file (offset 0)