-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathrpc.c
113 lines (103 loc) · 3.64 KB
/
rpc.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
// #include "esp32-hal-log.h"
#include "esp_err.h"
#include "cJSON.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "esp32-hal-log.h"
#include "ws_log.h"
#include "midi_in.h"
#include "rpc.h"
#include "wav_player.h"
#include "file_system.h"
// QueueHandle_t rpc_in_queue;
QueueHandle_t rpc_out_queue;
// TaskHandle_t rpc_in_task_handle;
TaskHandle_t rpc_out_task_handle;
BaseType_t task_return;
#define NO_RPC_OUT 1
void sendWSMsg(char* msg);
void rpc_out(int procedure, int arg0, int arg1, int arg2)
{
if(ARDUHAL_LOG_LEVEL == ARDUHAL_LOG_LEVEL_NONE) return;
if(NO_RPC_OUT) return;
wlog_d("rpc_out called");
struct rpc_event_t rpc_event_out;
rpc_event_out.procedure = procedure;
rpc_event_out.arg0 = arg0;
rpc_event_out.arg1 = arg1;
rpc_event_out.arg2 = arg2;
xQueueSendToBack(rpc_out_queue, (void *)&rpc_event_out, 0);
}
char* on_rpc_in(cJSON *json)
{
enum rpc_procedure procedure = cJSON_GetObjectItemCaseSensitive(json, "procedure")->valueint;
switch (procedure)
{
case RPC_NOTE_ON:
{
uint8_t voice = cJSON_GetObjectItemCaseSensitive(json, "voice")->valueint;
uint8_t note = cJSON_GetObjectItemCaseSensitive(json, "note")->valueint;
uint8_t velocity = cJSON_GetObjectItemCaseSensitive(json, "velocity")->valueint;
toggle_wav(voice, note, velocity);
char * res = "started wav";
return(res);
break;
}
case RPC_NOTE_OFF:
{
uint8_t voice = cJSON_GetObjectItemCaseSensitive(json, "voice")->valueint;
uint8_t note = cJSON_GetObjectItemCaseSensitive(json, "note")->valueint;
stop_wav(voice, note);
char * res = "stopped wav";
return(res);
break;
}
default:
break;
}
}
extern struct metadata_t metadata;
void rpc_out_task(void* pvParameters)
{
struct rpc_event_t event;
for(;;){
if(xQueueReceive(rpc_out_queue, (void *)&event, (portTickType)portMAX_DELAY))
{
log_d("rpc_out_task received event");
if(metadata.wlog_verbosity == 0)
{
// dont do RPC if UI log level is "NONE"
continue;
}
cJSON *rpc_root = cJSON_CreateObject();
switch(event.procedure){
case RPC_NOTE_ON:
wlog_d("rpc note on");
cJSON_AddNumberToObject(rpc_root, "procedure", RPC_NOTE_ON);
cJSON_AddNumberToObject(rpc_root, "voice", event.arg0);
cJSON_AddNumberToObject(rpc_root, "note", event.arg1);
cJSON_AddNumberToObject(rpc_root, "velocity", event.arg2);
break;
case RPC_NOTE_OFF:
cJSON_AddNumberToObject(rpc_root, "procedure", RPC_NOTE_OFF);
cJSON_AddNumberToObject(rpc_root, "voice", event.arg0);
cJSON_AddNumberToObject(rpc_root, "note", event.arg1);
break;
default: break;
}
char *json = cJSON_PrintUnformatted(rpc_root);
log_v(" rpc json: %s",json);
sendWSMsg(json);
cJSON_Delete(rpc_root);
// sendWSMsg("hit");
}
}
}
void rpc_init(void)
{
// rpc_in_queue = xQueueCreate(20, sizeof(struct rpc_event_t));
rpc_out_queue = xQueueCreate(20, sizeof(struct rpc_event_t));
// task_return = xTaskCreate(rpc_in_task,"rpc_in_task", 1024, NULL, 1, rpc_in_task_handle);
task_return = xTaskCreatePinnedToCore(rpc_out_task,"rpc_out_task", 1024 * 4, NULL, 2, rpc_out_task_handle,0);
}