rename previous "app" interfaces as service interfaces. Create "app_init_services" instead

This commit is contained in:
James Devine 2020-06-10 22:54:14 +01:00
Родитель 4098b9ac8a
Коммит 40882db8f9
36 изменённых файлов: 33 добавлений и 242 удалений

Просмотреть файл

@ -51,6 +51,7 @@ DEFINES += -DDEVICE_DMESG_BUFFER_SIZE=1024
C_SRC += $(wildcard jacdac-c/source/*.c)
C_SRC += $(wildcard services/*.c)
C_SRC += $(wildcard jacdac-c/implementation/simple_alloc.c)
C_SRC += $(wildcard jacdac-c/implementation/sensor.c)
C_SRC += $(wildcard jacdac-c/implementation/simple_rx.c)
C_SRC += $(wildcard jacdac-c/implementation/tx_queue.c)
C_SRC += $(wildcard lib/*.c)

Просмотреть файл

@ -1,22 +0,0 @@
#include "jd_protocol.h"
#include "interfaces/jd_routing.h"
void app_process_frame() {
jd_frame_t* frameToHandle = jd_rx_get_frame();
if (frameToHandle) {
if (frameToHandle->flags & JD_FRAME_FLAG_ACK_REQUESTED &&
frameToHandle->flags & JD_FRAME_FLAG_COMMAND &&
frameToHandle->device_identifier == jd_device_id())
jd_send(JD_SERVICE_NUMBER_CRC_ACK, frameToHandle->crc, NULL, 0);
for (;;) {
app_handle_packet((jd_packet_t *)frameToHandle);
if (!jd_shift_frame(frameToHandle))
break;
}
frameToHandle = NULL;
}
}

Просмотреть файл

@ -1,130 +0,0 @@
#include "lib.h"
#include "jdprofile.h"
#define MAX_SERV 32
static srv_t **services;
static uint8_t num_services;
static uint64_t maxId;
static uint32_t lastMax, lastDisconnectBlink;
struct srv_state {
SRV_COMMON;
};
srv_t *allocate_service(const srv_vt_t *vt) {
// always allocate instances idx - it should be stable when we disable some services
if (num_services >= MAX_SERV)
jd_panic();
srv_t *r = jd_alloc(vt->state_size);
r->vt = vt;
r->service_number = num_services;
services[num_services++] = r;
return r;
}
void app_init_services(void) {
srv_t *tmp[MAX_SERV + 1];
uint16_t hashes[MAX_SERV];
tmp[MAX_SERV] = (srv_t *)hashes; // avoid global variable
services = tmp;
init_services();
services = jd_alloc(sizeof(void *) * num_services);
memcpy(services, tmp, sizeof(void *) * num_services);
}
void app_announce_services(void) {
jd_alloc_stack_check();
uint32_t *dst =
jd_send(JD_SERVICE_NUMBER_CTRL, JD_CMD_ADVERTISEMENT_DATA, NULL, num_services * 4);
if (!dst)
return;
for (int i = 0; i < num_services; ++i)
dst[i] = services[i]->vt->service_class;
#if 0
static uint32_t pulsesample;
static uint32_t pulse = 850 * 1000;
if (should_sample(&pulsesample, 15 * 1000 * 1000)) {
pwr_pin_enable(1);
target_wait_us(pulse);
pwr_pin_enable(0);
jdcon_warn("P: %d t=%ds", pulse, now / 1000000);
pulse = (pulse * 9) / 10;
#if 1
if(pulse<1000)
pulse=1000;
#endif
}
#endif
}
static void handle_ctrl_tick(jd_packet_t *pkt) {
if (pkt->service_command == JD_CMD_ADVERTISEMENT_DATA) {
// if we have not seen maxId for 1.1s, find a new maxId
if (pkt->device_identifier < maxId && in_past(lastMax + 1100000)) {
maxId = pkt->device_identifier;
}
// maxId? blink!
if (pkt->device_identifier >= maxId) {
maxId = pkt->device_identifier;
lastMax = now;
led_blink(50);
}
}
}
void app_handle_packet(jd_packet_t *pkt) {
if (!(pkt->flags & JD_FRAME_FLAG_COMMAND)) {
if (pkt->service_number == 0)
handle_ctrl_tick(pkt);
return;
}
bool matched_devid = pkt->device_identifier == jd_device_id();
if (pkt->flags & JD_FRAME_FLAG_IDENTIFIER_IS_SERVICE_CLASS) {
for (int i = 0; i < num_services; ++i) {
if (pkt->device_identifier == services[i]->vt->service_class) {
pkt->service_number = i;
matched_devid = true;
break;
}
}
}
if (!matched_devid)
return;
if (pkt->service_number < num_services) {
srv_t *s = services[pkt->service_number];
s->vt->handle_pkt(s, pkt);
}
}
void app_process() {
app_process_frame();
if (jd_should_sample(&lastDisconnectBlink, 250000)) {
if (in_past(lastMax + 2000000)) {
led_blink(5000);
}
}
for (int i = 0; i < num_services; ++i) {
services[i]->vt->process(services[i]);
}
jd_tx_flush();
}
void dump_pkt(jd_packet_t *pkt, const char *msg) {
DMESG("pkt[%s]; s#=%d sz=%d %x", msg, pkt->service_number, pkt->service_size,
pkt->service_command);
}

Просмотреть файл

@ -28,7 +28,7 @@
#define DEVICE_CLASS(dev_class, dev_class_name) const char app_dev_class_name[] = dev_class_name;
#endif
void init_services(void);
void app_init_services(void);
void ctrl_init(void);

Просмотреть файл

@ -143,7 +143,7 @@ int main(void) {
uint64_t now_long = tim_get_micros();
now = (uint32_t)now_long;
app_process();
jd_services_tick();
if (led_off_time) {
int timeLeft = led_off_time - now_long;

Просмотреть файл

@ -1,58 +0,0 @@
#include "lib.h"
REG_DEFINITION( //
sensor_regs, //
REG_SRV_BASE, //
REG_BIT(JD_REG_IS_STREAMING), //
REG_U32(JD_REG_STREAMING_INTERVAL), //
REG_U32(JD_REG_PADDING), // next_streaming not accesible
);
struct srv_state {
SENSOR_COMMON;
};
int sensor_handle_packet(srv_t *state, jd_packet_t *pkt) {
int r = service_handle_register(state, pkt, sensor_regs);
switch (r) {
case JD_REG_IS_STREAMING:
if (state->is_streaming) {
if (state->streaming_interval == 0)
state->streaming_interval = 100;
state->next_streaming = now;
state->got_query = 1;
}
break;
case JD_REG_STREAMING_INTERVAL:
if (state->streaming_interval < 20)
state->streaming_interval = 20;
if (state->streaming_interval > 100000)
state->streaming_interval = 100000;
break;
}
return r;
}
void sensor_process_simple(srv_t *state, const void *sample, uint32_t sample_size) {
if (sensor_should_stream(state))
jd_send(state->service_number, JD_CMD_GET_REG | JD_REG_READING, sample, sample_size);
}
int sensor_handle_packet_simple(srv_t *state, jd_packet_t *pkt, const void *sample,
uint32_t sample_size) {
int r = sensor_handle_packet(state, pkt);
if (pkt->service_command == (JD_CMD_GET_REG | JD_REG_READING)) {
state->got_query = 1;
jd_send(pkt->service_number, pkt->service_command, sample, sample_size);
r = -JD_REG_READING;
}
return r;
}
int sensor_should_stream(srv_t *state) {
if (!state->is_streaming)
return false;
return jd_should_sample(&state->next_streaming, state->streaming_interval * 1000);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3a3314ae, "JDF030 OLED v0");
void init_services() {
void app_init_services() {
oled_init();
}

Просмотреть файл

@ -2,7 +2,7 @@
DEVICE_CLASS(0x379c2450, "JDF030 weather v0");
void init_services() {
void app_init_services() {
temp_init();
humidity_init();
}

Просмотреть файл

@ -4,6 +4,6 @@
DEVICE_CLASS(0x3d216fd4, "JDF030 btn v0");
void init_services(void) {
void app_init_services(void) {
btn_init(PA_4, -1);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3f7c8355, "JDF030 crank v0");
void init_services() {
void app_init_services() {
crank_init(PIN_P0, PIN_P1);
}

Просмотреть файл

@ -4,6 +4,6 @@
DEVICE_CLASS(0x3faf16db, "JDF030 servo v0");
void init_services() {
void app_init_services() {
servo_init(PIN_SERVO);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x39a9dc81, "JDF030 touch v0");
void init_services() {
void app_init_services() {
touch_init(PA_4);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x334b4fb6, "JDM3 acc");
void init_services() {
void app_init_services() {
acc_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3beb4448, "JDM3 crank");
void init_services() {
void app_init_services() {
crank_init(PIN_P0, PIN_P1);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x33498f7e, "JDM3 mono");
void init_services() {
void app_init_services() {
pwm_light_init(PIN_GLO1);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3479bec3, "JDM3 light");
void init_services() {
void app_init_services() {
light_init();
}

Просмотреть файл

@ -4,6 +4,6 @@
DEVICE_CLASS(0x3a1a3a06, "JDM3 servo");
void init_services() {
void app_init_services() {
servo_init(PIN_SERVO);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x325325f2, "JM BTN1 v1.0");
void init_services() {
void app_init_services() {
btn_init(PA_2);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x32bffe5b, "JM D-Pad v1.0");
void init_services() {
void app_init_services() {
gamepad_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x33991b74, "JM PWM (npx) v1.0");
void init_services() {
void app_init_services() {
light_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x30a16d3c, "JM Power v1.0");
void init_services() {
void app_init_services() {
power_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3142fd1f, "JM PWM (servo) v1.0");
void init_services() {
void app_init_services() {
servo_init(PIN_SERVO);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3707f76a, "JM SND v1.0");
void init_services() {
void app_init_services() {
snd_init(PIN_PWR);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x36ed0f96, "JM TOUCH v1.0");
void init_services() {
void app_init_services() {
touch_init(PA_4); // TODO - we have 8 channel touch there
}

Просмотреть файл

@ -6,6 +6,6 @@ DEVICE_CLASS(0x38e3c25c, "JM ArcadeCtrls v2.0");
static const uint8_t btnPins[] = {PA_2, PA_5, PA_4, PA_3, PF_0, PF_1, PA_10, -1, PA_0};
static const uint8_t ledPins[] = {-1, -1, -1, -1, PA_6, PA_7, PB_1, -1, -1};
void init_services() {
void app_init_services() {
gamepad_init(sizeof(btnPins), btnPins, ledPins);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x34dd5196, "JM ArcadeBtn v2.0");
void init_services() {
void app_init_services() {
btn_init(PA_10, PA_4);
}

Просмотреть файл

@ -2,7 +2,7 @@
DEVICE_CLASS(0x30838b8e, "JM Crank+Btn v2.0");
void init_services() {
void app_init_services() {
crank_init(PA_6, PA_5);
btn_init(PA_4, -1);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x33a8780b, "JM Crank v2.0");
void init_services() {
void app_init_services() {
crank_init(PA_6, PA_5);
}

Просмотреть файл

@ -5,6 +5,6 @@ DEVICE_CLASS(0x36d257aa, "JM D-Pad v2.0");
// left, up, right, down, a, b, menu, menu2, reset, exit
static const uint8_t btnPins[] = {PA_2, PA_5, PA_4, PA_3, PA_6, PA_7, PB_1, -1, PA_10};
void init_services() {
void app_init_services() {
gamepad_init(sizeof(btnPins), btnPins, NULL);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x35643e91, "JM PWM (npx) v2.0");
void init_services() {
void app_init_services() {
light_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x30a16d3c, "JM Power v1.0");
void init_services() {
void app_init_services() {
power_init();
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x30b0c24e, "JM PWM (Servo) v2.0");
void init_services() {
void app_init_services() {
servo_init(PA_7);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3e344e1d, "JM Slider v2.0");
void init_services() {
void app_init_services() {
slider_init(PA_3, PA_5, PA_4);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x32f59e1b, "JM SND v2.0");
void init_services() {
void app_init_services() {
snd_init(PA_4);
}

Просмотреть файл

@ -2,6 +2,6 @@
DEVICE_CLASS(0x3ccea1a9, "JM Acc v2.0");
void init_services() {
void app_init_services() {
acc_init();
}

Просмотреть файл

@ -2,4 +2,4 @@
DEVICE_CLASS(0x3eb65a14, "JM Proto v2.0");
void init_services() {}
void app_init_services() {}