From 20b567aeaec0f806eb37002bb39cfb188f807024 Mon Sep 17 00:00:00 2001
From: Cipulot <40441626+Cipulot@users.noreply.github.com>
Date: Tue, 14 Mar 2023 08:41:06 +0100
Subject: [PATCH] RF R1 8-9Xu PCB (#20048)

Co-authored-by: Tom Barnes <barnestom@me.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
---
 .../cipulot/rf_r1_8_9xu/keymaps/via/config.h  |  20 +++
 .../cipulot/rf_r1_8_9xu/keymaps/via/keymap.c  |  55 ++++++
 .../cipulot/rf_r1_8_9xu/keymaps/via/rules.mk  |   3 +
 .../cipulot/rf_r1_8_9xu/keymaps/via/via_apc.c | 156 ++++++++++++++++++
 4 files changed, 234 insertions(+)
 create mode 100644 keyboards/cipulot/rf_r1_8_9xu/keymaps/via/config.h
 create mode 100644 keyboards/cipulot/rf_r1_8_9xu/keymaps/via/keymap.c
 create mode 100644 keyboards/cipulot/rf_r1_8_9xu/keymaps/via/rules.mk
 create mode 100644 keyboards/cipulot/rf_r1_8_9xu/keymaps/via/via_apc.c

diff --git a/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/config.h b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/config.h
new file mode 100644
index 00000000..ebf954d0
--- /dev/null
+++ b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+// This is the size of the EEPROM for the custom VIA-specific data
+#define EECONFIG_USER_DATA_SIZE 4
diff --git a/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/keymap.c b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/keymap.c
new file mode 100644
index 00000000..6e39d6d4
--- /dev/null
+++ b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/keymap.c
@@ -0,0 +1,55 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+#include "keymap_japanese.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    // clang-format off
+    [0] = LAYOUT_all(
+        KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,  KC_F5, KC_F6, KC_F7, KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,                       KC_PSCR, KC_SCRL, KC_PAUS,
+        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,   KC_5,  KC_6,  KC_7,  KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  JP_YEN,  KC_BSPC,    KC_INS,  KC_HOME, KC_PGUP,
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,   KC_T,  KC_Y,  KC_U,  KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_ENTER,   KC_DEL,  KC_END,  KC_PGDN,
+        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,   KC_G,  KC_H,  KC_J,  KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_NUHS, KC_ENTER,
+        KC_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,   KC_V,  KC_B,  KC_N,  KC_M,    KC_COMM, KC_DOT,  KC_SLSH, JP_UNDS, KC_RSFT,                      KC_UP,
+        KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN,                KC_SPC,                JP_KANA, KC_RALT, KC_RGUI, MO(1),   KC_RCTL,             KC_LEFT, KC_DOWN, KC_RIGHT),
+
+    [1] = LAYOUT_all(
+        RGB_TOG, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______, _______, QK_BOOT,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______,
+        _______, _______, _______, _______,                   _______,                   _______, _______, _______, _______, _______,            _______, _______, _______),
+
+    [2] = LAYOUT_all(
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______,
+        _______, _______, _______, _______,                   _______,                   _______, _______, _______, _______, _______,            _______, _______, _______),
+
+    [3] = LAYOUT_all(
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                     _______,
+        _______, _______, _______, _______,                   _______,                   _______, _______, _______, _______, _______,            _______, _______, _______)
+    // clang-format on
+};
diff --git a/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/rules.mk b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/rules.mk
new file mode 100644
index 00000000..520b11f2
--- /dev/null
+++ b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+
+SRC += via_apc.c
diff --git a/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/via_apc.c b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/via_apc.c
new file mode 100644
index 00000000..5ea77af4
--- /dev/null
+++ b/keyboards/cipulot/rf_r1_8_9xu/keymaps/via/via_apc.c
@@ -0,0 +1,156 @@
+/* Copyright 2023 Cipulot
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "ec_switch_matrix.h"
+#include "action.h"
+#include "via.h"
+
+void apc_init_thresholds(void);
+void apc_set_threshold(bool is_for_actuation);
+
+// Declaring an _apc_config_t struct that will store our data
+typedef struct _apc_config_t {
+    uint16_t actuation_threshold;
+    uint16_t release_threshold;
+} apc_config;
+
+// Check if the size of the reserved persistent memory is the same as the size of struct apc_config
+_Static_assert(sizeof(apc_config) == EECONFIG_USER_DATA_SIZE, "Mismatch in keyboard EECONFIG stored data");
+
+// Declaring a new variable apc of type apc_config
+apc_config apc;
+
+// Declaring enums for VIA config menu
+enum via_apc_enums {
+    // clang-format off
+    id_apc_actuation_threshold = 1,
+    id_apc_release_threshold = 2
+    // clang-format on
+};
+
+// Initializing persistent memory configuration: default values are declared and stored in PMEM
+void eeconfig_init_user(void) {
+    // Default values
+    apc.actuation_threshold = DEFAULT_ACTUATION_LEVEL;
+    apc.release_threshold   = DEFAULT_RELEASE_LEVEL;
+    // Write default value to EEPROM now
+    eeconfig_update_user_datablock(&apc);
+}
+
+// On Keyboard startup
+void keyboard_post_init_user(void) {
+    // Read custom menu variables from memory
+    eeconfig_read_user_datablock(&apc);
+    apc_init_thresholds();
+}
+
+// Handle the data received by the keyboard from the VIA menus
+void apc_config_set_value(uint8_t *data) {
+    // data = [ value_id, value_data ]
+    uint8_t *value_id   = &(data[0]);
+    uint8_t *value_data = &(data[1]);
+
+    switch (*value_id) {
+        case id_apc_actuation_threshold: {
+            apc.actuation_threshold = value_data[1] | (value_data[0] << 8);
+            apc_set_threshold(true);
+            break;
+        }
+        case id_apc_release_threshold: {
+            apc.release_threshold = value_data[1] | (value_data[0] << 8);
+            apc_set_threshold(false);
+            break;
+        }
+    }
+}
+
+// Handle the data sent by the keyboard to the VIA menus
+void apc_config_get_value(uint8_t *data) {
+    // data = [ value_id, value_data ]
+    uint8_t *value_id   = &(data[0]);
+    uint8_t *value_data = &(data[1]);
+
+    switch (*value_id) {
+        case id_apc_actuation_threshold: {
+            value_data[0] = apc.actuation_threshold >> 8;
+            value_data[1] = apc.actuation_threshold & 0xFF;
+            break;
+        }
+        case id_apc_release_threshold: {
+            value_data[0] = apc.release_threshold >> 8;
+            value_data[1] = apc.release_threshold & 0xFF;
+            break;
+        }
+    }
+}
+
+// Save the data to persistent memory after changes are made
+void apc_config_save(void) {
+    eeconfig_update_user_datablock(&apc);
+}
+
+void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
+    // data = [ command_id, channel_id, value_id, value_data ]
+    uint8_t *command_id        = &(data[0]);
+    uint8_t *channel_id        = &(data[1]);
+    uint8_t *value_id_and_data = &(data[2]);
+
+    if (*channel_id == id_custom_channel) {
+        switch (*command_id) {
+            case id_custom_set_value: {
+                apc_config_set_value(value_id_and_data);
+                break;
+            }
+            case id_custom_get_value: {
+                apc_config_get_value(value_id_and_data);
+                break;
+            }
+            case id_custom_save: {
+                apc_config_save();
+                break;
+            }
+            default: {
+                // Unhandled message.
+                *command_id = id_unhandled;
+                break;
+            }
+        }
+        return;
+    }
+
+    *command_id = id_unhandled;
+}
+
+// Initialize the thresholds
+void apc_init_thresholds(void) {
+    ecsm_config.ecsm_actuation_threshold = apc.actuation_threshold;
+    ecsm_config.ecsm_release_threshold   = apc.release_threshold;
+
+    // Update the ecsm_config
+    ecsm_update(&ecsm_config);
+}
+
+// Set the thresholds
+void apc_set_threshold(bool is_for_actuation) {
+    if (is_for_actuation) {
+        ecsm_config.ecsm_actuation_threshold = apc.actuation_threshold;
+
+    } else {
+        ecsm_config.ecsm_release_threshold = apc.release_threshold;
+    }
+    // Update the ecsm_config
+    ecsm_update(&ecsm_config);
+}