diff --git a/keyboards/mmd/common/smart_ble.c b/keyboards/mmd/common/smart_ble.c new file mode 100644 index 00000000000..27946ca00f7 --- /dev/null +++ b/keyboards/mmd/common/smart_ble.c @@ -0,0 +1,124 @@ +// /* Copyright 2024 Jacky +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License as published by +// * the Free Software Foundation, either version 2 of the License, or +// * (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see . +// */ + +#include "uart.h" +#include "ch.h" +#include "hal.h" +#include "host.h" +#include "host_driver.h" +#include "report.h" +#include "smart_ble.h" + +static uint8_t sc_ble_leds(void) { + return 0; // TODO: Get LED status BLE +} + +static void sc_ble_mouse(report_mouse_t *report) { + static uint8_t last_report[sizeof(report_mouse_t)]={0}; + + if (!has_mouse_report_changed((report_mouse_t *)last_report, report)) return; + memcpy(last_report,report,sizeof(report_mouse_t)); + uart_write(0x55); + uart_write(sizeof(report_mouse_t)); + uart_transmit(last_report,sizeof(report_mouse_t)); +} + + +static void sc_ble_extra(report_extra_t *report) { + uart_write(0x55); + uart_write(sizeof(report_extra_t)); + uart_transmit((uint8_t *)report,sizeof(report_extra_t)); +} + +static void sc_ble_keyboard(report_keyboard_t *report) { + uart_write(0x55); + uart_write(0x09); + uart_write(0x01); + uart_transmit((uint8_t *)report,KEYBOARD_REPORT_SIZE); +} + +static void sc_send_nkro(report_nkro_t *report) +{ + uart_write(0x55); + uart_write(0x12); + uart_transmit((uint8_t *)report,0x12); +} + +static host_driver_t *last_host_driver = NULL; +static host_driver_t sc_ble_driver = { + sc_ble_leds, sc_ble_keyboard,sc_send_nkro,sc_ble_mouse, sc_ble_extra +}; + + +void smart_ble_startup(void) { + if (host_get_driver() == &sc_ble_driver) { + return; + } + clear_keyboard(); + last_host_driver = host_get_driver(); + host_set_driver(&sc_ble_driver); +} + +void smart_ble_disconnect(void) { + if (host_get_driver() != &sc_ble_driver) { + return; + } + clear_keyboard(); + host_set_driver(last_host_driver); +} + + +void sc_ble_battary(uint8_t batt_level) { + uart_write(0x55); + uart_write(0x02); + uart_write(0x09); + uart_write(batt_level); +} + +void WIRELESS_START(uint32_t mode) +{ + uint8_t ble_command[24]; + smart_ble_startup(); + if(mode<1 || mode>4) + { + mode=1; + } + ble_command[0]=0x55; + ble_command[1]=20; + ble_command[2]=0; + ble_command[3]=mode; + strcpy((char * restrict)(ble_command+4),PRODUCT); + ble_command[strlen(PRODUCT)+4]='-'; + ble_command[strlen(PRODUCT)+5]='0' + mode; + ble_command[strlen(PRODUCT)+6]= 0; + uart_transmit(ble_command,sizeof(ble_command)); +} + +void WIRELESS_STOP(void) +{ + smart_ble_disconnect(); + uart_write(0x55); + uart_write(0x02); + uart_write(0x00); + uart_write(0x00); +} + + + + + + + diff --git a/keyboards/mmd/common/smart_ble.h b/keyboards/mmd/common/smart_ble.h new file mode 100644 index 00000000000..d5d16489d13 --- /dev/null +++ b/keyboards/mmd/common/smart_ble.h @@ -0,0 +1,32 @@ +// /* Copyright 2024 Jacky +// * +// * This program is free software: you can redistribute it and/or modify +// * it under the terms of the GNU General Public License as published by +// * the Free Software Foundation, either version 2 of the License, or +// * (at your option) any later version. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see . +// */ + +#pragma once +#include "quantum.h" + +void sc_ble_battary(uint8_t batt_level); +void WIRELESS_START(uint32_t mode); +void WIRELESS_STOP(void); + + + + + + + + + +