summaryrefslogtreecommitdiffstats
path: root/src/procedures.c
blob: f89e3bef2b5bbf27ff11a3ee35f5ca4ff8df7bbe (plain)
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
/*
 * eulogium_procedures, available procedures
 *
 * Copyright (c) 2015 Ultimaker B.V.
 * Author: Olliver Schinagl <o.schinagl@ultimaker.com>
 *
 * SPDX-License-Identifier:	AGPL-3.0+
 */

#include <Eina.h>
#include <Eldbus.h>
#include <stdint.h>

#include "procedures.h"

#include "print_data.h"

#define _PROC_PRINT "PRINT"
#define _PROC_HEATUP_HOTEND "HEATUP_HOTEND"
#define _PROC_POST_PRINT "POST_PRINT"
#define _PROC_PRE_PRINT_SETUP "PRE_PRINT_SETUP"

void _container_basic_variant(Eldbus_Message_Iter *parent, const char type, void *data)
{
	Eldbus_Message_Iter *child;
	char sig[2] = { '\0' };

	sig[0] = type;
	child = eldbus_message_iter_container_new(parent, 'v', sig);
	eldbus_message_iter_basic_append(child, type, data);
	eldbus_message_iter_container_close(parent, child);
}

static struct procedure_data procedures[] = {
	{
		.key = _PROC_PRINT,
		.keylen = sizeof(_PROC_PRINT),
		.executable = EINA_FALSE,
		.available = EINA_FALSE,
	}, {
		.key = _PROC_HEATUP_HOTEND,
		.keylen = sizeof(_PROC_HEATUP_HOTEND),
		.executable = EINA_FALSE,
		.available = EINA_FALSE,
	}, {
		.key = _PROC_POST_PRINT,
		.keylen = sizeof(_PROC_POST_PRINT),
		.executable = EINA_FALSE,
		.available = EINA_FALSE,
	}, {
		.key = _PROC_PRE_PRINT_SETUP,
		.keylen = sizeof(_PROC_PRE_PRINT_SETUP),
		.executable = EINA_FALSE,
		.available = EINA_FALSE,
	}, {
		NULL /* sentinel */
	}
};

struct procedure_data *procedures_init(void)
{
	return procedures;
};

static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
	struct print_data *print = data;
	const char *errname, *errmsg;
	Eina_Bool print_started = EINA_FALSE;

	if (eldbus_message_error_get(msg, &errname, &errmsg)) {
		EINA_LOG_ERR("%s %s", errname, errmsg);
		return;
	}
	if (!eldbus_message_arguments_get(msg, "b", &print_started)) {
		EINA_LOG_ERR("Failed to start print.");
		return;
	}
	if (print_started == EINA_TRUE) {
		EINA_LOG_INFO("Print has been successfully started");
		print->block = EINA_FALSE;
	} else {
		EINA_LOG_ERR("Unable to start print");
	}
}

Eldbus_Pending *procedure_start_print(Eldbus_Proxy *proxy, struct print_data *print)
{
	Eldbus_Message *msg;
	Eldbus_Message_Iter *iter, *dict, *array;

	msg = eldbus_proxy_method_call_new(proxy, "startProcedure");
	iter = eldbus_message_iter_get(msg);

	/* Compose msg sa{sv} */
	eldbus_message_iter_basic_append(iter, 's', "PRINT");
	array = eldbus_message_iter_container_new(iter, 'a', "{sv}");

	dict = eldbus_message_iter_container_new(array, 'e', NULL);
	eldbus_message_iter_basic_append(dict, 's', "name");
	_container_basic_variant(dict, 's', print->name);
	eldbus_message_iter_container_close(array, dict);

	dict = eldbus_message_iter_container_new(array, 'e', NULL);
	eldbus_message_iter_basic_append(dict, 's', "url");
	_container_basic_variant(dict, 's', print->url);
	eldbus_message_iter_container_close(array, dict);

	eldbus_message_iter_container_close(iter, array);

	return eldbus_proxy_send(proxy, msg, &_on_start_print_ret, print, -1);
}