mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	cleanup: break out event-related code into event.[c|h]
In an effort to reduce the size of dive.h and dive.c, break out the event related functions. Moreover event-names were handled by the profile-code, collect that also in the new source files. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									d82a7b8b73
								
							
						
					
					
						commit
						8212acc992
					
				
					 26 changed files with 234 additions and 187 deletions
				
			
		|  | @ -2,6 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "command_event.h" | #include "command_event.h" | ||||||
| #include "core/dive.h" | #include "core/dive.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/selection.h" | #include "core/selection.h" | ||||||
| #include "core/subsurface-qt/divelistnotifier.h" | #include "core/subsurface-qt/divelistnotifier.h" | ||||||
| #include "core/libdivecomputer.h" | #include "core/libdivecomputer.h" | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ | ||||||
| 
 | 
 | ||||||
| #include "command_base.h" | #include "command_base.h" | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| // We put everything in a namespace, so that we can shorten names without polluting the global namespace
 | // We put everything in a namespace, so that we can shorten names without polluting the global namespace
 | ||||||
| namespace Command { | namespace Command { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -77,6 +77,8 @@ set(SUBSURFACE_CORE_LIB_SRCS | ||||||
| 	divesitehelpers.h | 	divesitehelpers.h | ||||||
| 	downloadfromdcthread.cpp | 	downloadfromdcthread.cpp | ||||||
| 	downloadfromdcthread.h | 	downloadfromdcthread.h | ||||||
|  | 	event.c | ||||||
|  | 	event.h | ||||||
| 	equipment.c | 	equipment.c | ||||||
| 	equipment.h | 	equipment.h | ||||||
| 	errorhelper.c | 	errorhelper.c | ||||||
|  |  | ||||||
							
								
								
									
										97
									
								
								core/dive.c
									
										
									
									
									
								
							
							
						
						
									
										97
									
								
								core/dive.c
									
										
									
									
									
								
							|  | @ -13,6 +13,7 @@ | ||||||
| #include "divelist.h" | #include "divelist.h" | ||||||
| #include "divesite.h" | #include "divesite.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
|  | #include "event.h" | ||||||
| #include "qthelper.h" | #include "qthelper.h" | ||||||
| #include "membuffer.h" | #include "membuffer.h" | ||||||
| #include "picture.h" | #include "picture.h" | ||||||
|  | @ -21,7 +22,6 @@ | ||||||
| #include "structured_list.h" | #include "structured_list.h" | ||||||
| #include "fulltext.h" | #include "fulltext.h" | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* one could argue about the best place to have this variable -
 | /* one could argue about the best place to have this variable -
 | ||||||
|  * it's used in the UI, but it seems to make the most sense to have it |  * it's used in the UI, but it seems to make the most sense to have it | ||||||
|  * here */ |  * here */ | ||||||
|  | @ -123,58 +123,6 @@ int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer | ||||||
| 	return o2sensor < 0 ? 256 : o2sensor; | 	return o2sensor < 0 ? 256 : o2sensor; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int event_is_gaschange(const struct event *ev) |  | ||||||
| { |  | ||||||
| 	return ev->type == SAMPLE_EVENT_GASCHANGE || |  | ||||||
| 		ev->type == SAMPLE_EVENT_GASCHANGE2; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool event_is_divemodechange(const struct event *ev) |  | ||||||
| { |  | ||||||
| 	return same_string(ev->name, "modechange"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct event *create_event(unsigned int time, int type, int flags, int value, const char *name) |  | ||||||
| { |  | ||||||
| 	int gas_index = -1; |  | ||||||
| 	struct event *ev; |  | ||||||
| 	unsigned int size, len = strlen(name); |  | ||||||
| 
 |  | ||||||
| 	size = sizeof(*ev) + len + 1; |  | ||||||
| 	ev = malloc(size); |  | ||||||
| 	if (!ev) |  | ||||||
| 		return NULL; |  | ||||||
| 	memset(ev, 0, size); |  | ||||||
| 	memcpy(ev->name, name, len); |  | ||||||
| 	ev->time.seconds = time; |  | ||||||
| 	ev->type = type; |  | ||||||
| 	ev->flags = flags; |  | ||||||
| 	ev->value = value; |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Expand the events into a sane format. Currently |  | ||||||
| 	 * just gas switches |  | ||||||
| 	 */ |  | ||||||
| 	switch (type) { |  | ||||||
| 	case SAMPLE_EVENT_GASCHANGE2: |  | ||||||
| 		/* High 16 bits are He percentage */ |  | ||||||
| 		ev->gas.mix.he.permille = (value >> 16) * 10; |  | ||||||
| 
 |  | ||||||
| 		/* Extension to the GASCHANGE2 format: cylinder index in 'flags' */ |  | ||||||
| 		/* TODO: verify that gas_index < num_cylinders. */ |  | ||||||
| 		if (flags > 0) |  | ||||||
| 			gas_index = flags-1; |  | ||||||
| 	/* Fallthrough */ |  | ||||||
| 	case SAMPLE_EVENT_GASCHANGE: |  | ||||||
| 		/* Low 16 bits are O2 percentage */ |  | ||||||
| 		ev->gas.mix.o2.permille = (value & 0xffff) * 10; |  | ||||||
| 		ev->gas.index = gas_index; |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return ev; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* warning: does not test idx for validity */ | /* warning: does not test idx for validity */ | ||||||
| struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx) | struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx) | ||||||
| { | { | ||||||
|  | @ -195,11 +143,6 @@ struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc | ||||||
| 	return ev; | 	return ev; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct event *clone_event_rename(const struct event *ev, const char *name) |  | ||||||
| { |  | ||||||
| 	return create_event(ev->time.seconds, ev->type, ev->flags, ev->value, name); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void add_event_to_dc(struct divecomputer *dc, struct event *ev) | void add_event_to_dc(struct divecomputer *dc, struct event *ev) | ||||||
| { | { | ||||||
| 	struct event **p; | 	struct event **p; | ||||||
|  | @ -253,19 +196,6 @@ void swap_event(struct divecomputer *dc, struct event *from, struct event *to) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool same_event(const struct event *a, const struct event *b) |  | ||||||
| { |  | ||||||
| 	if (a->time.seconds != b->time.seconds) |  | ||||||
| 		return 0; |  | ||||||
| 	if (a->type != b->type) |  | ||||||
| 		return 0; |  | ||||||
| 	if (a->flags != b->flags) |  | ||||||
| 		return 0; |  | ||||||
| 	if (a->value != b->value) |  | ||||||
| 		return 0; |  | ||||||
| 	return !strcmp(a->name, b->name); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Remove given event from dive computer. Does *not* free the event. */ | /* Remove given event from dive computer. Does *not* free the event. */ | ||||||
| void remove_event_from_dc(struct divecomputer *dc, struct event *event) | void remove_event_from_dc(struct divecomputer *dc, struct event *event) | ||||||
| { | { | ||||||
|  | @ -546,22 +476,6 @@ void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_compo | ||||||
| } | } | ||||||
| #undef CONDITIONAL_COPY_STRING | #undef CONDITIONAL_COPY_STRING | ||||||
| 
 | 
 | ||||||
| struct event *clone_event(const struct event *src_ev) |  | ||||||
| { |  | ||||||
| 	struct event *ev; |  | ||||||
| 	if (!src_ev) |  | ||||||
| 		return NULL; |  | ||||||
| 
 |  | ||||||
| 	size_t size = sizeof(*src_ev) + strlen(src_ev->name) + 1; |  | ||||||
| 	ev = (struct event*) malloc(size); |  | ||||||
| 	if (!ev) |  | ||||||
| 		exit(1); |  | ||||||
| 	memcpy(ev, src_ev, size); |  | ||||||
| 	ev->next = NULL; |  | ||||||
| 
 |  | ||||||
| 	return ev; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* copies all events in this dive computer */ | /* copies all events in this dive computer */ | ||||||
| void copy_events(const struct divecomputer *s, struct divecomputer *d) | void copy_events(const struct divecomputer *s, struct divecomputer *d) | ||||||
| { | { | ||||||
|  | @ -2811,15 +2725,6 @@ struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded | ||||||
| 	return res; | 	return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void free_events(struct event *ev) |  | ||||||
| { |  | ||||||
| 	while (ev) { |  | ||||||
| 		struct event *next = ev->next; |  | ||||||
| 		free(ev); |  | ||||||
| 		ev = next; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void free_extra_data(struct extra_data *ed) | static void free_extra_data(struct extra_data *ed) | ||||||
| { | { | ||||||
| 	free((void *)ed->key); | 	free((void *)ed->key); | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								core/dive.h
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								core/dive.h
									
										
									
									
									
								
							|  | @ -20,41 +20,14 @@ | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | struct event; | ||||||
|  | 
 | ||||||
| extern int last_xml_version; | extern int last_xml_version; | ||||||
| 
 | 
 | ||||||
| extern const char *cylinderuse_text[NUM_GAS_USE]; | extern const char *cylinderuse_text[NUM_GAS_USE]; | ||||||
| extern const char *divemode_text_ui[]; | extern const char *divemode_text_ui[]; | ||||||
| extern const char *divemode_text[]; | extern const char *divemode_text[]; | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * Events are currently based straight on what libdivecomputer gives us. |  | ||||||
|  *  We need to wrap these into our own events at some point to remove some of the limitations. |  | ||||||
|  */ |  | ||||||
| struct event { |  | ||||||
| 	struct event *next; |  | ||||||
| 	duration_t time; |  | ||||||
| 	int type; |  | ||||||
| 	/* This is the annoying libdivecomputer format. */ |  | ||||||
| 	int flags, value; |  | ||||||
| 	/* .. and this is our "extended" data for some event types */ |  | ||||||
| 	union { |  | ||||||
| 		enum divemode_t divemode; // for divemode change events
 |  | ||||||
| 		/*
 |  | ||||||
| 		 * NOTE! The index may be -1, which means "unknown". In that |  | ||||||
| 		 * case, the get_cylinder_index() function will give the best |  | ||||||
| 		 * match with the cylinders in the dive based on gasmix. |  | ||||||
| 		 */ |  | ||||||
| 		struct { // for gas switch events
 |  | ||||||
| 			int index; |  | ||||||
| 			struct gasmix mix; |  | ||||||
| 		} gas; |  | ||||||
| 	}; |  | ||||||
| 	bool deleted; |  | ||||||
| 	char name[]; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| extern int event_is_gaschange(const struct event *ev); |  | ||||||
| 
 |  | ||||||
| extern void fill_pressures(struct gas_pressures *pressures, const double amb_pressure, struct gasmix mix, double po2, enum divemode_t dctype); | extern void fill_pressures(struct gas_pressures *pressures, const double amb_pressure, struct gasmix mix, double po2, enum divemode_t dctype); | ||||||
| 
 | 
 | ||||||
| /* Linear interpolation between 'a' and 'b', when we are 'part'way into the 'whole' distance from a to b */ | /* Linear interpolation between 'a' and 'b', when we are 'part'way into the 'whole' distance from a to b */ | ||||||
|  | @ -323,21 +296,16 @@ extern int split_dive(const struct dive *dive, struct dive **new1, struct dive * | ||||||
| extern int split_dive_at_time(const struct dive *dive, duration_t time, struct dive **new1, struct dive **new2); | extern int split_dive_at_time(const struct dive *dive, duration_t time, struct dive **new1, struct dive **new2); | ||||||
| extern struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip, struct dive_site **site); | extern struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip, struct dive_site **site); | ||||||
| extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded); | extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded); | ||||||
| extern struct event *clone_event(const struct event *src_ev); |  | ||||||
| extern void copy_events(const struct divecomputer *s, struct divecomputer *d); | extern void copy_events(const struct divecomputer *s, struct divecomputer *d); | ||||||
| extern void copy_events_until(const struct dive *sd, struct dive *dd, int time); | extern void copy_events_until(const struct dive *sd, struct dive *dd, int time); | ||||||
| extern void free_events(struct event *ev); |  | ||||||
| extern void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only); | extern void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only); | ||||||
| extern void copy_samples(const struct divecomputer *s, struct divecomputer *d); | extern void copy_samples(const struct divecomputer *s, struct divecomputer *d); | ||||||
| extern bool is_cylinder_used(const struct dive *dive, int idx); | extern bool is_cylinder_used(const struct dive *dive, int idx); | ||||||
| extern bool is_cylinder_prot(const struct dive *dive, int idx); | extern bool is_cylinder_prot(const struct dive *dive, int idx); | ||||||
| extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx); | extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx); | ||||||
| extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name); |  | ||||||
| extern struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx); | extern struct event *create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx); | ||||||
| extern struct event *clone_event_rename(const struct event *ev, const char *name); |  | ||||||
| extern void add_event_to_dc(struct divecomputer *dc, struct event *ev); | extern void add_event_to_dc(struct divecomputer *dc, struct event *ev); | ||||||
| extern void swap_event(struct divecomputer *dc, struct event *from, struct event *to); | extern void swap_event(struct divecomputer *dc, struct event *from, struct event *to); | ||||||
| extern bool same_event(const struct event *a, const struct event *b); |  | ||||||
| extern struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const char *name); | extern struct event *add_event(struct divecomputer *dc, unsigned int time, int type, int flags, int value, const char *name); | ||||||
| extern void remove_event_from_dc(struct divecomputer *dc, struct event *event); | extern void remove_event_from_dc(struct divecomputer *dc, struct event *event); | ||||||
| extern void update_event_name(struct dive *d, struct event *event, const char *name); | extern void update_event_name(struct dive *d, struct event *event, const char *name); | ||||||
|  | @ -350,11 +318,8 @@ extern int nr_weightsystems(const struct dive *dive); | ||||||
| 
 | 
 | ||||||
| /* UI related protopypes */ | /* UI related protopypes */ | ||||||
| 
 | 
 | ||||||
| extern void remember_event(const char *eventname); |  | ||||||
| extern void invalidate_dive_cache(struct dive *dc); | extern void invalidate_dive_cache(struct dive *dc); | ||||||
| 
 | 
 | ||||||
| extern void clear_events(void); |  | ||||||
| 
 |  | ||||||
| extern void set_autogroup(bool value); | extern void set_autogroup(bool value); | ||||||
| extern int total_weight(const struct dive *); | extern int total_weight(const struct dive *); | ||||||
| 
 | 
 | ||||||
|  | @ -370,10 +335,6 @@ extern void subsurface_command_line_exit(int *, char ***); | ||||||
| extern bool is_dc_planner(const struct divecomputer *dc); | extern bool is_dc_planner(const struct divecomputer *dc); | ||||||
| extern bool has_planned(const struct dive *dive, bool planned); | extern bool has_planned(const struct dive *dive, bool planned); | ||||||
| 
 | 
 | ||||||
| /* Since C doesn't have parameter-based overloading, two versions of get_next_event. */ |  | ||||||
| extern const struct event *get_next_event(const struct event *event, const char *name); |  | ||||||
| extern struct event *get_next_event_mutable(struct event *event, const char *name); |  | ||||||
| 
 |  | ||||||
| /* Get gasmixes at increasing timestamps.
 | /* Get gasmixes at increasing timestamps.
 | ||||||
|  * In "evp", pass a pointer to a "struct event *" which is NULL-initialized on first invocation. |  * In "evp", pass a pointer to a "struct event *" which is NULL-initialized on first invocation. | ||||||
|  * On subsequent calls, pass the same "evp" and the "gasmix" from previous calls. |  * On subsequent calls, pass the same "evp" and the "gasmix" from previous calls. | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ | ||||||
| #include "device.h" | #include "device.h" | ||||||
| #include "divesite.h" | #include "divesite.h" | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
|  | #include "event.h" | ||||||
| #include "filterpreset.h" | #include "filterpreset.h" | ||||||
| #include "fulltext.h" | #include "fulltext.h" | ||||||
| #include "planner.h" | #include "planner.h" | ||||||
|  |  | ||||||
							
								
								
									
										136
									
								
								core/event.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								core/event.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | ||||||
|  | // SPDX-License-Identifier: GPL-2.0
 | ||||||
|  | #include "event.h" | ||||||
|  | #include "subsurface-string.h" | ||||||
|  | 
 | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | 
 | ||||||
|  | int event_is_gaschange(const struct event *ev) | ||||||
|  | { | ||||||
|  | 	return ev->type == SAMPLE_EVENT_GASCHANGE || | ||||||
|  | 		ev->type == SAMPLE_EVENT_GASCHANGE2; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool event_is_divemodechange(const struct event *ev) | ||||||
|  | { | ||||||
|  | 	return same_string(ev->name, "modechange"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct event *clone_event(const struct event *src_ev) | ||||||
|  | { | ||||||
|  | 	struct event *ev; | ||||||
|  | 	if (!src_ev) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	size_t size = sizeof(*src_ev) + strlen(src_ev->name) + 1; | ||||||
|  | 	ev = (struct event*) malloc(size); | ||||||
|  | 	if (!ev) | ||||||
|  | 		exit(1); | ||||||
|  | 	memcpy(ev, src_ev, size); | ||||||
|  | 	ev->next = NULL; | ||||||
|  | 
 | ||||||
|  | 	return ev; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void free_events(struct event *ev) | ||||||
|  | { | ||||||
|  | 	while (ev) { | ||||||
|  | 		struct event *next = ev->next; | ||||||
|  | 		free(ev); | ||||||
|  | 		ev = next; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct event *create_event(unsigned int time, int type, int flags, int value, const char *name) | ||||||
|  | { | ||||||
|  | 	int gas_index = -1; | ||||||
|  | 	struct event *ev; | ||||||
|  | 	unsigned int size, len = strlen(name); | ||||||
|  | 
 | ||||||
|  | 	size = sizeof(*ev) + len + 1; | ||||||
|  | 	ev = malloc(size); | ||||||
|  | 	if (!ev) | ||||||
|  | 		return NULL; | ||||||
|  | 	memset(ev, 0, size); | ||||||
|  | 	memcpy(ev->name, name, len); | ||||||
|  | 	ev->time.seconds = time; | ||||||
|  | 	ev->type = type; | ||||||
|  | 	ev->flags = flags; | ||||||
|  | 	ev->value = value; | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Expand the events into a sane format. Currently | ||||||
|  | 	 * just gas switches | ||||||
|  | 	 */ | ||||||
|  | 	switch (type) { | ||||||
|  | 	case SAMPLE_EVENT_GASCHANGE2: | ||||||
|  | 		/* High 16 bits are He percentage */ | ||||||
|  | 		ev->gas.mix.he.permille = (value >> 16) * 10; | ||||||
|  | 
 | ||||||
|  | 		/* Extension to the GASCHANGE2 format: cylinder index in 'flags' */ | ||||||
|  | 		/* TODO: verify that gas_index < num_cylinders. */ | ||||||
|  | 		if (flags > 0) | ||||||
|  | 			gas_index = flags-1; | ||||||
|  | 	/* Fallthrough */ | ||||||
|  | 	case SAMPLE_EVENT_GASCHANGE: | ||||||
|  | 		/* Low 16 bits are O2 percentage */ | ||||||
|  | 		ev->gas.mix.o2.permille = (value & 0xffff) * 10; | ||||||
|  | 		ev->gas.index = gas_index; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return ev; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct event *clone_event_rename(const struct event *ev, const char *name) | ||||||
|  | { | ||||||
|  | 	return create_event(ev->time.seconds, ev->type, ev->flags, ev->value, name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool same_event(const struct event *a, const struct event *b) | ||||||
|  | { | ||||||
|  | 	if (a->time.seconds != b->time.seconds) | ||||||
|  | 		return 0; | ||||||
|  | 	if (a->type != b->type) | ||||||
|  | 		return 0; | ||||||
|  | 	if (a->flags != b->flags) | ||||||
|  | 		return 0; | ||||||
|  | 	if (a->value != b->value) | ||||||
|  | 		return 0; | ||||||
|  | 	return !strcmp(a->name, b->name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* collect all event names and whether we display them */ | ||||||
|  | struct ev_select *ev_namelist = NULL; | ||||||
|  | int evn_used = 0; | ||||||
|  | static int evn_allocated = 0; | ||||||
|  | 
 | ||||||
|  | void clear_events(void) | ||||||
|  | { | ||||||
|  | 	for (int i = 0; i < evn_used; i++) | ||||||
|  | 		free(ev_namelist[i].ev_name); | ||||||
|  | 	evn_used = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void remember_event(const char *eventname) | ||||||
|  | { | ||||||
|  | 	int i = 0, len; | ||||||
|  | 
 | ||||||
|  | 	if (!eventname || (len = strlen(eventname)) == 0) | ||||||
|  | 		return; | ||||||
|  | 	while (i < evn_used) { | ||||||
|  | 		if (!strncmp(eventname, ev_namelist[i].ev_name, len)) | ||||||
|  | 			return; | ||||||
|  | 		i++; | ||||||
|  | 	} | ||||||
|  | 	if (evn_used == evn_allocated) { | ||||||
|  | 		evn_allocated += 10; | ||||||
|  | 		ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select)); | ||||||
|  | 		if (!ev_namelist) | ||||||
|  | 			/* we are screwed, but let's just bail out */ | ||||||
|  | 			return; | ||||||
|  | 	} | ||||||
|  | 	ev_namelist[evn_used].ev_name = strdup(eventname); | ||||||
|  | 	ev_namelist[evn_used].plot_ev = true; | ||||||
|  | 	evn_used++; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								core/event.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								core/event.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | ||||||
|  | // SPDX-License-Identifier: GPL-2.0
 | ||||||
|  | #ifndef EVENT_H | ||||||
|  | #define EVENT_H | ||||||
|  | 
 | ||||||
|  | #include "divemode.h" | ||||||
|  | #include "gas.h" | ||||||
|  | #include "units.h" | ||||||
|  | 
 | ||||||
|  | #include <libdivecomputer/parser.h> | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Events are currently based straight on what libdivecomputer gives us. | ||||||
|  |  *  We need to wrap these into our own events at some point to remove some of the limitations. | ||||||
|  |  */ | ||||||
|  | struct event { | ||||||
|  | 	struct event *next; | ||||||
|  | 	duration_t time; | ||||||
|  | 	int type; | ||||||
|  | 	/* This is the annoying libdivecomputer format. */ | ||||||
|  | 	int flags, value; | ||||||
|  | 	/* .. and this is our "extended" data for some event types */ | ||||||
|  | 	union { | ||||||
|  | 		enum divemode_t divemode; // for divemode change events
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * NOTE! The index may be -1, which means "unknown". In that | ||||||
|  | 		 * case, the get_cylinder_index() function will give the best | ||||||
|  | 		 * match with the cylinders in the dive based on gasmix. | ||||||
|  | 		 */ | ||||||
|  | 		struct { // for gas switch events
 | ||||||
|  | 			int index; | ||||||
|  | 			struct gasmix mix; | ||||||
|  | 		} gas; | ||||||
|  | 	}; | ||||||
|  | 	bool deleted; | ||||||
|  | 	char name[]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct ev_select { | ||||||
|  | 	char *ev_name; | ||||||
|  | 	bool plot_ev; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* collect all event names and whether we display them */ | ||||||
|  | extern struct ev_select *ev_namelist; | ||||||
|  | extern int evn_used; | ||||||
|  | 
 | ||||||
|  | extern int event_is_gaschange(const struct event *ev); | ||||||
|  | extern bool event_is_divemodechange(const struct event *ev); | ||||||
|  | extern struct event *clone_event(const struct event *src_ev); | ||||||
|  | extern void free_events(struct event *ev); | ||||||
|  | extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name); | ||||||
|  | extern struct event *clone_event_rename(const struct event *ev, const char *name); | ||||||
|  | extern bool same_event(const struct event *a, const struct event *b); | ||||||
|  | extern void remember_event(const char *eventname); | ||||||
|  | extern void clear_events(void); | ||||||
|  | 
 | ||||||
|  | /* Since C doesn't have parameter-based overloading, two versions of get_next_event. */ | ||||||
|  | extern const struct event *get_next_event(const struct event *event, const char *name); | ||||||
|  | extern struct event *get_next_event_mutable(struct event *event, const char *name); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "ssrf.h" | #include "ssrf.h" | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
|  | #include "event.h" | ||||||
| #include "display.h" | #include "display.h" | ||||||
| #include "profile.h" | #include "profile.h" | ||||||
| #include "gaspressures.h" | #include "gaspressures.h" | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "ssrf.h" | #include "ssrf.h" | ||||||
| #include "divesite.h" | #include "divesite.h" | ||||||
|  | #include "gas.h" | ||||||
| #include "subsurface-string.h" | #include "subsurface-string.h" | ||||||
| #include "parse.h" | #include "parse.h" | ||||||
| #include "divelist.h" | #include "divelist.h" | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
| #include "display.h" | #include "display.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
|  | #include "event.h" | ||||||
| #include "sha1.h" | #include "sha1.h" | ||||||
| #include "subsurface-time.h" | #include "subsurface-time.h" | ||||||
| #include "timer.h" | #include "timer.h" | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
| #include "divesite.h" | #include "divesite.h" | ||||||
|  | #include "event.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
| #include "trip.h" | #include "trip.h" | ||||||
| #include "subsurface-string.h" | #include "subsurface-string.h" | ||||||
|  |  | ||||||
|  | @ -4,7 +4,9 @@ | ||||||
| 
 | 
 | ||||||
| #define MAX_EVENT_NAME 128 | #define MAX_EVENT_NAME 128 | ||||||
| 
 | 
 | ||||||
| #include "dive.h" // for struct event! | #include "event.h" | ||||||
|  | #include "picture.h" | ||||||
|  | #include "dive.h" // for "struct extra_data" | ||||||
| #include "filterpreset.h" | #include "filterpreset.h" | ||||||
| 
 | 
 | ||||||
| #include <sqlite3.h> | #include <sqlite3.h> | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ | ||||||
| #include "subsurface-string.h" | #include "subsurface-string.h" | ||||||
| #include "deco.h" | #include "deco.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
|  | #include "event.h" | ||||||
| #include "planner.h" | #include "planner.h" | ||||||
| #include "subsurface-time.h" | #include "subsurface-time.h" | ||||||
| #include "gettext.h" | #include "gettext.h" | ||||||
|  |  | ||||||
|  | @ -9,9 +9,10 @@ | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| 
 | 
 | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
| #include "subsurface-string.h" |  | ||||||
| #include "display.h" | #include "display.h" | ||||||
| #include "divelist.h" | #include "divelist.h" | ||||||
|  | #include "event.h" | ||||||
|  | #include "subsurface-string.h" | ||||||
| 
 | 
 | ||||||
| #include "profile.h" | #include "profile.h" | ||||||
| #include "gaspressures.h" | #include "gaspressures.h" | ||||||
|  | @ -115,41 +116,6 @@ int get_maxdepth(const struct plot_info *pi) | ||||||
| 	return md; | 	return md; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* collect all event names and whether we display them */ |  | ||||||
| struct ev_select *ev_namelist; |  | ||||||
| int evn_allocated; |  | ||||||
| int evn_used; |  | ||||||
| 
 |  | ||||||
| void clear_events(void) |  | ||||||
| { |  | ||||||
| 	for (int i = 0; i < evn_used; i++) |  | ||||||
| 		free(ev_namelist[i].ev_name); |  | ||||||
| 	evn_used = 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void remember_event(const char *eventname) |  | ||||||
| { |  | ||||||
| 	int i = 0, len; |  | ||||||
| 
 |  | ||||||
| 	if (!eventname || (len = strlen(eventname)) == 0) |  | ||||||
| 		return; |  | ||||||
| 	while (i < evn_used) { |  | ||||||
| 		if (!strncmp(eventname, ev_namelist[i].ev_name, len)) |  | ||||||
| 			return; |  | ||||||
| 		i++; |  | ||||||
| 	} |  | ||||||
| 	if (evn_used == evn_allocated) { |  | ||||||
| 		evn_allocated += 10; |  | ||||||
| 		ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select)); |  | ||||||
| 		if (!ev_namelist) |  | ||||||
| 			/* we are screwed, but let's just bail out */ |  | ||||||
| 			return; |  | ||||||
| 	} |  | ||||||
| 	ev_namelist[evn_used].ev_name = strdup(eventname); |  | ||||||
| 	ev_namelist[evn_used].plot_ev = true; |  | ||||||
| 	evn_used++; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* UNUSED! */ | /* UNUSED! */ | ||||||
| static int get_local_sac(struct plot_info *pi, int idx1, int idx2, struct dive *dive) __attribute__((unused)); | static int get_local_sac(struct plot_info *pi, int idx1, int idx2, struct dive *dive) __attribute__((unused)); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -80,11 +80,6 @@ struct plot_data { | ||||||
| 	bool icd_warning; | 	bool icd_warning; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct ev_select { |  | ||||||
| 	char *ev_name; |  | ||||||
| 	bool plot_ev; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| extern void compare_samples(struct plot_info *p1, int idx1, int idx2, char *buf, int bufsize, bool sum); | extern void compare_samples(struct plot_info *p1, int idx1, int idx2, char *buf, int bufsize, bool sum); | ||||||
| extern void init_plot_info(struct plot_info *pi); | extern void init_plot_info(struct plot_info *pi); | ||||||
| extern void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast, const struct deco_state *planner_ds); | extern void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast, const struct deco_state *planner_ds); | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| #include "trip.h" | #include "trip.h" | ||||||
| #include "device.h" | #include "device.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
|  | #include "event.h" | ||||||
| #include "membuffer.h" | #include "membuffer.h" | ||||||
| #include "git-access.h" | #include "git-access.h" | ||||||
| #include "version.h" | #include "version.h" | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
| #include "gettext.h" | #include "gettext.h" | ||||||
| #include "divesite.h" | #include "divesite.h" | ||||||
| #include "errorhelper.h" | #include "errorhelper.h" | ||||||
|  | #include "event.h" | ||||||
| #include "file.h" | #include "file.h" | ||||||
| #include "picture.h" | #include "picture.h" | ||||||
| #include "tag.h" | #include "tag.h" | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
| #include "subsurface-time.h" | #include "subsurface-time.h" | ||||||
| #include "trip.h" | #include "trip.h" | ||||||
| #include "device.h" | #include "device.h" | ||||||
|  | #include "event.h" | ||||||
| #include "file.h" | #include "file.h" | ||||||
| #include "membuffer.h" | #include "membuffer.h" | ||||||
| #include "picture.h" | #include "picture.h" | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
| #include "display.h" | #include "display.h" | ||||||
|  | #include "event.h" | ||||||
| #include "subsurface-time.h" | #include "subsurface-time.h" | ||||||
| #include "trip.h" | #include "trip.h" | ||||||
| #include "statistics.h" | #include "statistics.h" | ||||||
|  |  | ||||||
|  | @ -56,6 +56,7 @@ SOURCES += ../../subsurface-mobile-main.cpp \ | ||||||
| 	../../core/device.cpp \ | 	../../core/device.cpp \ | ||||||
| 	../../core/dive.c \ | 	../../core/dive.c \ | ||||||
| 	../../core/divefilter.cpp \ | 	../../core/divefilter.cpp \ | ||||||
|  | 	../../core/event.c \ | ||||||
| 	../../core/filterconstraint.cpp \ | 	../../core/filterconstraint.cpp \ | ||||||
| 	../../core/filterpreset.cpp \ | 	../../core/filterpreset.cpp \ | ||||||
| 	../../core/divelist.c \ | 	../../core/divelist.c \ | ||||||
|  | @ -204,6 +205,7 @@ HEADERS += \ | ||||||
| 	../../core/device.h \ | 	../../core/device.h \ | ||||||
| 	../../core/devicedetails.h \ | 	../../core/devicedetails.h \ | ||||||
| 	../../core/dive.h \ | 	../../core/dive.h \ | ||||||
|  | 	../../core/event.h \ | ||||||
| 	../../core/git-access.h \ | 	../../core/git-access.h \ | ||||||
| 	../../core/gpslocation.h \ | 	../../core/gpslocation.h \ | ||||||
| 	../../core/imagedownloader.h \ | 	../../core/imagedownloader.h \ | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| #include "qt-models/diveplotdatamodel.h" | #include "qt-models/diveplotdatamodel.h" | ||||||
| #include "profile-widget/divecartesianaxis.h" | #include "profile-widget/divecartesianaxis.h" | ||||||
| #include "profile-widget/animationfunctions.h" | #include "profile-widget/animationfunctions.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/libdivecomputer.h" | #include "core/libdivecomputer.h" | ||||||
| #include "core/profile.h" | #include "core/profile.h" | ||||||
| #include "core/gettextfromc.h" | #include "core/gettextfromc.h" | ||||||
|  | @ -12,9 +13,6 @@ | ||||||
| 
 | 
 | ||||||
| #define DEPTH_NOT_FOUND (-2342) | #define DEPTH_NOT_FOUND (-2342) | ||||||
| 
 | 
 | ||||||
| extern struct ev_select *ev_namelist; |  | ||||||
| extern int evn_used; |  | ||||||
| 
 |  | ||||||
| DiveEventItem::DiveEventItem(QGraphicsItem *parent) : DivePixmapItem(parent), | DiveEventItem::DiveEventItem(QGraphicsItem *parent) : DivePixmapItem(parent), | ||||||
| 	vAxis(NULL), | 	vAxis(NULL), | ||||||
| 	hAxis(NULL), | 	hAxis(NULL), | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0
 | // SPDX-License-Identifier: GPL-2.0
 | ||||||
| #include "profile-widget/profilewidget2.h" | #include "profile-widget/profilewidget2.h" | ||||||
| #include "qt-models/diveplotdatamodel.h" | #include "qt-models/diveplotdatamodel.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/subsurface-string.h" | #include "core/subsurface-string.h" | ||||||
| #include "core/qthelper.h" | #include "core/qthelper.h" | ||||||
| #include "core/picture.h" | #include "core/picture.h" | ||||||
|  | @ -1377,10 +1378,6 @@ void ProfileWidget2::setPlanState() | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| extern struct ev_select *ev_namelist; |  | ||||||
| extern int evn_allocated; |  | ||||||
| extern int evn_used; |  | ||||||
| 
 |  | ||||||
| bool ProfileWidget2::isPlanner() | bool ProfileWidget2::isPlanner() | ||||||
| { | { | ||||||
| 	return currentState == PLAN; | 	return currentState == PLAN; | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "profile-widget/tankitem.h" | #include "profile-widget/tankitem.h" | ||||||
| #include "qt-models/diveplotdatamodel.h" | #include "qt-models/diveplotdatamodel.h" | ||||||
| #include "profile-widget/divetextitem.h" | #include "profile-widget/divetextitem.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/profile.h" | #include "core/profile.h" | ||||||
| #include <QPen> | #include <QPen> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ | ||||||
| #include "core/subsurface-string.h" | #include "core/subsurface-string.h" | ||||||
| #include "core/gettext.h" | #include "core/gettext.h" | ||||||
| #include "core/divelist.h" | #include "core/divelist.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/libdivecomputer.h" | #include "core/libdivecomputer.h" | ||||||
| #include "core/divesite.h" | #include "core/divesite.h" | ||||||
| #include "core/membuffer.h" | #include "core/membuffer.h" | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "testplan.h" | #include "testplan.h" | ||||||
| #include "core/deco.h" | #include "core/deco.h" | ||||||
| #include "core/dive.h" | #include "core/dive.h" | ||||||
|  | #include "core/event.h" | ||||||
| #include "core/planner.h" | #include "core/planner.h" | ||||||
| #include "core/qthelper.h" | #include "core/qthelper.h" | ||||||
| #include "core/subsurfacestartup.h" | #include "core/subsurfacestartup.h" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue