1upslider8.c (13497B)
1 /* Copyright 2022 ziptyze 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17 18 #include "analog.h" 19 #include "qmk_midi.h" 20 21 #include "quantum.h" 22 #include "quantum/midi/midi.h" 23 #include "quantum/midi/midi_device.h" 24 25 uint8_t divisor = 0; 26 void slider(void) { 27 if (divisor++) { // only run the slider function 1/256 times it's called 28 return; 29 } 30 midi_send_cc(&midi_device, 2, 0x3E, 0x7F - (analogReadPin(SLIDER_PIN) >> 3)); 31 uprintf("%d string", analogReadPin(SLIDER_PIN)); 32 } 33 34 void housekeeping_task_kb(void) { 35 slider(); 36 } 37 38 static uint32_t oled_logo_timer = 0; 39 static bool clear_logo = true; 40 static const char PROGMEM my_logo[] = { 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 43 0xE0, 0xF0, 0x70, 0x70, 0x70, 0x70, 44 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 0x00, 0x63, 0xE7, 0xE7, 0xCE, 0xCE, 49 0xCE, 0xCE, 0xFC, 0xFC, 0x78, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 53 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC1, 54 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 59 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 64 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 65 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 0xFC, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 81 0x1C, 0x3C, 0xF8, 0xF8, 0xE0, 0x00, 82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x70, 86 0x70, 0x70, 0x70, 0x78, 0x3F, 0x3F, 87 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 91 0xF0, 0xF0, 0x70, 0x70, 0x70, 0x70, 92 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 0x00, 0xFF, 0xFF, 0xFF, 0xCE, 0xCE, 97 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0x00, 98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101 0x00, 0x00, 0xC0, 0xC1, 0xC1, 0xC1, 102 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x81, 103 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 106 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 107 0xFF, 0x39, 0x39, 0x79, 0xF9, 0xF9, 108 0xDF, 0x9F, 0x0F, 0x00, 0x00, 0x00, 109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 112 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 113 0x00, 0x03, 0x07, 0x07, 0x06, 0x04, 114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 0x00, 0x00, 0x00, 0x00, 0x1C, 0xBE, 118 0xFF, 0x63, 0x63, 0xFF, 0xBE, 0x1C, 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 123 0x07, 0x0F, 0x1F, 0x18, 0x18, 0x1F, 124 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 0x00, 0x00 127 }; 128 129 oled_rotation_t oled_init_user(oled_rotation_t rotation) { 130 return OLED_ROTATION_270; 131 } 132 133 134 static const char PROGMEM ou_logo[] = { 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140 0x00, 0x00, 0xFC, 0xFC, 0xCF, 0xCF, 141 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 142 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03, 143 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03, 144 0x03, 0x03, 0xF3, 0xF3, 0x03, 0x03, 145 0x0C, 0x0C, 0xFC, 0xFC, 0x00, 0x00, 146 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 147 0xFF, 0xFF, 0xF0, 0xF0, 0xC3, 0xC3, 148 0xC0, 0xC0, 0xF0, 0xF0, 0xFF, 0xFF, 149 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC, 150 0x0C, 0x0C, 0x0F, 0x0F, 0x03, 0x03, 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156 0x00, 0x00 157 }; 158 159 160 static char PROGMEM caps_on[] = { 161 0x00, 0x00, 0x00, 0xF8, 0x04, 0x04, 162 0x04, 0x88, 0x00, 0x00, 0xE0, 0x58, 163 0x44, 0x58, 0xE0, 0x00, 0x00, 0xFC, 164 0x24, 0x24, 0x24, 0x18, 0x00, 0x00, 165 0x98, 0x24, 0x24, 0x24, 0xC8, 0x00, 166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 167 0x01, 0x01, 0x01, 0x00, 0x00, 0x81, 168 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF1, 169 0xF0, 0xF1, 0xF0, 0xF0, 0xE0, 0xC0, 170 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 174 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 175 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 178 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 179 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 180 0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 0x00, 0x00 183 }; 184 185 static char PROGMEM caps_off[] = { 186 0x00, 0x00, 0x00, 0xF8, 0x04, 0x04, 187 0x04, 0x88, 0x00, 0x00, 0xE0, 0x58, 188 0x44, 0x58, 0xE0, 0x00, 0x00, 0xFC, 189 0x24, 0x24, 0x24, 0x18, 0x00, 0x00, 190 0x98, 0x24, 0x24, 0x24, 0xC8, 0x00, 191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 192 0x01, 0x01, 0x01, 0x00, 0x00, 0x81, 193 0xC0, 0xE0, 0xF0, 0x70, 0x30, 0x31, 194 0x30, 0x31, 0x70, 0xF0, 0xE0, 0xC0, 195 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 198 0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00, 199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200 0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00, 201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 203 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E, 204 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 205 0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03, 206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 207 0x00, 0x00 208 }; 209 210 static const char PROGMEM num_on[] = { 211 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 212 0x18, 0x20, 0xC0, 0xFC, 0x00, 0x00, 213 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 214 0x00, 0x00, 0xFC, 0x18, 0x60, 0x80, 215 0x60, 0x18, 0xFC, 0x00, 0x00, 0x00, 216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 217 0x00, 0x01, 0x00, 0x00, 0x00, 0x81, 218 0xC0, 0xE0, 0xF0, 0xF0, 0xF1, 0xF1, 219 0xF1, 0xF0, 0xF0, 0xF0, 0xE1, 0xC0, 220 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 223 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 224 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 225 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 229 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 230 0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 232 0x00, 0x00 233 }; 234 235 static const char PROGMEM num_off[] = { 236 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 237 0x18, 0x20, 0xC0, 0xFC, 0x00, 0x00, 238 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 239 0x00, 0x00, 0xFC, 0x18, 0x60, 0x80, 240 0x60, 0x18, 0xFC, 0x00, 0x00, 0x00, 241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 242 0x00, 0x01, 0x00, 0x00, 0x00, 0x81, 243 0xC0, 0xE0, 0xF0, 0x70, 0x31, 0x31, 244 0x31, 0x30, 0x70, 0xF0, 0xE1, 0xC0, 245 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 248 0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00, 249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 250 0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00, 251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E, 254 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 255 0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03, 256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 257 0x00, 0x00 258 }; 259 260 static const char PROGMEM scrl_on[] = { 261 0x00, 0x00, 0x00, 0x98, 0x24, 0x24, 262 0x24, 0xC8, 0x00, 0x00, 0xF8, 0x04, 263 0x04, 0x04, 0x88, 0x00, 0x00, 0xFC, 264 0x24, 0x24, 0xE4, 0x18, 0x00, 0x00, 265 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267 0x01, 0x01, 0x01, 0x00, 0x00, 0x80, 268 0xC0, 0xE1, 0xF1, 0xF1, 0xF0, 0xF0, 269 0xF0, 0xF1, 0xF0, 0xF0, 0xE0, 0xC1, 270 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 271 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 274 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 275 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 278 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F, 279 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 280 0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 282 0x00, 0x00 283 }; 284 285 static const char PROGMEM scrl_off[] = { 286 0x00, 0x00, 0x00, 0x98, 0x24, 0x24, 287 0x24, 0xC8, 0x00, 0x00, 0xF8, 0x04, 288 0x04, 0x04, 0x88, 0x00, 0x00, 0xFC, 289 0x24, 0x24, 0xE4, 0x18, 0x00, 0x00, 290 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 292 0x01, 0x01, 0x01, 0x00, 0x00, 0x80, 293 0xC0, 0xE1, 0xF1, 0x71, 0x30, 0x30, 294 0x30, 0x31, 0x70, 0xF0, 0xE0, 0xC1, 295 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 296 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 298 0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00, 299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 300 0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00, 301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 303 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E, 304 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 305 0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03, 306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 307 0x00, 0x00 308 }; 309 310 static void render_oled(void) { 311 const int combined_size = sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off) + sizeof(scrl_off); 312 char combined[combined_size]; 313 led_t led_state = host_keyboard_led_state(); 314 315 memcpy_P(combined, ou_logo, sizeof(ou_logo)); 316 317 if (led_state.caps_lock) { 318 memcpy_P(combined + sizeof(ou_logo), caps_on, sizeof(caps_off)); 319 } 320 else { 321 memcpy_P(combined + sizeof(ou_logo), caps_off, sizeof(caps_off)); 322 } 323 324 if (led_state.num_lock) { 325 memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off), num_on, sizeof(num_off)); 326 } 327 else { 328 memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off), num_off, sizeof(num_off)); 329 } 330 331 if (led_state.scroll_lock) { 332 memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off), scrl_on, sizeof(scrl_off)); 333 } 334 else { 335 memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off), scrl_off, sizeof(scrl_off)); 336 } 337 338 oled_write_raw_P(combined, sizeof(combined)); 339 } 340 341 void render_logo(void) { 342 oled_write_raw_P(my_logo, sizeof(my_logo)); 343 } 344 345 void clear_screen(void) { 346 if (clear_logo){ 347 for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) { 348 for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) { 349 oled_write_raw_byte(0x0, i*OLED_DISPLAY_WIDTH + j); 350 } 351 } 352 clear_logo = false; 353 } 354 } 355 356 #define MIDI_CONTROL_CHANGE 0xB0 357 358 MidiDevice _midi_device; 359 360 void midi_callback(uint8_t cable, uint8_t *midi_data, uint16_t length) { 361 // Check if this is a MIDI CC message on channel 2 362 if ((midi_data[0] & 0xF0) == MIDI_CONTROL_CHANGE && midi_data[0] & (0x0F == 1)) { 363 uprintf("%s string", midi_data ); 364 // ... 365 } 366 } 367 368 void slider8_cc_callback(struct _midi_device *dev, uint8_t cable, uint8_t code_index, uint8_t value) { 369 midi_callback(MIDI_CONTROL_CHANGE, &value, 1); 370 } 371 372 void init_timer(void){ 373 oled_logo_timer = timer_read32(); 374 }; 375 376 void keyboard_post_init_kb(void) { 377 init_timer(); 378 379 keyboard_post_init_user(); 380 } 381 382 void matrix_init_kb(void) { 383 midi_register_cc_callback(&_midi_device, slider8_cc_callback); 384 matrix_init_user(); 385 } 386 387 #ifndef SHOW_LOGO 388 # define SHOW_LOGO 5000 389 #endif 390 bool oled_task_kb(void) { 391 if (!oled_task_user()) { return false; } 392 if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)){ 393 render_logo(); 394 }else{ 395 clear_screen(); 396 render_oled(); 397 } 398 return false; 399 }