clang-format changes

This commit is contained in:
skullY 2019-08-30 11:19:03 -07:00 committed by skullydazed
parent 61af76a10d
commit b624f32f94
502 changed files with 32259 additions and 39062 deletions

View file

@ -38,11 +38,7 @@ static const I2CConfig i2cconfig = {
I2C1_CLOCK_SPEED, I2C1_CLOCK_SPEED,
I2C1_DUTY_CYCLE, I2C1_DUTY_CYCLE,
#else #else
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) | STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL), 0, 0
STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) |
STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL),
0,
0
#endif #endif
}; };
@ -58,9 +54,7 @@ static i2c_status_t chibios_to_qmk(const msg_t* status) {
} }
} }
__attribute__ ((weak)) __attribute__((weak)) void i2c_init(void) {
void i2c_init(void)
{
// Try releasing special pins for a short time // Try releasing special pins for a short time
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_INPUT); palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_INPUT);
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT); palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT);
@ -75,41 +69,36 @@ void i2c_init(void)
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
#endif #endif
//i2cInit(); //This is invoked by halInit() so no need to redo it. // i2cInit(); //This is invoked by halInit() so no need to redo it.
} }
i2c_status_t i2c_start(uint8_t address) i2c_status_t i2c_start(uint8_t address) {
{
i2c_address = address; i2c_address = address;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);
return I2C_STATUS_SUCCESS; return I2C_STATUS_SUCCESS;
} }
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) {
{
i2c_address = address; i2c_address = address;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout)); msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout));
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) {
{
i2c_address = address; i2c_address = address;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);
msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, MS2ST(timeout)); msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, MS2ST(timeout));
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
{
i2c_address = devaddr; i2c_address = devaddr;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);
uint8_t complete_packet[length + 1]; uint8_t complete_packet[length + 1];
for(uint8_t i = 0; i < length; i++) for (uint8_t i = 0; i < length; i++) {
{ complete_packet[i + 1] = data[i];
complete_packet[i+1] = data[i];
} }
complete_packet[0] = regaddr; complete_packet[0] = regaddr;
@ -117,15 +106,11 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data,
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) {
{
i2c_address = devaddr; i2c_address = devaddr;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), &regaddr, 1, data, length, MS2ST(timeout)); msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), &regaddr, 1, data, length, MS2ST(timeout));
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
void i2c_stop(void) void i2c_stop(void) { i2cStop(&I2C_DRIVER); }
{
i2cStop(&I2C_DRIVER);
}

View file

@ -27,71 +27,70 @@
#include "ch.h" #include "ch.h"
#include <hal.h> #include <hal.h>
#if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L0xx) || defined(STM32L1xx) #if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L0xx) || defined(STM32L1xx)
#define USE_I2CV1 # define USE_I2CV1
#endif #endif
#ifdef I2C1_BANK #ifdef I2C1_BANK
#define I2C1_SCL_BANK I2C1_BANK # define I2C1_SCL_BANK I2C1_BANK
#define I2C1_SDA_BANK I2C1_BANK # define I2C1_SDA_BANK I2C1_BANK
#endif #endif
#ifndef I2C1_SCL_BANK #ifndef I2C1_SCL_BANK
#define I2C1_SCL_BANK GPIOB # define I2C1_SCL_BANK GPIOB
#endif #endif
#ifndef I2C1_SDA_BANK #ifndef I2C1_SDA_BANK
#define I2C1_SDA_BANK GPIOB # define I2C1_SDA_BANK GPIOB
#endif #endif
#ifndef I2C1_SCL #ifndef I2C1_SCL
#define I2C1_SCL 6 # define I2C1_SCL 6
#endif #endif
#ifndef I2C1_SDA #ifndef I2C1_SDA
#define I2C1_SDA 7 # define I2C1_SDA 7
#endif #endif
#ifdef USE_I2CV1 #ifdef USE_I2CV1
#ifndef I2C1_OPMODE # ifndef I2C1_OPMODE
#define I2C1_OPMODE OPMODE_I2C # define I2C1_OPMODE OPMODE_I2C
#endif # endif
#ifndef I2C1_CLOCK_SPEED # ifndef I2C1_CLOCK_SPEED
#define I2C1_CLOCK_SPEED 100000 /* 400000 */ # define I2C1_CLOCK_SPEED 100000 /* 400000 */
#endif # endif
#ifndef I2C1_DUTY_CYCLE # ifndef I2C1_DUTY_CYCLE
#define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */ # define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
#endif # endif
#else #else
// The default PAL alternate modes are used to signal that the pins are used for I2C // The default PAL alternate modes are used to signal that the pins are used for I2C
#ifndef I2C1_SCL_PAL_MODE # ifndef I2C1_SCL_PAL_MODE
#define I2C1_SCL_PAL_MODE 4 # define I2C1_SCL_PAL_MODE 4
#endif # endif
#ifndef I2C1_SDA_PAL_MODE # ifndef I2C1_SDA_PAL_MODE
#define I2C1_SDA_PAL_MODE 4 # define I2C1_SDA_PAL_MODE 4
#endif # endif
// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock // The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html // For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
#ifndef I2C1_TIMINGR_PRESC # ifndef I2C1_TIMINGR_PRESC
#define I2C1_TIMINGR_PRESC 15U # define I2C1_TIMINGR_PRESC 15U
#endif # endif
#ifndef I2C1_TIMINGR_SCLDEL # ifndef I2C1_TIMINGR_SCLDEL
#define I2C1_TIMINGR_SCLDEL 4U # define I2C1_TIMINGR_SCLDEL 4U
#endif # endif
#ifndef I2C1_TIMINGR_SDADEL # ifndef I2C1_TIMINGR_SDADEL
#define I2C1_TIMINGR_SDADEL 2U # define I2C1_TIMINGR_SDADEL 2U
#endif # endif
#ifndef I2C1_TIMINGR_SCLH # ifndef I2C1_TIMINGR_SCLH
#define I2C1_TIMINGR_SCLH 15U # define I2C1_TIMINGR_SCLH 15U
#endif # endif
#ifndef I2C1_TIMINGR_SCLL # ifndef I2C1_TIMINGR_SCLL
#define I2C1_TIMINGR_SCLL 21U # define I2C1_TIMINGR_SCLL 21U
#endif # endif
#endif #endif
#ifndef I2C_DRIVER #ifndef I2C_DRIVER
#define I2C_DRIVER I2CD1 # define I2C_DRIVER I2CD1
#endif #endif
typedef int16_t i2c_status_t; typedef int16_t i2c_status_t;
@ -104,7 +103,7 @@ void i2c_init(void);
i2c_status_t i2c_start(uint8_t address); i2c_status_t i2c_start(uint8_t address);
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout);
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length); i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t* tx_body, uint16_t tx_length, uint8_t* rx_body, uint16_t rx_length);
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
void i2c_stop(void); void i2c_stop(void);

View file

@ -21,23 +21,14 @@
#include <stdint.h> #include <stdint.h>
#include "analog.h" #include "analog.h"
static uint8_t aref = (1 << REFS0); // default to AREF = Vcc
static uint8_t aref = (1<<REFS0); // default to AREF = Vcc void analogReference(uint8_t mode) { aref = mode & 0xC0; }
void analogReference(uint8_t mode)
{
aref = mode & 0xC0;
}
// Arduino compatible pin input // Arduino compatible pin input
int16_t analogRead(uint8_t pin) int16_t analogRead(uint8_t pin) {
{
#if defined(__AVR_ATmega32U4__) #if defined(__AVR_ATmega32U4__)
static const uint8_t PROGMEM pin_to_mux[] = { static const uint8_t PROGMEM pin_to_mux[] = {0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
if (pin >= 12) return 0; if (pin >= 12) return 0;
return adc_read(pgm_read_byte(pin_to_mux + pin)); return adc_read(pgm_read_byte(pin_to_mux + pin));
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
@ -49,21 +40,19 @@ int16_t analogRead(uint8_t pin)
} }
// Mux input // Mux input
int16_t adc_read(uint8_t mux) int16_t adc_read(uint8_t mux) {
{
#if defined(__AVR_AT90USB162__) #if defined(__AVR_AT90USB162__)
return 0; return 0;
#else #else
uint8_t low; uint8_t low;
ADCSRA = (1<<ADEN) | ADC_PRESCALER; // enable ADC ADCSRA = (1 << ADEN) | ADC_PRESCALER; // enable ADC
ADCSRB = (1<<ADHSM) | (mux & 0x20); // high speed mode ADCSRB = (1 << ADHSM) | (mux & 0x20); // high speed mode
ADMUX = aref | (mux & 0x1F); // configure mux input ADMUX = aref | (mux & 0x1F); // configure mux input
ADCSRA = (1<<ADEN) | ADC_PRESCALER | (1<<ADSC); // start the conversion ADCSRA = (1 << ADEN) | ADC_PRESCALER | (1 << ADSC); // start the conversion
while (ADCSRA & (1<<ADSC)) ; // wait for result while (ADCSRA & (1 << ADSC))
; // wait for result
low = ADCL; // must read LSB first low = ADCL; // must read LSB first
return (ADCH << 8) | low; // must read MSB only once! return (ADCH << 8) | low; // must read MSB only once!
#endif #endif
} }

View file

@ -23,30 +23,30 @@ void analogReference(uint8_t mode);
int16_t analogRead(uint8_t pin); int16_t analogRead(uint8_t pin);
int16_t adc_read(uint8_t mux); int16_t adc_read(uint8_t mux);
#define ADC_REF_POWER (1<<REFS0) #define ADC_REF_POWER (1 << REFS0)
#define ADC_REF_INTERNAL ((1<<REFS1) | (1<<REFS0)) #define ADC_REF_INTERNAL ((1 << REFS1) | (1 << REFS0))
#define ADC_REF_EXTERNAL (0) #define ADC_REF_EXTERNAL (0)
// These prescaler values are for high speed mode, ADHSM = 1 // These prescaler values are for high speed mode, ADHSM = 1
#if F_CPU == 16000000L #if F_CPU == 16000000L
#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS1)) # define ADC_PRESCALER ((1 << ADPS2) | (1 << ADPS1))
#elif F_CPU == 8000000L #elif F_CPU == 8000000L
#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS0)) # define ADC_PRESCALER ((1 << ADPS2) | (1 << ADPS0))
#elif F_CPU == 4000000L #elif F_CPU == 4000000L
#define ADC_PRESCALER ((1<<ADPS2)) # define ADC_PRESCALER ((1 << ADPS2))
#elif F_CPU == 2000000L #elif F_CPU == 2000000L
#define ADC_PRESCALER ((1<<ADPS1) | (1<<ADPS0)) # define ADC_PRESCALER ((1 << ADPS1) | (1 << ADPS0))
#elif F_CPU == 1000000L #elif F_CPU == 1000000L
#define ADC_PRESCALER ((1<<ADPS1)) # define ADC_PRESCALER ((1 << ADPS1))
#else #else
#define ADC_PRESCALER ((1<<ADPS0)) # define ADC_PRESCALER ((1 << ADPS0))
#endif #endif
// some avr-libc versions do not properly define ADHSM // some avr-libc versions do not properly define ADHSM
#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#if !defined(ADHSM) # if !defined(ADHSM)
#define ADHSM (7) # define ADHSM (7)
#endif # endif
#endif #endif
#endif #endif

69
drivers/avr/apa102.c Executable file → Normal file
View file

@ -1,24 +1,24 @@
/* /*
* APA102 lib V1.0a * APA102 lib V1.0a
* *
* Controls APA102 RGB-LEDs * Controls APA102 RGB-LEDs
* Author: Mikkel (Duckle29 on github) * Author: Mikkel (Duckle29 on github)
* *
* Dec 22th, 2017 v1.0a Initial Version * Dec 22th, 2017 v1.0a Initial Version
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or * the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "apa102.h" #include "apa102.h"
#include <avr/interrupt.h> #include <avr/interrupt.h>
@ -27,39 +27,34 @@
#include "debug.h" #include "debug.h"
// Setleds for standard RGB // Setleds for standard RGB
void inline apa102_setleds(LED_TYPE *ledarray, uint16_t leds){ void inline apa102_setleds(LED_TYPE *ledarray, uint16_t leds) { apa102_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF), _BV(RGB_CLK_PIN & 0xF)); }
apa102_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF), _BV(RGB_CLK_PIN & 0xF));
}
void static inline apa102_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask_DI, uint8_t pinmask_CLK){ void static inline apa102_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask_DI, uint8_t pinmask_CLK) {
pinMode(RGB_DI_PIN, PinDirectionOutput); pinMode(RGB_DI_PIN, PinDirectionOutput);
pinMode(RGB_CLK_PIN, PinDirectionOutput); pinMode(RGB_CLK_PIN, PinDirectionOutput);
apa102_send_array((uint8_t*)ledarray,leds) apa102_send_array((uint8_t *)ledarray, leds)
} }
void apa102_send_array(uint8_t *data, uint16_t leds){ // Data is struct of 3 bytes. RGB - leds is number of leds in data void apa102_send_array(uint8_t *data, uint16_t leds) { // Data is struct of 3 bytes. RGB - leds is number of leds in data
apa102_start_frame(); apa102_start_frame();
while(leds--){ while (leds--) {
apa102_send_frame(0xFF000000 | (data->b << 16) | (data->g << 8) | data->r); apa102_send_frame(0xFF000000 | (data->b << 16) | (data->g << 8) | data->r);
data++; data++;
} }
apa102_end_frame(leds); apa102_end_frame(leds);
} }
void apa102_send_frame(uint32_t frame){ void apa102_send_frame(uint32_t frame) {
for(uint32_t i=0xFF; i>0;){ for (uint32_t i = 0xFF; i > 0;) {
apa102_send_byte(frame & i); apa102_send_byte(frame & i);
i = i << 8; i = i << 8;
} }
} }
void apa102_start_frame(){ void apa102_start_frame() { apa102_send_frame(0); }
apa102_send_frame(0);
}
void apa102_end_frame(uint16_t leds) void apa102_end_frame(uint16_t leds) {
{
// This function has been taken from: https://github.com/pololu/apa102-arduino/blob/master/APA102.h // This function has been taken from: https://github.com/pololu/apa102-arduino/blob/master/APA102.h
// and adapted. The code is MIT licensed. I think thats compatible? // and adapted. The code is MIT licensed. I think thats compatible?
@ -87,14 +82,14 @@ void apa102_end_frame(uint16_t leds)
// start displaying their new colors right away. // start displaying their new colors right away.
apa102_send_byte(0xFF); apa102_send_byte(0xFF);
for (uint16_t i = 0; i < 5 + leds / 16; i++){ for (uint16_t i = 0; i < 5 + leds / 16; i++) {
apa102_send_byte(0); apa102_send_byte(0);
} }
} }
void apa102_send_byte(uint8_t byte){ void apa102_send_byte(uint8_t byte) {
uint8_t i; uint8_t i;
for (i = 0; i < 8; i++){ for (i = 0; i < 8; i++) {
digitalWrite(RGB_DI_PIN, !!(byte & (1 << (7-i))); digitalWrite(RGB_DI_PIN, !!(byte & (1 << (7-i)));
digitalWrite(RGB_CLK_PIN, PinLevelHigh); digitalWrite(RGB_CLK_PIN, PinLevelHigh);
} }

5
drivers/avr/apa102.h Executable file → Normal file
View file

@ -27,7 +27,6 @@
#include "color.h" #include "color.h"
/* User Interface /* User Interface
* *
* Input: * Input:
@ -41,6 +40,6 @@
* - Wait 50<EFBFBD>s to reset the LEDs * - Wait 50<EFBFBD>s to reset the LEDs
*/ */
void apa102_setleds (LED_TYPE *ledarray, uint16_t number_of_leds); void apa102_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
void apa102_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask); void apa102_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pinmask);
void apa102_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds); void apa102_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);

View file

@ -5,272 +5,30 @@
#define FONT5X7_H #define FONT5X7_H
#ifdef __AVR__ #ifdef __AVR__
#include <avr/io.h> # include <avr/io.h>
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#elif defined(ESP8266) #elif defined(ESP8266)
#include <pgmspace.h> # include <pgmspace.h>
#else #else
#define PROGMEM # define PROGMEM
#endif #endif
// Standard ASCII 5x7 font // Standard ASCII 5x7 font
static const unsigned char font[] PROGMEM = { static const unsigned char font[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
0x00, 0x18, 0x3C, 0x18, 0x00, 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14,
0x24, 0x2A, 0x7F, 0x2A, 0x12,
0x23, 0x13, 0x08, 0x64, 0x62,
0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x42, 0x7F, 0x40, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46,
0x21, 0x41, 0x49, 0x4D, 0x33,
0x18, 0x14, 0x12, 0x7F, 0x10,
0x27, 0x45, 0x45, 0x45, 0x39,
0x3C, 0x4A, 0x49, 0x49, 0x31,
0x41, 0x21, 0x11, 0x09, 0x07,
0x36, 0x49, 0x49, 0x49, 0x36,
0x46, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C,
0x7F, 0x49, 0x49, 0x49, 0x36,
0x3E, 0x41, 0x41, 0x41, 0x22,
0x7F, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x49, 0x49, 0x49, 0x41,
0x7F, 0x09, 0x09, 0x09, 0x01,
0x3E, 0x41, 0x41, 0x51, 0x73,
0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x41, 0x7F, 0x41, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01,
0x7F, 0x08, 0x14, 0x22, 0x41,
0x7F, 0x40, 0x40, 0x40, 0x40,
0x7F, 0x02, 0x1C, 0x02, 0x7F,
0x7F, 0x04, 0x08, 0x10, 0x7F,
0x3E, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x09, 0x09, 0x09, 0x06,
0x3E, 0x41, 0x51, 0x21, 0x5E,
0x7F, 0x09, 0x19, 0x29, 0x46,
0x26, 0x49, 0x49, 0x49, 0x32,
0x03, 0x01, 0x7F, 0x01, 0x03,
0x3F, 0x40, 0x40, 0x40, 0x3F,
0x1F, 0x20, 0x40, 0x20, 0x1F,
0x3F, 0x40, 0x38, 0x40, 0x3F,
0x63, 0x14, 0x08, 0x14, 0x63,
0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43,
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40,
0x7F, 0x28, 0x44, 0x44, 0x38,
0x38, 0x44, 0x44, 0x44, 0x28,
0x38, 0x44, 0x44, 0x28, 0x7F,
0x38, 0x54, 0x54, 0x54, 0x18,
0x00, 0x08, 0x7E, 0x09, 0x02,
0x18, 0xA4, 0xA4, 0x9C, 0x78,
0x7F, 0x08, 0x04, 0x04, 0x78,
0x00, 0x44, 0x7D, 0x40, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78,
0x7C, 0x08, 0x04, 0x04, 0x78,
0x38, 0x44, 0x44, 0x44, 0x38,
0xFC, 0x18, 0x24, 0x24, 0x18,
0x18, 0x24, 0x24, 0x18, 0xFC,
0x7C, 0x08, 0x04, 0x04, 0x08,
0x48, 0x54, 0x54, 0x54, 0x24,
0x04, 0x04, 0x3F, 0x44, 0x24,
0x3C, 0x40, 0x40, 0x20, 0x7C,
0x1C, 0x20, 0x40, 0x20, 0x1C,
0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44,
0x4C, 0x90, 0x90, 0x90, 0x7C,
0x44, 0x64, 0x54, 0x4C, 0x44,
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F,
0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
0x14, 0x14, 0x14, 0xFF, 0x00, 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
}; };
#endif // FONT5X7_H #endif // FONT5X7_H

View file

@ -34,46 +34,45 @@
*/ */
#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */ #define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) #if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */ /* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
#define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) ) # define PIN(x) (&PORTF == &(x) ? _SFR_IO8(0x00) : (*(&x - 2)))
#else #else
#define PIN(x) (*(&x - 2)) /* address of input register of port x */ # define PIN(x) (*(&x - 2)) /* address of input register of port x */
#endif
#if LCD_IO_MODE
#define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
#define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
#define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
#define lcd_e_toggle() toggle_e()
#define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
#define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
#define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
#define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
#endif #endif
#if LCD_IO_MODE #if LCD_IO_MODE
#if LCD_LINES==1 # define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE # define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
#else # define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES # define lcd_e_toggle() toggle_e()
# define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
# define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
# define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
# define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
#endif #endif
#if LCD_IO_MODE
# if LCD_LINES == 1
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
# else
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
# endif
#else #else
#if LCD_LINES==1 # if LCD_LINES == 1
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE # define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
#else # else
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES # define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
#endif # endif
#endif #endif
#if LCD_CONTROLLER_KS0073 #if LCD_CONTROLLER_KS0073
#if LCD_LINES==4 # if LCD_LINES == 4
#define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */ # define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */
#define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */ # define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */
#define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */ # define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */
#endif # endif
#endif #endif
/* /*
@ -87,25 +86,21 @@ static void toggle_e(void);
** local functions ** local functions
*/ */
/************************************************************************* /*************************************************************************
delay for a minimum of <us> microseconds delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock frequency the number of loops is calculated at compile-time from MCU clock frequency
*************************************************************************/ *************************************************************************/
#define delay(us) _delay_us(us) #define delay(us) _delay_us(us)
#if LCD_IO_MODE #if LCD_IO_MODE
/* toggle Enable Pin to initiate write */ /* toggle Enable Pin to initiate write */
static void toggle_e(void) static void toggle_e(void) {
{
lcd_e_high(); lcd_e_high();
lcd_e_delay(); lcd_e_delay();
lcd_e_low(); lcd_e_low();
} }
#endif #endif
/************************************************************************* /*************************************************************************
Low-level function to write byte to LCD controller Low-level function to write byte to LCD controller
Input: data byte to write to LCD Input: data byte to write to LCD
@ -114,10 +109,8 @@ Input: data byte to write to LCD
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
#if LCD_IO_MODE #if LCD_IO_MODE
static void lcd_write(uint8_t data,uint8_t rs) static void lcd_write(uint8_t data, uint8_t rs) {
{ unsigned char dataBits;
unsigned char dataBits ;
if (rs) { /* write data (RS=1, RW=0) */ if (rs) { /* write data (RS=1, RW=0) */
lcd_rs_high(); lcd_rs_high();
@ -126,26 +119,22 @@ static void lcd_write(uint8_t data,uint8_t rs)
} }
lcd_rw_low(); /* RW=0 write mode */ lcd_rw_low(); /* RW=0 write mode */
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
&& (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
/* configure data pins as output */ /* configure data pins as output */
DDR(LCD_DATA0_PORT) |= 0x0F; DDR(LCD_DATA0_PORT) |= 0x0F;
/* output high nibble first */ /* output high nibble first */
dataBits = LCD_DATA0_PORT & 0xF0; dataBits = LCD_DATA0_PORT & 0xF0;
LCD_DATA0_PORT = dataBits |((data>>4)&0x0F); LCD_DATA0_PORT = dataBits | ((data >> 4) & 0x0F);
lcd_e_toggle(); lcd_e_toggle();
/* output low nibble */ /* output low nibble */
LCD_DATA0_PORT = dataBits | (data&0x0F); LCD_DATA0_PORT = dataBits | (data & 0x0F);
lcd_e_toggle(); lcd_e_toggle();
/* all data pins high (inactive) */ /* all data pins high (inactive) */
LCD_DATA0_PORT = dataBits | 0x0F; LCD_DATA0_PORT = dataBits | 0x0F;
} } else {
else
{
/* configure data pins as output */ /* configure data pins as output */
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN); DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN); DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
@ -157,10 +146,10 @@ static void lcd_write(uint8_t data,uint8_t rs)
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN); LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN); LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if(data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN); if (data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if(data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN); if (data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if(data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); if (data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if(data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); if (data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle(); lcd_e_toggle();
/* output low nibble */ /* output low nibble */
@ -168,10 +157,10 @@ static void lcd_write(uint8_t data,uint8_t rs)
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN); LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN); LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if(data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN); if (data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if(data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN); if (data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if(data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); if (data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if(data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); if (data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle(); lcd_e_toggle();
/* all data pins high (inactive) */ /* all data pins high (inactive) */
@ -182,12 +171,15 @@ static void lcd_write(uint8_t data,uint8_t rs)
} }
} }
#else #else
#define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d; else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d; # define lcd_write(d, rs) \
if (rs) \
*(volatile uint8_t *)(LCD_IO_DATA) = d; \
else \
*(volatile uint8_t *)(LCD_IO_FUNCTION) = d;
/* rs==0 -> write instruction to LCD_IO_FUNCTION */ /* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */ /* rs==1 -> write data to LCD_IO_DATA */
#endif #endif
/************************************************************************* /*************************************************************************
Low-level function to read byte from LCD controller Low-level function to read byte from LCD controller
Input: rs 1: read data Input: rs 1: read data
@ -195,20 +187,16 @@ Input: rs 1: read data
Returns: byte read from LCD controller Returns: byte read from LCD controller
*************************************************************************/ *************************************************************************/
#if LCD_IO_MODE #if LCD_IO_MODE
static uint8_t lcd_read(uint8_t rs) static uint8_t lcd_read(uint8_t rs) {
{
uint8_t data; uint8_t data;
if (rs) if (rs)
lcd_rs_high(); /* RS=1: read data */ lcd_rs_high(); /* RS=1: read data */
else else
lcd_rs_low(); /* RS=0: read busy flag */ lcd_rs_low(); /* RS=0: read busy flag */
lcd_rw_high(); /* RW=1 read mode */ lcd_rw_high(); /* RW=1 read mode */
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
&& ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */ DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
lcd_e_high(); lcd_e_high();
@ -220,11 +208,9 @@ static uint8_t lcd_read(uint8_t rs)
lcd_e_high(); lcd_e_high();
lcd_e_delay(); lcd_e_delay();
data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */ data |= PIN(LCD_DATA0_PORT) & 0x0F; /* read low nibble */
lcd_e_low(); lcd_e_low();
} } else {
else
{
/* configure data pins as input */ /* configure data pins as input */
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN); DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN); DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
@ -235,10 +221,10 @@ static uint8_t lcd_read(uint8_t rs)
lcd_e_high(); lcd_e_high();
lcd_e_delay(); lcd_e_delay();
data = 0; data = 0;
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10; if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x10;
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x20; if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x20;
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x40; if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x40;
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x80; if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x80;
lcd_e_low(); lcd_e_low();
lcd_e_delay(); /* Enable 500ns low */ lcd_e_delay(); /* Enable 500ns low */
@ -246,21 +232,20 @@ static uint8_t lcd_read(uint8_t rs)
/* read low nibble */ /* read low nibble */
lcd_e_high(); lcd_e_high();
lcd_e_delay(); lcd_e_delay();
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x01; if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x01;
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x02; if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x02;
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04; if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x04;
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08; if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x08;
lcd_e_low(); lcd_e_low();
} }
return data; return data;
} }
#else #else
#define lcd_read(rs) (rs) ? *(volatile uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ) # define lcd_read(rs) (rs) ? *(volatile uint8_t *)(LCD_IO_DATA + LCD_IO_READ) : *(volatile uint8_t *)(LCD_IO_FUNCTION + LCD_IO_READ)
/* rs==0 -> read instruction from LCD_IO_FUNCTION */ /* rs==0 -> read instruction from LCD_IO_FUNCTION */
/* rs==1 -> read data from LCD_IO_DATA */ /* rs==1 -> read data from LCD_IO_DATA */
#endif #endif
/************************************************************************* /*************************************************************************
loops while lcd is busy, returns address counter loops while lcd is busy, returns address counter
*************************************************************************/ *************************************************************************/
@ -270,7 +255,8 @@ static uint8_t lcd_waitbusy(void)
register uint8_t c; register uint8_t c;
/* wait until busy flag is cleared */ /* wait until busy flag is cleared */
while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {} while ((c = lcd_read(0)) & (1 << LCD_BUSY)) {
}
/* the address counter is updated 4us after the busy flag is cleared */ /* the address counter is updated 4us after the busy flag is cleared */
delay(LCD_DELAY_BUSY_FLAG); delay(LCD_DELAY_BUSY_FLAG);
@ -278,52 +264,48 @@ static uint8_t lcd_waitbusy(void)
/* now read the address counter */ /* now read the address counter */
return (lcd_read(0)); // return address counter return (lcd_read(0)); // return address counter
}/* lcd_waitbusy */ } /* lcd_waitbusy */
/************************************************************************* /*************************************************************************
Move cursor to the start of next line or to the first line if the cursor Move cursor to the start of next line or to the first line if the cursor
is already on the last line. is already on the last line.
*************************************************************************/ *************************************************************************/
static inline void lcd_newline(uint8_t pos) static inline void lcd_newline(uint8_t pos) {
{
register uint8_t addressCounter; register uint8_t addressCounter;
#if LCD_LINES == 1
#if LCD_LINES==1
addressCounter = 0; addressCounter = 0;
#endif #endif
#if LCD_LINES==2 #if LCD_LINES == 2
if ( pos < (LCD_START_LINE2) ) if (pos < (LCD_START_LINE2))
addressCounter = LCD_START_LINE2; addressCounter = LCD_START_LINE2;
else else
addressCounter = LCD_START_LINE1; addressCounter = LCD_START_LINE1;
#endif #endif
#if LCD_LINES==4 #if LCD_LINES == 4
#if KS0073_4LINES_MODE # if KS0073_4LINES_MODE
if ( pos < LCD_START_LINE2 ) if (pos < LCD_START_LINE2)
addressCounter = LCD_START_LINE2; addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) ) else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3))
addressCounter = LCD_START_LINE3; addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) ) else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4))
addressCounter = LCD_START_LINE4; addressCounter = LCD_START_LINE4;
else else
addressCounter = LCD_START_LINE1; addressCounter = LCD_START_LINE1;
#else # else
if ( pos < LCD_START_LINE3 ) if (pos < LCD_START_LINE3)
addressCounter = LCD_START_LINE2; addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) ) else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4))
addressCounter = LCD_START_LINE3; addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) ) else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2))
addressCounter = LCD_START_LINE4; addressCounter = LCD_START_LINE4;
else else
addressCounter = LCD_START_LINE1; addressCounter = LCD_START_LINE1;
# endif
#endif #endif
#endif lcd_command((1 << LCD_DDRAM) + addressCounter);
lcd_command((1<<LCD_DDRAM)+addressCounter);
}/* lcd_newline */
} /* lcd_newline */
/* /*
** PUBLIC FUNCTIONS ** PUBLIC FUNCTIONS
@ -334,129 +316,104 @@ Send LCD controller instruction command
Input: instruction to send to LCD controller, see HD44780 data sheet Input: instruction to send to LCD controller, see HD44780 data sheet
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
void lcd_command(uint8_t cmd) void lcd_command(uint8_t cmd) {
{
lcd_waitbusy(); lcd_waitbusy();
lcd_write(cmd,0); lcd_write(cmd, 0);
} }
/************************************************************************* /*************************************************************************
Send data byte to LCD controller Send data byte to LCD controller
Input: data to send to LCD controller, see HD44780 data sheet Input: data to send to LCD controller, see HD44780 data sheet
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
void lcd_data(uint8_t data) void lcd_data(uint8_t data) {
{
lcd_waitbusy(); lcd_waitbusy();
lcd_write(data,1); lcd_write(data, 1);
} }
/************************************************************************* /*************************************************************************
Set cursor to specified position Set cursor to specified position
Input: x horizontal position (0: left most position) Input: x horizontal position (0: left most position)
y vertical position (0: first line) y vertical position (0: first line)
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
void lcd_gotoxy(uint8_t x, uint8_t y) void lcd_gotoxy(uint8_t x, uint8_t y) {
{ #if LCD_LINES == 1
#if LCD_LINES==1 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
#endif #endif
#if LCD_LINES==2 #if LCD_LINES == 2
if ( y==0 ) if (y == 0)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
else else
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
#endif #endif
#if LCD_LINES==4 #if LCD_LINES == 4
if ( y==0 ) if (y == 0)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
else if ( y==1) else if (y == 1)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
else if ( y==2) else if (y == 2)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE3+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE3 + x);
else /* y==3 */ else /* y==3 */
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x); lcd_command((1 << LCD_DDRAM) + LCD_START_LINE4 + x);
#endif #endif
}/* lcd_gotoxy */ } /* lcd_gotoxy */
/************************************************************************* /*************************************************************************
*************************************************************************/ *************************************************************************/
int lcd_getxy(void) int lcd_getxy(void) { return lcd_waitbusy(); }
{
return lcd_waitbusy();
}
/************************************************************************* /*************************************************************************
Clear display and set cursor to home position Clear display and set cursor to home position
*************************************************************************/ *************************************************************************/
void lcd_clrscr(void) void lcd_clrscr(void) { lcd_command(1 << LCD_CLR); }
{
lcd_command(1<<LCD_CLR);
}
/************************************************************************* /*************************************************************************
Set cursor to home position Set cursor to home position
*************************************************************************/ *************************************************************************/
void lcd_home(void) void lcd_home(void) { lcd_command(1 << LCD_HOME); }
{
lcd_command(1<<LCD_HOME);
}
/************************************************************************* /*************************************************************************
Display character at current cursor position Display character at current cursor position
Input: character to be displayed Input: character to be displayed
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
void lcd_putc(char c) void lcd_putc(char c) {
{
uint8_t pos; uint8_t pos;
pos = lcd_waitbusy(); // read busy-flag and address counter pos = lcd_waitbusy(); // read busy-flag and address counter
if (c=='\n') if (c == '\n') {
{
lcd_newline(pos); lcd_newline(pos);
} else {
#if LCD_WRAP_LINES == 1
# if LCD_LINES == 1
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
} }
else # elif LCD_LINES == 2
{ if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
#if LCD_WRAP_LINES==1 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
#if LCD_LINES==1 } else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
} }
#elif LCD_LINES==2 # elif LCD_LINES == 4
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){ } else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); lcd_write((1 << LCD_DDRAM) + LCD_START_LINE3, 0);
} else if (pos == LCD_START_LINE3 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE4, 0);
} else if (pos == LCD_START_LINE4 + LCD_DISP_LENGTH) {
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
} }
#elif LCD_LINES==4 # endif
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
}else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
}else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
}
#endif
lcd_waitbusy(); lcd_waitbusy();
#endif #endif
lcd_write(c, 1); lcd_write(c, 1);
} }
}/* lcd_putc */ } /* lcd_putc */
/************************************************************************* /*************************************************************************
Display string without auto linefeed Display string without auto linefeed
@ -468,12 +425,11 @@ void lcd_puts(const char *s)
{ {
register char c; register char c;
while ( (c = *s++) ) { while ((c = *s++)) {
lcd_putc(c); lcd_putc(c);
} }
}/* lcd_puts */ } /* lcd_puts */
/************************************************************************* /*************************************************************************
Display string from program memory without auto linefeed Display string from program memory without auto linefeed
@ -485,12 +441,11 @@ void lcd_puts_p(const char *progmem_s)
{ {
register char c; register char c;
while ( (c = pgm_read_byte(progmem_s++)) ) { while ((c = pgm_read_byte(progmem_s++))) {
lcd_putc(c); lcd_putc(c);
} }
}/* lcd_puts_p */ } /* lcd_puts_p */
/************************************************************************* /*************************************************************************
Initialize display and select type of cursor Initialize display and select type of cursor
@ -500,32 +455,22 @@ Input: dispAttr LCD_DISP_OFF display off
LCD_DISP_CURSOR_BLINK display on, cursor on flashing LCD_DISP_CURSOR_BLINK display on, cursor on flashing
Returns: none Returns: none
*************************************************************************/ *************************************************************************/
void lcd_init(uint8_t dispAttr) void lcd_init(uint8_t dispAttr) {
{
#if LCD_IO_MODE #if LCD_IO_MODE
/* /*
* Initialize LCD to 4 bit I/O mode * Initialize LCD to 4 bit I/O mode
*/ */
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (&LCD_RS_PORT == &LCD_DATA0_PORT) && (&LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) && (LCD_RS_PIN == 4) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6)) {
&& ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)
&& (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
{
/* configure all port bits as output (all LCD lines on same port) */ /* configure all port bits as output (all LCD lines on same port) */
DDR(LCD_DATA0_PORT) |= 0x7F; DDR(LCD_DATA0_PORT) |= 0x7F;
} } else if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
/* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */ /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
DDR(LCD_DATA0_PORT) |= 0x0F; DDR(LCD_DATA0_PORT) |= 0x0F;
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN); DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN); DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
} } else {
else
{
/* configure all port bits as output (LCD data and control lines on different ports */ /* configure all port bits as output (LCD data and control lines on different ports */
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN); DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
@ -567,11 +512,11 @@ void lcd_init(uint8_t dispAttr)
/* reset LCD */ /* reset LCD */
delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */ delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT); /* wait 5ms */ delay(LCD_DELAY_INIT); /* wait 5ms */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT_REP); /* wait 64us */ delay(LCD_DELAY_INIT_REP); /* wait 64us */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
delay(LCD_DELAY_INIT_REP); /* wait 64us */ delay(LCD_DELAY_INIT_REP); /* wait 64us */
#endif #endif
@ -588,5 +533,4 @@ void lcd_init(uint8_t dispAttr)
lcd_command(LCD_MODE_DEFAULT); /* set entry mode */ lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
lcd_command(dispAttr); /* display/cursor control */ lcd_command(dispAttr); /* display/cursor control */
}/* lcd_init */ } /* lcd_init */

View file

@ -47,10 +47,9 @@
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405 #if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
#error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !" # error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
#endif #endif
/**@{*/ /**@{*/
/* /*
@ -59,16 +58,15 @@
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h * All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*/ */
#ifdef _LCD_DEFINITIONS_FILE #ifdef _LCD_DEFINITIONS_FILE
#include "lcd_definitions.h" # include "lcd_definitions.h"
#endif #endif
/** /**
* @name Definition for LCD controller type * @name Definition for LCD controller type
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller. * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
*/ */
#ifndef LCD_CONTROLLER_KS0073 #ifndef LCD_CONTROLLER_KS0073
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */ # define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
#endif #endif
/** /**
@ -81,31 +79,30 @@
* *
*/ */
#ifndef LCD_LINES #ifndef LCD_LINES
#define LCD_LINES 2 /**< number of visible lines of the display */ # define LCD_LINES 2 /**< number of visible lines of the display */
#endif #endif
#ifndef LCD_DISP_LENGTH #ifndef LCD_DISP_LENGTH
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */ # define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
#endif #endif
#ifndef LCD_LINE_LENGTH #ifndef LCD_LINE_LENGTH
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */ # define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
#endif #endif
#ifndef LCD_START_LINE1 #ifndef LCD_START_LINE1
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */ # define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
#endif #endif
#ifndef LCD_START_LINE2 #ifndef LCD_START_LINE2
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */ # define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
#endif #endif
#ifndef LCD_START_LINE3 #ifndef LCD_START_LINE3
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ # define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
#endif #endif
#ifndef LCD_START_LINE4 #ifndef LCD_START_LINE4
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ # define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
#endif #endif
#ifndef LCD_WRAP_LINES #ifndef LCD_WRAP_LINES
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */ # define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
#endif #endif
/** /**
* @name Definitions for 4-bit IO mode * @name Definitions for 4-bit IO mode
* *
@ -128,68 +125,65 @@
#if LCD_IO_MODE #if LCD_IO_MODE
#ifndef LCD_PORT # ifndef LCD_PORT
#define LCD_PORT PORTA /**< port for the LCD lines */ # define LCD_PORT PORTA /**< port for the LCD lines */
#endif # endif
#ifndef LCD_DATA0_PORT # ifndef LCD_DATA0_PORT
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ # define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#endif # endif
#ifndef LCD_DATA1_PORT # ifndef LCD_DATA1_PORT
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ # define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#endif # endif
#ifndef LCD_DATA2_PORT # ifndef LCD_DATA2_PORT
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ # define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#endif # endif
#ifndef LCD_DATA3_PORT # ifndef LCD_DATA3_PORT
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ # define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#endif # endif
#ifndef LCD_DATA0_PIN # ifndef LCD_DATA0_PIN
#define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */ # define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
#endif # endif
#ifndef LCD_DATA1_PIN # ifndef LCD_DATA1_PIN
#define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */ # define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
#endif # endif
#ifndef LCD_DATA2_PIN # ifndef LCD_DATA2_PIN
#define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */ # define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
#endif # endif
#ifndef LCD_DATA3_PIN # ifndef LCD_DATA3_PIN
#define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */ # define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
#endif # endif
#ifndef LCD_RS_PORT # ifndef LCD_RS_PORT
#define LCD_RS_PORT LCD_PORT /**< port for RS line */ # define LCD_RS_PORT LCD_PORT /**< port for RS line */
#endif # endif
#ifndef LCD_RS_PIN # ifndef LCD_RS_PIN
#define LCD_RS_PIN 3 /**< pin for RS line */ # define LCD_RS_PIN 3 /**< pin for RS line */
#endif # endif
#ifndef LCD_RW_PORT # ifndef LCD_RW_PORT
#define LCD_RW_PORT LCD_PORT /**< port for RW line */ # define LCD_RW_PORT LCD_PORT /**< port for RW line */
#endif # endif
#ifndef LCD_RW_PIN # ifndef LCD_RW_PIN
#define LCD_RW_PIN 2 /**< pin for RW line */ # define LCD_RW_PIN 2 /**< pin for RW line */
#endif # endif
#ifndef LCD_E_PORT # ifndef LCD_E_PORT
#define LCD_E_PORT LCD_PORT /**< port for Enable line */ # define LCD_E_PORT LCD_PORT /**< port for Enable line */
#endif # endif
#ifndef LCD_E_PIN # ifndef LCD_E_PIN
#define LCD_E_PIN 1 /**< pin for Enable line */ # define LCD_E_PIN 1 /**< pin for Enable line */
#endif # endif
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \ #elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \
defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
/* /*
* memory mapped mode is only supported when the device has an external data memory interface * memory mapped mode is only supported when the device has an external data memory interface
*/ */
#define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */ # define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
#define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */ # define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
#define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */ # define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
#else #else
#error "external data memory interface not available for this device, use 4-bit IO port mode" # error "external data memory interface not available for this device, use 4-bit IO port mode"
#endif #endif
/** /**
* @name Definitions of delays * @name Definitions of delays
* Used to calculate delay timers. * Used to calculate delay timers.
@ -201,25 +195,24 @@
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h * All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
*/ */
#ifndef LCD_DELAY_BOOTUP #ifndef LCD_DELAY_BOOTUP
#define LCD_DELAY_BOOTUP 16000 /**< delay in micro seconds after power-on */ # define LCD_DELAY_BOOTUP 16000 /**< delay in micro seconds after power-on */
#endif #endif
#ifndef LCD_DELAY_INIT #ifndef LCD_DELAY_INIT
#define LCD_DELAY_INIT 5000 /**< delay in micro seconds after initialization command sent */ # define LCD_DELAY_INIT 5000 /**< delay in micro seconds after initialization command sent */
#endif #endif
#ifndef LCD_DELAY_INIT_REP #ifndef LCD_DELAY_INIT_REP
#define LCD_DELAY_INIT_REP 64 /**< delay in micro seconds after initialization command repeated */ # define LCD_DELAY_INIT_REP 64 /**< delay in micro seconds after initialization command repeated */
#endif #endif
#ifndef LCD_DELAY_INIT_4BIT #ifndef LCD_DELAY_INIT_4BIT
#define LCD_DELAY_INIT_4BIT 64 /**< delay in micro seconds after setting 4-bit mode */ # define LCD_DELAY_INIT_4BIT 64 /**< delay in micro seconds after setting 4-bit mode */
#endif #endif
#ifndef LCD_DELAY_BUSY_FLAG #ifndef LCD_DELAY_BUSY_FLAG
#define LCD_DELAY_BUSY_FLAG 4 /**< time in micro seconds the address counter is updated after busy flag is cleared */ # define LCD_DELAY_BUSY_FLAG 4 /**< time in micro seconds the address counter is updated after busy flag is cleared */
#endif #endif
#ifndef LCD_DELAY_ENABLE_PULSE #ifndef LCD_DELAY_ENABLE_PULSE
#define LCD_DELAY_ENABLE_PULSE 1 /**< enable signal pulse width in micro seconds */ # define LCD_DELAY_ENABLE_PULSE 1 /**< enable signal pulse width in micro seconds */
#endif #endif
/** /**
* @name Definitions for LCD command instructions * @name Definitions for LCD command instructions
* The constants define the various LCD controller instructions which can be passed to the * The constants define the various LCD controller instructions which can be passed to the
@ -272,16 +265,12 @@
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */ #define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */ #define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
#define LCD_MODE_DEFAULT ((1 << LCD_ENTRY_MODE) | (1 << LCD_ENTRY_INC))
#define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
/** /**
* @name Functions * @name Functions
*/ */
/** /**
@brief Initialize display and select type of cursor @brief Initialize display and select type of cursor
@param dispAttr \b LCD_DISP_OFF display off\n @param dispAttr \b LCD_DISP_OFF display off\n
@ -292,21 +281,18 @@
*/ */
extern void lcd_init(uint8_t dispAttr); extern void lcd_init(uint8_t dispAttr);
/** /**
@brief Clear display and set cursor to home position @brief Clear display and set cursor to home position
@return none @return none
*/ */
extern void lcd_clrscr(void); extern void lcd_clrscr(void);
/** /**
@brief Set cursor to home position @brief Set cursor to home position
@return none @return none
*/ */
extern void lcd_home(void); extern void lcd_home(void);
/** /**
@brief Set cursor to specified position @brief Set cursor to specified position
@ -316,7 +302,6 @@ extern void lcd_home(void);
*/ */
extern void lcd_gotoxy(uint8_t x, uint8_t y); extern void lcd_gotoxy(uint8_t x, uint8_t y);
/** /**
@brief Display character at current cursor position @brief Display character at current cursor position
@param c character to be displayed @param c character to be displayed
@ -324,7 +309,6 @@ extern void lcd_gotoxy(uint8_t x, uint8_t y);
*/ */
extern void lcd_putc(char c); extern void lcd_putc(char c);
/** /**
@brief Display string without auto linefeed @brief Display string without auto linefeed
@param s string to be displayed @param s string to be displayed
@ -332,7 +316,6 @@ extern void lcd_putc(char c);
*/ */
extern void lcd_puts(const char *s); extern void lcd_puts(const char *s);
/** /**
@brief Display string from program memory without auto linefeed @brief Display string from program memory without auto linefeed
@param progmem_s string from program memory be be displayed @param progmem_s string from program memory be be displayed
@ -341,7 +324,6 @@ extern void lcd_puts(const char *s);
*/ */
extern void lcd_puts_p(const char *progmem_s); extern void lcd_puts_p(const char *progmem_s);
/** /**
@brief Send LCD controller instruction command @brief Send LCD controller instruction command
@param cmd instruction to send to LCD controller, see HD44780 data sheet @param cmd instruction to send to LCD controller, see HD44780 data sheet
@ -349,7 +331,6 @@ extern void lcd_puts_p(const char *progmem_s);
*/ */
extern void lcd_command(uint8_t cmd); extern void lcd_command(uint8_t cmd);
/** /**
@brief Send data byte to LCD controller @brief Send data byte to LCD controller
@ -359,7 +340,6 @@ extern void lcd_command(uint8_t cmd);
*/ */
extern void lcd_data(uint8_t data); extern void lcd_data(uint8_t data);
/** /**
@brief macros for automatically storing string constant in program memory @brief macros for automatically storing string constant in program memory
*/ */
@ -367,5 +347,4 @@ extern void lcd_data(uint8_t data);
/**@}*/ /**@}*/
#endif //LCD_H #endif // LCD_H

4
drivers/avr/i2c_master.c Executable file → Normal file
View file

@ -34,7 +34,7 @@ void i2c_init(void) {
TWSR = 0; /* no prescaler */ TWSR = 0; /* no prescaler */
TWBR = (uint8_t)TWBR_val; TWBR = (uint8_t)TWBR_val;
#ifdef __AVR_ATmega32A__ #ifdef __AVR_ATmega32A__
// set pull-up resistors on I2C bus pins // set pull-up resistors on I2C bus pins
PORTC |= 0b11; PORTC |= 0b11;
@ -44,7 +44,7 @@ void i2c_init(void) {
// enable TWI interrupt and slave address ACK // enable TWI interrupt and slave address ACK
TWCR |= (1 << TWIE); TWCR |= (1 << TWIE);
TWCR |= (1 << TWEA); TWCR |= (1 << TWEA);
#endif #endif
} }
i2c_status_t i2c_start(uint8_t address, uint16_t timeout) { i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {

0
drivers/avr/i2c_master.h Executable file → Normal file
View file

10
drivers/avr/i2c_slave.c Executable file → Normal file
View file

@ -29,22 +29,22 @@ volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];
static volatile uint8_t buffer_address; static volatile uint8_t buffer_address;
static volatile bool slave_has_register_set = false; static volatile bool slave_has_register_set = false;
void i2c_slave_init(uint8_t address){ void i2c_slave_init(uint8_t address) {
// load address into TWI address register // load address into TWI address register
TWAR = address; TWAR = address;
// set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt // set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN); TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
} }
void i2c_slave_stop(void){ void i2c_slave_stop(void) {
// clear acknowledge and enable bits // clear acknowledge and enable bits
TWCR &= ~((1 << TWEA) | (1 << TWEN)); TWCR &= ~((1 << TWEA) | (1 << TWEN));
} }
ISR(TWI_vect){ ISR(TWI_vect) {
uint8_t ack = 1; uint8_t ack = 1;
switch(TW_STATUS){ switch (TW_STATUS) {
case TW_SR_SLA_ACK: case TW_SR_SLA_ACK:
// The device is now a slave receiver // The device is now a slave receiver
slave_has_register_set = false; slave_has_register_set = false;
@ -53,7 +53,7 @@ ISR(TWI_vect){
case TW_SR_DATA_ACK: case TW_SR_DATA_ACK:
// This device is a slave receiver and has received data // This device is a slave receiver and has received data
// First byte is the location then the bytes will be writen in buffer with auto-incriment // First byte is the location then the bytes will be writen in buffer with auto-incriment
if(!slave_has_register_set){ if (!slave_has_register_set) {
buffer_address = TWDR; buffer_address = TWDR;
if (buffer_address >= I2C_SLAVE_REG_COUNT) { // address out of bounds dont ack if (buffer_address >= I2C_SLAVE_REG_COUNT) { // address out of bounds dont ack

0
drivers/avr/i2c_slave.h Executable file → Normal file
View file

View file

@ -93,11 +93,11 @@
#define NUM_DIGITAL_PINS 30 #define NUM_DIGITAL_PINS 30
#define NUM_ANALOG_INPUTS 12 #define NUM_ANALOG_INPUTS 12
#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) #define TX_RX_LED_INIT DDRD |= (1 << 5), DDRB |= (1 << 0)
#define TXLED0 PORTD |= (1<<5) #define TXLED0 PORTD |= (1 << 5)
#define TXLED1 PORTD &= ~(1<<5) #define TXLED1 PORTD &= ~(1 << 5)
#define RXLED0 PORTB |= (1<<0) #define RXLED0 PORTB |= (1 << 0)
#define RXLED1 PORTB &= ~(1<<0) #define RXLED1 PORTB &= ~(1 << 0)
static const uint8_t SDA = 2; static const uint8_t SDA = 2;
static const uint8_t SCL = 3; static const uint8_t SCL = 3;
@ -127,11 +127,11 @@ static const uint8_t ADC11 = 29; // D12
#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))
#define digitalPinToPCICRbit(p) 0 #define digitalPinToPCICRbit(p) 0
#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) #define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0))
#define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) #define digitalPinToPCMSKbit(p) (((p) >= 8 && (p) <= 11) ? (p)-4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4))))))
// __AVR_ATmega32U4__ has an unusual mapping of pins to channels // __AVR_ATmega32U4__ has an unusual mapping of pins to channels
extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
#define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) #define analogPinToChannel(P) (pgm_read_byte(analog_pin_to_channel_PGM + (P)))
#define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
@ -182,33 +182,15 @@ extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
// appropriate addresses for various functions (e.g. reading // appropriate addresses for various functions (e.g. reading
// and writing) // and writing)
const uint16_t PROGMEM port_to_mode_PGM[] = { const uint16_t PROGMEM port_to_mode_PGM[] = {
NOT_A_PORT, NOT_A_PORT, NOT_A_PORT, (uint16_t)&DDRB, (uint16_t)&DDRC, (uint16_t)&DDRD, (uint16_t)&DDRE, (uint16_t)&DDRF,
NOT_A_PORT,
(uint16_t) &DDRB,
(uint16_t) &DDRC,
(uint16_t) &DDRD,
(uint16_t) &DDRE,
(uint16_t) &DDRF,
}; };
const uint16_t PROGMEM port_to_output_PGM[] = { const uint16_t PROGMEM port_to_output_PGM[] = {
NOT_A_PORT, NOT_A_PORT, NOT_A_PORT, (uint16_t)&PORTB, (uint16_t)&PORTC, (uint16_t)&PORTD, (uint16_t)&PORTE, (uint16_t)&PORTF,
NOT_A_PORT,
(uint16_t) &PORTB,
(uint16_t) &PORTC,
(uint16_t) &PORTD,
(uint16_t) &PORTE,
(uint16_t) &PORTF,
}; };
const uint16_t PROGMEM port_to_input_PGM[] = { const uint16_t PROGMEM port_to_input_PGM[] = {
NOT_A_PORT, NOT_A_PORT, NOT_A_PORT, (uint16_t)&PINB, (uint16_t)&PINC, (uint16_t)&PIND, (uint16_t)&PINE, (uint16_t)&PINF,
NOT_A_PORT,
(uint16_t) &PINB,
(uint16_t) &PINC,
(uint16_t) &PIND,
(uint16_t) &PINE,
(uint16_t) &PINF,
}; };
const uint8_t PROGMEM digital_pin_to_port_PGM[] = { const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
@ -286,40 +268,20 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
}; };
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */
NOT_ON_TIMER, NOT_ON_TIMER, TIMER3A, /* 5 */
NOT_ON_TIMER,
TIMER0B, /* 3 */
NOT_ON_TIMER,
TIMER3A, /* 5 */
TIMER4D, /* 6 */ TIMER4D, /* 6 */
NOT_ON_TIMER, NOT_ON_TIMER,
NOT_ON_TIMER, NOT_ON_TIMER, TIMER1A, /* 9 */
TIMER1A, /* 9 */
TIMER1B, /* 10 */ TIMER1B, /* 10 */
TIMER0A, /* 11 */ TIMER0A, /* 11 */
NOT_ON_TIMER, NOT_ON_TIMER, TIMER4A, /* 13 */
TIMER4A, /* 13 */
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
}; };
const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { const uint8_t PROGMEM analog_pin_to_channel_PGM[] = {

View file

@ -1,32 +1,32 @@
#ifdef SSD1306OLED #ifdef SSD1306OLED
#include "ssd1306.h" # include "ssd1306.h"
#include "i2c.h" # include "i2c.h"
#include <string.h> # include <string.h>
#include "print.h" # include "print.h"
#include "glcdfont.c" # include "glcdfont.c"
#ifdef ADAFRUIT_BLE_ENABLE # ifdef ADAFRUIT_BLE_ENABLE
#include "adafruit_ble.h" # include "adafruit_ble.h"
#endif # endif
#ifdef PROTOCOL_LUFA # ifdef PROTOCOL_LUFA
#include "lufa.h" # include "lufa.h"
#endif # endif
#include "sendchar.h" # include "sendchar.h"
#include "timer.h" # include "timer.h"
// Set this to 1 to help diagnose early startup problems // Set this to 1 to help diagnose early startup problems
// when testing power-on with ble. Turn it off otherwise, // when testing power-on with ble. Turn it off otherwise,
// as the latency of printing most of the debug info messes // as the latency of printing most of the debug info messes
// with the matrix scan, causing keys to drop. // with the matrix scan, causing keys to drop.
#define DEBUG_TO_SCREEN 0 # define DEBUG_TO_SCREEN 0
//static uint16_t last_battery_update; // static uint16_t last_battery_update;
//static uint32_t vbat; // static uint32_t vbat;
//#define BatteryUpdateInterval 10000 /* milliseconds */ //#define BatteryUpdateInterval 10000 /* milliseconds */
#define ScreenOffInterval 300000 /* milliseconds */ # define ScreenOffInterval 300000 /* milliseconds */
#if DEBUG_TO_SCREEN # if DEBUG_TO_SCREEN
static uint8_t displaying; static uint8_t displaying;
#endif # endif
static uint16_t last_flush; static uint16_t last_flush;
// Write command sequence. // Write command sequence.
@ -76,9 +76,18 @@ static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
return _send_cmd1(opr2); return _send_cmd1(opr2);
} }
#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} # define send_cmd1(c) \
#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} if (!_send_cmd1(c)) { \
#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} goto done; \
}
# define send_cmd2(c, o) \
if (!_send_cmd2(c, o)) { \
goto done; \
}
# define send_cmd3(c, o1, o2) \
if (!_send_cmd3(c, o1, o2)) { \
goto done; \
}
static void clear_display(void) { static void clear_display(void) {
matrix_clear(&display); matrix_clear(&display);
@ -107,8 +116,8 @@ done:
i2c_master_stop(); i2c_master_stop();
} }
#if DEBUG_TO_SCREEN # if DEBUG_TO_SCREEN
#undef sendchar # undef sendchar
static int8_t capture_sendchar(uint8_t c) { static int8_t capture_sendchar(uint8_t c) {
sendchar(c); sendchar(c);
iota_gfx_write_char(c); iota_gfx_write_char(c);
@ -118,7 +127,7 @@ static int8_t capture_sendchar(uint8_t c) {
} }
return 0; return 0;
} }
#endif # endif
bool iota_gfx_init(void) { bool iota_gfx_init(void) {
bool success = false; bool success = false;
@ -129,21 +138,20 @@ bool iota_gfx_init(void) {
send_cmd2(SetDisplayOffset, 0); send_cmd2(SetDisplayOffset, 0);
send_cmd1(SetStartLine | 0x0); send_cmd1(SetStartLine | 0x0);
send_cmd2(SetChargePump, 0x14 /* Enable */); send_cmd2(SetChargePump, 0x14 /* Enable */);
send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
#ifdef OLED_ROTATE180 # ifdef OLED_ROTATE180
// the following Flip the display orientation 180 degrees // the following Flip the display orientation 180 degrees
send_cmd1(SegRemap); send_cmd1(SegRemap);
send_cmd1(ComScanInc); send_cmd1(ComScanInc);
#endif # endif
#ifndef OLED_ROTATE180 # ifndef OLED_ROTATE180
// Flips the display orientation 0 degrees // Flips the display orientation 0 degrees
send_cmd1(SegRemap | 0x1); send_cmd1(SegRemap | 0x1);
send_cmd1(ComScanDec); send_cmd1(ComScanDec);
#endif # endif
send_cmd2(SetComPins, 0x2); send_cmd2(SetComPins, 0x2);
send_cmd2(SetContrast, 0x8f); send_cmd2(SetContrast, 0x8f);
@ -162,9 +170,9 @@ bool iota_gfx_init(void) {
iota_gfx_flush(); iota_gfx_flush();
#if DEBUG_TO_SCREEN # if DEBUG_TO_SCREEN
print_set_sendchar(capture_sendchar); print_set_sendchar(capture_sendchar);
#endif # endif
done: done:
return success; return success;
@ -196,8 +204,7 @@ void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
// We went off the end; scroll the display upwards by one line // We went off the end; scroll the display upwards by one line
memmove(&matrix->display[0], &matrix->display[1], memmove(&matrix->display[0], &matrix->display[1], MatrixCols * (MatrixRows - 1));
MatrixCols * (MatrixRows - 1));
matrix->cursor = &matrix->display[MatrixRows - 1][0]; matrix->cursor = &matrix->display[MatrixRows - 1][0];
memset(matrix->cursor, ' ', MatrixCols); memset(matrix->cursor, ' ', MatrixCols);
} }
@ -220,9 +227,7 @@ void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
matrix_write_char_inner(matrix, c); matrix_write_char_inner(matrix, c);
} }
void iota_gfx_write_char(uint8_t c) { void iota_gfx_write_char(uint8_t c) { matrix_write_char(&display, c); }
matrix_write_char(&display, c);
}
void matrix_write(struct CharacterMatrix *matrix, const char *data) { void matrix_write(struct CharacterMatrix *matrix, const char *data) {
const char *end = data + strlen(data); const char *end = data + strlen(data);
@ -232,9 +237,7 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data) {
} }
} }
void iota_gfx_write(const char *data) { void iota_gfx_write(const char *data) { matrix_write(&display, data); }
matrix_write(&display, data);
}
void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
while (true) { while (true) {
@ -247,9 +250,7 @@ void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
} }
} }
void iota_gfx_write_P(const char *data) { void iota_gfx_write_P(const char *data) { matrix_write_P(&display, data); }
matrix_write_P(&display, data);
}
void matrix_clear(struct CharacterMatrix *matrix) { void matrix_clear(struct CharacterMatrix *matrix) {
memset(matrix->display, ' ', sizeof(matrix->display)); memset(matrix->display, ' ', sizeof(matrix->display));
@ -257,16 +258,14 @@ void matrix_clear(struct CharacterMatrix *matrix) {
matrix->dirty = true; matrix->dirty = true;
} }
void iota_gfx_clear_screen(void) { void iota_gfx_clear_screen(void) { matrix_clear(&display); }
matrix_clear(&display);
}
void matrix_render(struct CharacterMatrix *matrix) { void matrix_render(struct CharacterMatrix *matrix) {
last_flush = timer_read(); last_flush = timer_read();
iota_gfx_on(); iota_gfx_on();
#if DEBUG_TO_SCREEN # if DEBUG_TO_SCREEN
++displaying; ++displaying;
#endif # endif
// Move to the home position // Move to the home position
send_cmd3(PageAddr, 0, MatrixRows - 1); send_cmd3(PageAddr, 0, MatrixRows - 1);
@ -298,18 +297,14 @@ void matrix_render(struct CharacterMatrix *matrix) {
done: done:
i2c_master_stop(); i2c_master_stop();
#if DEBUG_TO_SCREEN # if DEBUG_TO_SCREEN
--displaying; --displaying;
#endif # endif
} }
void iota_gfx_flush(void) { void iota_gfx_flush(void) { matrix_render(&display); }
matrix_render(&display);
}
__attribute__ ((weak)) __attribute__((weak)) void iota_gfx_task_user(void) {}
void iota_gfx_task_user(void) {
}
void iota_gfx_task(void) { void iota_gfx_task(void) {
iota_gfx_task_user(); iota_gfx_task_user();

View file

@ -49,7 +49,7 @@ enum ssd1306_cmds {
// Controls the SSD1306 128x32 OLED display via i2c // Controls the SSD1306 128x32 OLED display via i2c
#ifndef SSD1306_ADDRESS #ifndef SSD1306_ADDRESS
#define SSD1306_ADDRESS 0x3C # define SSD1306_ADDRESS 0x3C
#endif #endif
#define DisplayHeight 32 #define DisplayHeight 32
@ -88,6 +88,4 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix); void matrix_render(struct CharacterMatrix *matrix);
#endif #endif

View file

@ -1,25 +1,25 @@
/* /*
* light weight WS2812 lib V2.0b * light weight WS2812 lib V2.0b
* *
* Controls WS2811/WS2812/WS2812B RGB-LEDs * Controls WS2811/WS2812/WS2812B RGB-LEDs
* Author: Tim (cpldcpu@gmail.com) * Author: Tim (cpldcpu@gmail.com)
* *
* Jan 18th, 2014 v2.0b Initial Version * Jan 18th, 2014 v2.0b Initial Version
* Nov 29th, 2015 v2.3 Added SK6812RGBW support * Nov 29th, 2015 v2.3 Added SK6812RGBW support
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or * the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "ws2812.h" #include "ws2812.h"
#include <avr/interrupt.h> #include <avr/interrupt.h>
@ -30,44 +30,40 @@
#if !defined(LED_ARRAY) && defined(RGB_MATRIX_ENABLE) #if !defined(LED_ARRAY) && defined(RGB_MATRIX_ENABLE)
// LED color buffer // LED color buffer
LED_TYPE led[DRIVER_LED_TOTAL]; LED_TYPE led[DRIVER_LED_TOTAL];
#define LED_ARRAY led # define LED_ARRAY led
#endif #endif
#ifdef RGBW_BB_TWI #ifdef RGBW_BB_TWI
// Port for the I2C // Port for the I2C
#define I2C_DDR DDRD # define I2C_DDR DDRD
#define I2C_PIN PIND # define I2C_PIN PIND
#define I2C_PORT PORTD # define I2C_PORT PORTD
// Pins to be used in the bit banging // Pins to be used in the bit banging
#define I2C_CLK 0 # define I2C_CLK 0
#define I2C_DAT 1 # define I2C_DAT 1
#define I2C_DATA_HI()\ # define I2C_DATA_HI() \
I2C_DDR &= ~ (1 << I2C_DAT);\ I2C_DDR &= ~(1 << I2C_DAT); \
I2C_PORT |= (1 << I2C_DAT); I2C_PORT |= (1 << I2C_DAT);
#define I2C_DATA_LO()\ # define I2C_DATA_LO() \
I2C_DDR |= (1 << I2C_DAT);\ I2C_DDR |= (1 << I2C_DAT); \
I2C_PORT &= ~ (1 << I2C_DAT); I2C_PORT &= ~(1 << I2C_DAT);
#define I2C_CLOCK_HI()\ # define I2C_CLOCK_HI() \
I2C_DDR &= ~ (1 << I2C_CLK);\ I2C_DDR &= ~(1 << I2C_CLK); \
I2C_PORT |= (1 << I2C_CLK); I2C_PORT |= (1 << I2C_CLK);
#define I2C_CLOCK_LO()\ # define I2C_CLOCK_LO() \
I2C_DDR |= (1 << I2C_CLK);\ I2C_DDR |= (1 << I2C_CLK); \
I2C_PORT &= ~ (1 << I2C_CLK); I2C_PORT &= ~(1 << I2C_CLK);
#define I2C_DELAY 1 # define I2C_DELAY 1
void I2C_WriteBit(unsigned char c) void I2C_WriteBit(unsigned char c) {
{ if (c > 0) {
if (c > 0)
{
I2C_DATA_HI(); I2C_DATA_HI();
} } else {
else
{
I2C_DATA_LO(); I2C_DATA_LO();
} }
@ -77,8 +73,7 @@ void I2C_WriteBit(unsigned char c)
I2C_CLOCK_LO(); I2C_CLOCK_LO();
_delay_us(I2C_DELAY); _delay_us(I2C_DELAY);
if (c > 0) if (c > 0) {
{
I2C_DATA_LO(); I2C_DATA_LO();
} }
@ -87,9 +82,8 @@ void I2C_WriteBit(unsigned char c)
// Inits bitbanging port, must be called before using the functions below // Inits bitbanging port, must be called before using the functions below
// //
void I2C_Init(void) void I2C_Init(void) {
{ I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK));
I2C_PORT &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK));
I2C_CLOCK_HI(); I2C_CLOCK_HI();
I2C_DATA_HI(); I2C_DATA_HI();
@ -99,10 +93,9 @@ void I2C_Init(void)
// Send a START Condition // Send a START Condition
// //
void I2C_Start(void) void I2C_Start(void) {
{
// set both to high at the same time // set both to high at the same time
I2C_DDR &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK)); I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK));
_delay_us(I2C_DELAY); _delay_us(I2C_DELAY);
I2C_DATA_LO(); I2C_DATA_LO();
@ -114,8 +107,7 @@ void I2C_Start(void)
// Send a STOP Condition // Send a STOP Condition
// //
void I2C_Stop(void) void I2C_Stop(void) {
{
I2C_CLOCK_HI(); I2C_CLOCK_HI();
_delay_us(I2C_DELAY); _delay_us(I2C_DELAY);
@ -125,40 +117,34 @@ void I2C_Stop(void)
// write a byte to the I2C slave device // write a byte to the I2C slave device
// //
unsigned char I2C_Write(unsigned char c) unsigned char I2C_Write(unsigned char c) {
{ for (char i = 0; i < 8; i++) {
for (char i = 0; i < 8; i++)
{
I2C_WriteBit(c & 128); I2C_WriteBit(c & 128);
c <<= 1; c <<= 1;
} }
I2C_WriteBit(0); I2C_WriteBit(0);
_delay_us(I2C_DELAY); _delay_us(I2C_DELAY);
_delay_us(I2C_DELAY); _delay_us(I2C_DELAY);
// _delay_us(I2C_DELAY); // _delay_us(I2C_DELAY);
//return I2C_ReadBit(); // return I2C_ReadBit();
return 0; return 0;
} }
#endif #endif
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
// Set an led in the buffer to a color // Set an led in the buffer to a color
void inline ws2812_setled(int i, uint8_t r, uint8_t g, uint8_t b) void inline ws2812_setled(int i, uint8_t r, uint8_t g, uint8_t b) {
{
led[i].r = r; led[i].r = r;
led[i].g = g; led[i].g = g;
led[i].b = b; led[i].b = b;
} }
void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b) void ws2812_setled_all(uint8_t r, uint8_t g, uint8_t b) {
{ for (int i = 0; i < sizeof(led) / sizeof(led[0]); i++) {
for (int i = 0; i < sizeof(led)/sizeof(led[0]); i++) {
led[i].r = r; led[i].r = r;
led[i].g = g; led[i].g = g;
led[i].b = b; led[i].b = b;
@ -167,64 +153,55 @@ void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b)
#endif #endif
// Setleds for standard RGB // Setleds for standard RGB
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {
{
// ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF)); ws2812_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF));
} }
void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) {
{
// ws2812_DDRREG |= pinmask; // Enable DDR // ws2812_DDRREG |= pinmask; // Enable DDR
// new universal format (DDR) // new universal format (DDR)
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask; _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask;
ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask); ws2812_sendarray_mask((uint8_t *)ledarray, leds + leds + leds, pinmask);
_delay_us(50); _delay_us(50);
} }
// Setleds for SK6812RGBW // Setleds for SK6812RGBW
void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds) void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds) {
{ #ifdef RGBW_BB_TWI
#ifdef RGBW_BB_TWI
uint8_t sreg_prev, twcr_prev; uint8_t sreg_prev, twcr_prev;
sreg_prev=SREG; sreg_prev = SREG;
twcr_prev=TWCR; twcr_prev = TWCR;
cli(); cli();
TWCR &= ~(1<<TWEN); TWCR &= ~(1 << TWEN);
I2C_Init(); I2C_Init();
I2C_Start(); I2C_Start();
I2C_Write(0x84); I2C_Write(0x84);
uint16_t datlen = leds<<2; uint16_t datlen = leds << 2;
uint8_t curbyte; uint8_t curbyte;
uint8_t * data = (uint8_t*)ledarray; uint8_t *data = (uint8_t *)ledarray;
while (datlen--) { while (datlen--) {
curbyte=*data++; curbyte = *data++;
I2C_Write(curbyte); I2C_Write(curbyte);
} }
I2C_Stop(); I2C_Stop();
SREG=sreg_prev; SREG = sreg_prev;
TWCR=twcr_prev; TWCR = twcr_prev;
#endif #endif
// ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR // ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
// new universal format (DDR) // new universal format (DDR)
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF); _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF);
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF)); ws2812_sendarray_mask((uint8_t *)ledarray, leds << 2, _BV(RGB_DI_PIN & 0xF));
#ifndef RGBW_BB_TWI
#ifndef RGBW_BB_TWI
_delay_us(80); _delay_us(80);
#endif #endif
} }
void ws2812_sendarray(uint8_t *data,uint16_t datlen) void ws2812_sendarray(uint8_t *data, uint16_t datlen) { ws2812_sendarray_mask(data, datlen, _BV(RGB_DI_PIN & 0xF)); }
{
ws2812_sendarray_mask(data,datlen,_BV(RGB_DI_PIN & 0xF));
}
/* /*
This routine writes an array of bytes with RGB values to the Dataout pin This routine writes an array of bytes with RGB values to the Dataout pin
@ -242,43 +219,43 @@ void ws2812_sendarray(uint8_t *data,uint16_t datlen)
#define w_fixedtotal 8 #define w_fixedtotal 8
// Insert NOPs to match the timing, if possible // Insert NOPs to match the timing, if possible
#define w_zerocycles (((F_CPU/1000)*w_zeropulse )/1000000) #define w_zerocycles (((F_CPU / 1000) * w_zeropulse) / 1000000)
#define w_onecycles (((F_CPU/1000)*w_onepulse +500000)/1000000) #define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000)
#define w_totalcycles (((F_CPU/1000)*w_totalperiod +500000)/1000000) #define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000)
// w1 - nops between rising edge and falling edge - low // w1 - nops between rising edge and falling edge - low
#define w1 (w_zerocycles-w_fixedlow) #define w1 (w_zerocycles - w_fixedlow)
// w2 nops between fe low and fe high // w2 nops between fe low and fe high
#define w2 (w_onecycles-w_fixedhigh-w1) #define w2 (w_onecycles - w_fixedhigh - w1)
// w3 nops to complete loop // w3 nops to complete loop
#define w3 (w_totalcycles-w_fixedtotal-w1-w2) #define w3 (w_totalcycles - w_fixedtotal - w1 - w2)
#if w1>0 #if w1 > 0
#define w1_nops w1 # define w1_nops w1
#else #else
#define w1_nops 0 # define w1_nops 0
#endif #endif
// The only critical timing parameter is the minimum pulse length of the "0" // The only critical timing parameter is the minimum pulse length of the "0"
// Warn or throw error if this timing can not be met with current F_CPU settings. // Warn or throw error if this timing can not be met with current F_CPU settings.
#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000) #define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000)
#if w_lowtime>550 #if w_lowtime > 550
#error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?" # error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?"
#elif w_lowtime>450 #elif w_lowtime > 450
#warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)." # warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)."
#warning "Please consider a higher clockspeed, if possible" # warning "Please consider a higher clockspeed, if possible"
#endif #endif
#if w2>0 #if w2 > 0
#define w2_nops w2 # define w2_nops w2
#else #else
#define w2_nops 0 # define w2_nops 0
#endif #endif
#if w3>0 #if w3 > 0
#define w3_nops w3 # define w3_nops w3
#else #else
#define w3_nops 0 # define w3_nops 0
#endif #endif
#define w_nop1 "nop \n\t" #define w_nop1 "nop \n\t"
@ -287,81 +264,78 @@ void ws2812_sendarray(uint8_t *data,uint16_t datlen)
#define w_nop8 w_nop4 w_nop4 #define w_nop8 w_nop4 w_nop4
#define w_nop16 w_nop8 w_nop8 #define w_nop16 w_nop8 w_nop8
void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi) void inline ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t maskhi) {
{ uint8_t curbyte, ctr, masklo;
uint8_t curbyte,ctr,masklo;
uint8_t sreg_prev; uint8_t sreg_prev;
// masklo =~maskhi&ws2812_PORTREG; // masklo =~maskhi&ws2812_PORTREG;
// maskhi |= ws2812_PORTREG; // maskhi |= ws2812_PORTREG;
masklo =~maskhi&_SFR_IO8((RGB_DI_PIN >> 4) + 2); masklo = ~maskhi & _SFR_IO8((RGB_DI_PIN >> 4) + 2);
maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2); maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2);
sreg_prev=SREG; sreg_prev = SREG;
cli(); cli();
while (datlen--) { while (datlen--) {
curbyte=(*data++); curbyte = (*data++);
asm volatile( asm volatile(" ldi %0,8 \n\t"
" ldi %0,8 \n\t"
"loop%=: \n\t" "loop%=: \n\t"
" out %2,%3 \n\t" // '1' [01] '0' [01] - re " out %2,%3 \n\t" // '1' [01] '0' [01] - re
#if (w1_nops&1) #if (w1_nops & 1)
w_nop1 w_nop1
#endif #endif
#if (w1_nops&2) #if (w1_nops & 2)
w_nop2 w_nop2
#endif #endif
#if (w1_nops&4) #if (w1_nops & 4)
w_nop4 w_nop4
#endif #endif
#if (w1_nops&8) #if (w1_nops & 8)
w_nop8 w_nop8
#endif #endif
#if (w1_nops&16) #if (w1_nops & 16)
w_nop16 w_nop16
#endif #endif
" sbrs %1,7 \n\t" // '1' [03] '0' [02] " sbrs %1,7 \n\t" // '1' [03] '0' [02]
" out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low " out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low
" lsl %1 \n\t" // '1' [04] '0' [04] " lsl %1 \n\t" // '1' [04] '0' [04]
#if (w2_nops&1) #if (w2_nops & 1)
w_nop1 w_nop1
#endif #endif
#if (w2_nops&2) #if (w2_nops & 2)
w_nop2 w_nop2
#endif #endif
#if (w2_nops&4) #if (w2_nops & 4)
w_nop4 w_nop4
#endif #endif
#if (w2_nops&8) #if (w2_nops & 8)
w_nop8 w_nop8
#endif #endif
#if (w2_nops&16) #if (w2_nops & 16)
w_nop16 w_nop16
#endif #endif
" out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high " out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high
#if (w3_nops&1) #if (w3_nops & 1)
w_nop1 w_nop1
#endif #endif
#if (w3_nops&2) #if (w3_nops & 2)
w_nop2 w_nop2
#endif #endif
#if (w3_nops&4) #if (w3_nops & 4)
w_nop4 w_nop4
#endif #endif
#if (w3_nops&8) #if (w3_nops & 8)
w_nop8 w_nop8
#endif #endif
#if (w3_nops&16) #if (w3_nops & 16)
w_nop16 w_nop16
#endif #endif
" dec %0 \n\t" // '1' [+2] '0' [+2] " dec %0 \n\t" // '1' [+2] '0' [+2]
" brne loop%=\n\t" // '1' [+3] '0' [+4] " brne loop%=\n\t" // '1' [+3] '0' [+4]
: "=&d" (ctr) : "=&d"(ctr)
: "r" (curbyte), "I" (_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r" (maskhi), "r" (masklo) : "r"(curbyte), "I"(_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r"(maskhi), "r"(masklo));
);
} }
SREG=sreg_prev; SREG = sreg_prev;
} }

View file

@ -43,12 +43,12 @@
* - Wait 50<EFBFBD>s to reset the LEDs * - Wait 50<EFBFBD>s to reset the LEDs
*/ */
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
void ws2812_setled (int index, uint8_t r, uint8_t g, uint8_t b); void ws2812_setled(int index, uint8_t r, uint8_t g, uint8_t b);
void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b); void ws2812_setled_all(uint8_t r, uint8_t g, uint8_t b);
#endif #endif
void ws2812_setleds (LED_TYPE *ledarray, uint16_t number_of_leds); void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
void ws2812_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask); void ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pinmask);
void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds); void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
/* /*
@ -58,18 +58,17 @@ void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
* The length is the number of bytes to send - three per LED. * The length is the number of bytes to send - three per LED.
*/ */
void ws2812_sendarray (uint8_t *array,uint16_t length); void ws2812_sendarray(uint8_t *array, uint16_t length);
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask); void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask);
/* /*
* Internal defines * Internal defines
*/ */
#ifndef CONCAT #ifndef CONCAT
#define CONCAT(a, b) a ## b # define CONCAT(a, b) a##b
#endif #endif
#ifndef CONCAT_EXP #ifndef CONCAT_EXP
#define CONCAT_EXP(a, b) CONCAT(a, b) # define CONCAT_EXP(a, b) CONCAT(a, b)
#endif #endif
#endif /* LIGHT_WS2812_H_ */ #endif /* LIGHT_WS2812_H_ */

View file

@ -23,42 +23,33 @@
* This variable is used by the HAL when initializing the PAL driver. * This variable is used by the HAL when initializing the PAL driver.
*/ */
const PALConfig pal_default_config = { const PALConfig pal_default_config = {
#if STM32_HAS_GPIOA # if STM32_HAS_GPIOA
{VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, # endif
#endif # if STM32_HAS_GPIOB
#if STM32_HAS_GPIOB {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
{VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, # endif
VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, # if STM32_HAS_GPIOC
#endif {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
#if STM32_HAS_GPIOC # endif
{VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, # if STM32_HAS_GPIOD
VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
#endif # endif
#if STM32_HAS_GPIOD # if STM32_HAS_GPIOE
{VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, # endif
#endif # if STM32_HAS_GPIOF
#if STM32_HAS_GPIOE {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
{VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, # endif
VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, # if STM32_HAS_GPIOG
#endif {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
#if STM32_HAS_GPIOF # endif
{VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, # if STM32_HAS_GPIOH
VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
#endif # endif
#if STM32_HAS_GPIOG # if STM32_HAS_GPIOI
{VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, # endif
#endif
#if STM32_HAS_GPIOH
{VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
#endif
#if STM32_HAS_GPIOI
{VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
#endif
}; };
#endif #endif
@ -79,7 +70,6 @@ void __early_init(void) {
* @brief SDC card detection. * @brief SDC card detection.
*/ */
bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
(void)sdcp; (void)sdcp;
/* TODO: Fill the implementation.*/ /* TODO: Fill the implementation.*/
return true; return true;
@ -89,7 +79,6 @@ bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
* @brief SDC card write protection detection. * @brief SDC card write protection detection.
*/ */
bool sdc_lld_is_write_protected(SDCDriver *sdcp) { bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
(void)sdcp; (void)sdcp;
/* TODO: Fill the implementation.*/ /* TODO: Fill the implementation.*/
return false; return false;
@ -101,7 +90,6 @@ bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
* @brief MMC_SPI card detection. * @brief MMC_SPI card detection.
*/ */
bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
(void)mmcp; (void)mmcp;
/* TODO: Fill the implementation.*/ /* TODO: Fill the implementation.*/
return true; return true;
@ -111,7 +99,6 @@ bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
* @brief MMC_SPI card write protection detection. * @brief MMC_SPI card write protection detection.
*/ */
bool mmc_lld_is_write_protected(MMCDriver *mmcp) { bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
(void)mmcp; (void)mmcp;
/* TODO: Fill the implementation.*/ /* TODO: Fill the implementation.*/
return false; return false;
@ -122,5 +109,4 @@ bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
* @brief Board-specific initialization code. * @brief Board-specific initialization code.
* @todo Add your board-specific code, if any. * @todo Add your board-specific code, if any.
*/ */
void boardInit(void) { void boardInit(void) {}
}

View file

@ -32,13 +32,13 @@
* NOTE: LSE not fitted. * NOTE: LSE not fitted.
*/ */
#if !defined(STM32_LSECLK) #if !defined(STM32_LSECLK)
#define STM32_LSECLK 0U # define STM32_LSECLK 0U
#endif #endif
#define STM32_LSEDRV (3U << 3U) #define STM32_LSEDRV (3U << 3U)
#if !defined(STM32_HSECLK) #if !defined(STM32_HSECLK)
#define STM32_HSECLK 8000000U # define STM32_HSECLK 8000000U
#endif #endif
// #define STM32_HSE_BYPASS // #define STM32_HSE_BYPASS
@ -201,27 +201,26 @@
#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) #define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U)
/* /*
* I/O ports initial setup, this configuration is established soon after reset * I/O ports initial setup, this configuration is established soon after reset
* in the initialization code. * in the initialization code.
* Please refer to the STM32 Reference Manual for details. * Please refer to the STM32 Reference Manual for details.
*/ */
#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) #define PIN_MODE_INPUT(n) (0U << ((n)*2U))
#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) #define PIN_MODE_OUTPUT(n) (1U << ((n)*2U))
#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) #define PIN_MODE_ALTERNATE(n) (2U << ((n)*2U))
#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) #define PIN_MODE_ANALOG(n) (3U << ((n)*2U))
#define PIN_ODR_LOW(n) (0U << (n)) #define PIN_ODR_LOW(n) (0U << (n))
#define PIN_ODR_HIGH(n) (1U << (n)) #define PIN_ODR_HIGH(n) (1U << (n))
#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) #define PIN_OTYPE_PUSHPULL(n) (0U << (n))
#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) #define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) #define PIN_OSPEED_VERYLOW(n) (0U << ((n)*2U))
#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) #define PIN_OSPEED_LOW(n) (1U << ((n)*2U))
#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) #define PIN_OSPEED_MEDIUM(n) (2U << ((n)*2U))
#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) #define PIN_OSPEED_HIGH(n) (3U << ((n)*2U))
#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) #define PIN_PUPDR_FLOATING(n) (0U << ((n)*2U))
#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) #define PIN_PUPDR_PULLUP(n) (1U << ((n)*2U))
#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) #define PIN_PUPDR_PULLDOWN(n) (2U << ((n)*2U))
#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) #define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
/* /*
@ -244,102 +243,13 @@
* PA14 - SWCLK (alternate 0). * PA14 - SWCLK (alternate 0).
* PA15 - ROW4 * PA15 - ROW4
*/ */
#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ #define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | PIN_MODE_ALTERNATE(GPIOA_PIN1) | PIN_MODE_INPUT(GPIOA_PIN2) | PIN_MODE_INPUT(GPIOA_PIN3) | PIN_MODE_INPUT(GPIOA_PIN4) | PIN_MODE_INPUT(GPIOA_PIN5) | PIN_MODE_INPUT(GPIOA_PIN6) | PIN_MODE_INPUT(GPIOA_PIN7) | PIN_MODE_INPUT(GPIOA_PIN8) | PIN_MODE_INPUT(GPIOA_PIN9) | PIN_MODE_INPUT(GPIOA_PIN10) | PIN_MODE_ALTERNATE(GPIOA_USB_DM) | PIN_MODE_ALTERNATE(GPIOA_USB_DP) | PIN_MODE_ALTERNATE(GPIOA_SWDIO) | PIN_MODE_ALTERNATE(GPIOA_SWCLK) | PIN_MODE_INPUT(GPIOA_PIN15))
PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ #define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
PIN_MODE_INPUT(GPIOA_PIN2) | \ #define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | PIN_OSPEED_HIGH(GPIOA_PIN1) | PIN_OSPEED_VERYLOW(GPIOA_PIN2) | PIN_OSPEED_VERYLOW(GPIOA_PIN3) | PIN_OSPEED_VERYLOW(GPIOA_PIN4) | PIN_OSPEED_VERYLOW(GPIOA_PIN5) | PIN_OSPEED_VERYLOW(GPIOA_PIN6) | PIN_OSPEED_VERYLOW(GPIOA_PIN7) | PIN_OSPEED_VERYLOW(GPIOA_PIN8) | PIN_OSPEED_VERYLOW(GPIOA_PIN9) | PIN_OSPEED_VERYLOW(GPIOA_PIN10) | PIN_OSPEED_HIGH(GPIOA_USB_DM) | PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | PIN_OSPEED_HIGH(GPIOA_SWDIO) | PIN_OSPEED_HIGH(GPIOA_SWCLK) | PIN_OSPEED_VERYLOW(GPIOA_PIN15))
PIN_MODE_INPUT(GPIOA_PIN3) | \ #define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | PIN_PUPDR_FLOATING(GPIOA_PIN1) | PIN_PUPDR_PULLUP(GPIOA_PIN2) | PIN_PUPDR_PULLUP(GPIOA_PIN3) | PIN_PUPDR_PULLUP(GPIOA_PIN4) | PIN_PUPDR_PULLUP(GPIOA_PIN5) | PIN_PUPDR_PULLUP(GPIOA_PIN6) | PIN_PUPDR_FLOATING(GPIOA_PIN7) | PIN_PUPDR_PULLUP(GPIOA_PIN8) | PIN_PUPDR_PULLUP(GPIOA_PIN9) | PIN_PUPDR_PULLUP(GPIOA_PIN10) | PIN_PUPDR_FLOATING(GPIOA_USB_DM) | PIN_PUPDR_FLOATING(GPIOA_USB_DP) | PIN_PUPDR_PULLUP(GPIOA_SWDIO) | PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | PIN_PUPDR_PULLUP(GPIOA_PIN15))
PIN_MODE_INPUT(GPIOA_PIN4) | \ #define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | PIN_ODR_HIGH(GPIOA_PIN1) | PIN_ODR_HIGH(GPIOA_PIN2) | PIN_ODR_HIGH(GPIOA_PIN3) | PIN_ODR_HIGH(GPIOA_PIN4) | PIN_ODR_HIGH(GPIOA_PIN5) | PIN_ODR_HIGH(GPIOA_PIN6) | PIN_ODR_HIGH(GPIOA_PIN7) | PIN_ODR_HIGH(GPIOA_PIN8) | PIN_ODR_HIGH(GPIOA_PIN9) | PIN_ODR_HIGH(GPIOA_PIN10) | PIN_ODR_HIGH(GPIOA_USB_DM) | PIN_ODR_HIGH(GPIOA_USB_DP) | PIN_ODR_HIGH(GPIOA_SWDIO) | PIN_ODR_HIGH(GPIOA_SWCLK) | PIN_ODR_HIGH(GPIOA_PIN15))
PIN_MODE_INPUT(GPIOA_PIN5) | \ #define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | PIN_AFIO_AF(GPIOA_PIN1, 1) | PIN_AFIO_AF(GPIOA_PIN2, 0) | PIN_AFIO_AF(GPIOA_PIN3, 0) | PIN_AFIO_AF(GPIOA_PIN4, 0) | PIN_AFIO_AF(GPIOA_PIN5, 5) | PIN_AFIO_AF(GPIOA_PIN6, 5) | PIN_AFIO_AF(GPIOA_PIN7, 5))
PIN_MODE_INPUT(GPIOA_PIN6) | \ #define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | PIN_AFIO_AF(GPIOA_PIN9, 0) | PIN_AFIO_AF(GPIOA_PIN10, 0) | PIN_AFIO_AF(GPIOA_USB_DM, 14) | PIN_AFIO_AF(GPIOA_USB_DP, 14) | PIN_AFIO_AF(GPIOA_SWDIO, 0) | PIN_AFIO_AF(GPIOA_SWCLK, 0) | PIN_AFIO_AF(GPIOA_PIN15, 0))
PIN_MODE_INPUT(GPIOA_PIN7) | \
PIN_MODE_INPUT(GPIOA_PIN8) | \
PIN_MODE_INPUT(GPIOA_PIN9) | \
PIN_MODE_INPUT(GPIOA_PIN10) | \
PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \
PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \
PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
PIN_MODE_INPUT(GPIOA_PIN15))
#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \
PIN_OSPEED_HIGH(GPIOA_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
PIN_OSPEED_HIGH(GPIOA_USB_DM) | \
PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
PIN_OSPEED_VERYLOW(GPIOA_PIN15))
#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \
PIN_PUPDR_FLOATING(GPIOA_PIN1) | \
PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
PIN_PUPDR_FLOATING(GPIOA_PIN7) | \
PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
PIN_PUPDR_PULLUP(GPIOA_PIN15))
#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \
PIN_ODR_HIGH(GPIOA_PIN1) | \
PIN_ODR_HIGH(GPIOA_PIN2) | \
PIN_ODR_HIGH(GPIOA_PIN3) | \
PIN_ODR_HIGH(GPIOA_PIN4) | \
PIN_ODR_HIGH(GPIOA_PIN5) | \
PIN_ODR_HIGH(GPIOA_PIN6) | \
PIN_ODR_HIGH(GPIOA_PIN7) | \
PIN_ODR_HIGH(GPIOA_PIN8) | \
PIN_ODR_HIGH(GPIOA_PIN9) | \
PIN_ODR_HIGH(GPIOA_PIN10) | \
PIN_ODR_HIGH(GPIOA_USB_DM) | \
PIN_ODR_HIGH(GPIOA_USB_DP) | \
PIN_ODR_HIGH(GPIOA_SWDIO) | \
PIN_ODR_HIGH(GPIOA_SWCLK) | \
PIN_ODR_HIGH(GPIOA_PIN15))
#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \
PIN_AFIO_AF(GPIOA_PIN1, 1) | \
PIN_AFIO_AF(GPIOA_PIN2, 0) | \
PIN_AFIO_AF(GPIOA_PIN3, 0) | \
PIN_AFIO_AF(GPIOA_PIN4, 0) | \
PIN_AFIO_AF(GPIOA_PIN5, 5) | \
PIN_AFIO_AF(GPIOA_PIN6, 5) | \
PIN_AFIO_AF(GPIOA_PIN7, 5))
#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \
PIN_AFIO_AF(GPIOA_PIN9, 0) | \
PIN_AFIO_AF(GPIOA_PIN10, 0) | \
PIN_AFIO_AF(GPIOA_USB_DM, 14) | \
PIN_AFIO_AF(GPIOA_USB_DP, 14) | \
PIN_AFIO_AF(GPIOA_SWDIO, 0) | \
PIN_AFIO_AF(GPIOA_SWCLK, 0) | \
PIN_AFIO_AF(GPIOA_PIN15, 0))
/* /*
* GPIOB setup: * GPIOB setup:
@ -361,102 +271,13 @@
* PB14 - PIN14 (input pullup). * PB14 - PIN14 (input pullup).
* PB15 - PIN15 (input pullup). * PB15 - PIN15 (input pullup).
*/ */
#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ #define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | PIN_MODE_INPUT(GPIOB_PIN1) | PIN_MODE_INPUT(GPIOB_PIN2) | PIN_MODE_ALTERNATE(GPIOB_PIN3) | PIN_MODE_INPUT(GPIOB_PIN4) | PIN_MODE_INPUT(GPIOB_PIN5) | PIN_MODE_ALTERNATE(GPIOB_PIN6) | PIN_MODE_OUTPUT(GPIOB_PIN7) | PIN_MODE_INPUT(GPIOB_PIN8) | PIN_MODE_INPUT(GPIOB_PIN9) | PIN_MODE_INPUT(GPIOB_PIN10) | PIN_MODE_INPUT(GPIOB_PIN11) | PIN_MODE_INPUT(GPIOB_PIN12) | PIN_MODE_INPUT(GPIOB_PIN13) | PIN_MODE_INPUT(GPIOB_PIN14) | PIN_MODE_INPUT(GPIOB_PIN15))
PIN_MODE_INPUT(GPIOB_PIN1) | \ #define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | PIN_OTYPE_PUSHPULL(GPIOB_PIN15))
PIN_MODE_INPUT(GPIOB_PIN2) | \ #define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | PIN_OSPEED_VERYLOW(GPIOB_PIN1) | PIN_OSPEED_VERYLOW(GPIOB_PIN2) | PIN_OSPEED_HIGH(GPIOB_PIN3) | PIN_OSPEED_VERYLOW(GPIOB_PIN4) | PIN_OSPEED_VERYLOW(GPIOB_PIN5) | PIN_OSPEED_HIGH(GPIOB_PIN6) | PIN_OSPEED_VERYLOW(GPIOB_PIN7) | PIN_OSPEED_VERYLOW(GPIOB_PIN8) | PIN_OSPEED_VERYLOW(GPIOB_PIN9) | PIN_OSPEED_VERYLOW(GPIOB_PIN10) | PIN_OSPEED_VERYLOW(GPIOB_PIN11) | PIN_OSPEED_VERYLOW(GPIOB_PIN12) | PIN_OSPEED_VERYLOW(GPIOB_PIN13) | PIN_OSPEED_VERYLOW(GPIOB_PIN14) | PIN_OSPEED_VERYLOW(GPIOB_PIN15))
PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ #define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | PIN_PUPDR_PULLUP(GPIOB_PIN1) | PIN_PUPDR_PULLUP(GPIOB_PIN2) | PIN_PUPDR_FLOATING(GPIOB_PIN3) | PIN_PUPDR_PULLUP(GPIOB_PIN4) | PIN_PUPDR_PULLUP(GPIOB_PIN5) | PIN_PUPDR_FLOATING(GPIOB_PIN6) | PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | PIN_PUPDR_PULLUP(GPIOB_PIN8) | PIN_PUPDR_PULLUP(GPIOB_PIN9) | PIN_PUPDR_PULLUP(GPIOB_PIN10) | PIN_PUPDR_PULLUP(GPIOB_PIN11) | PIN_PUPDR_PULLUP(GPIOB_PIN12) | PIN_PUPDR_PULLUP(GPIOB_PIN13) | PIN_PUPDR_PULLUP(GPIOB_PIN14) | PIN_PUPDR_PULLUP(GPIOB_PIN15))
PIN_MODE_INPUT(GPIOB_PIN4) | \ #define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | PIN_ODR_HIGH(GPIOB_PIN1) | PIN_ODR_HIGH(GPIOB_PIN2) | PIN_ODR_HIGH(GPIOB_PIN3) | PIN_ODR_HIGH(GPIOB_PIN4) | PIN_ODR_HIGH(GPIOB_PIN5) | PIN_ODR_HIGH(GPIOB_PIN6) | PIN_ODR_LOW(GPIOB_PIN7) | PIN_ODR_HIGH(GPIOB_PIN8) | PIN_ODR_HIGH(GPIOB_PIN9) | PIN_ODR_HIGH(GPIOB_PIN10) | PIN_ODR_HIGH(GPIOB_PIN11) | PIN_ODR_HIGH(GPIOB_PIN12) | PIN_ODR_HIGH(GPIOB_PIN13) | PIN_ODR_HIGH(GPIOB_PIN14) | PIN_ODR_HIGH(GPIOB_PIN15))
PIN_MODE_INPUT(GPIOB_PIN5) | \ #define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | PIN_AFIO_AF(GPIOB_PIN1, 0) | PIN_AFIO_AF(GPIOB_PIN2, 0) | PIN_AFIO_AF(GPIOB_PIN3, 0) | PIN_AFIO_AF(GPIOB_PIN4, 0) | PIN_AFIO_AF(GPIOB_PIN5, 0) | PIN_AFIO_AF(GPIOB_PIN6, 4) | PIN_AFIO_AF(GPIOB_PIN7, 0))
PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ #define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | PIN_AFIO_AF(GPIOB_PIN9, 0) | PIN_AFIO_AF(GPIOB_PIN10, 0) | PIN_AFIO_AF(GPIOB_PIN11, 0) | PIN_AFIO_AF(GPIOB_PIN12, 0) | PIN_AFIO_AF(GPIOB_PIN13, 0) | PIN_AFIO_AF(GPIOB_PIN14, 0) | PIN_AFIO_AF(GPIOB_PIN15, 0))
PIN_MODE_OUTPUT(GPIOB_PIN7) | \
PIN_MODE_INPUT(GPIOB_PIN8) | \
PIN_MODE_INPUT(GPIOB_PIN9) | \
PIN_MODE_INPUT(GPIOB_PIN10) | \
PIN_MODE_INPUT(GPIOB_PIN11) | \
PIN_MODE_INPUT(GPIOB_PIN12) | \
PIN_MODE_INPUT(GPIOB_PIN13) | \
PIN_MODE_INPUT(GPIOB_PIN14) | \
PIN_MODE_INPUT(GPIOB_PIN15))
#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOB_PIN15))
#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \
PIN_OSPEED_HIGH(GPIOB_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
PIN_OSPEED_HIGH(GPIOB_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \
PIN_OSPEED_VERYLOW(GPIOB_PIN15))
#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
PIN_PUPDR_FLOATING(GPIOB_PIN3) | \
PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
PIN_PUPDR_FLOATING(GPIOB_PIN6) | \
PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \
PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
PIN_PUPDR_PULLUP(GPIOB_PIN13) | \
PIN_PUPDR_PULLUP(GPIOB_PIN14) | \
PIN_PUPDR_PULLUP(GPIOB_PIN15))
#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
PIN_ODR_HIGH(GPIOB_PIN1) | \
PIN_ODR_HIGH(GPIOB_PIN2) | \
PIN_ODR_HIGH(GPIOB_PIN3) | \
PIN_ODR_HIGH(GPIOB_PIN4) | \
PIN_ODR_HIGH(GPIOB_PIN5) | \
PIN_ODR_HIGH(GPIOB_PIN6) | \
PIN_ODR_LOW(GPIOB_PIN7) | \
PIN_ODR_HIGH(GPIOB_PIN8) | \
PIN_ODR_HIGH(GPIOB_PIN9) | \
PIN_ODR_HIGH(GPIOB_PIN10) | \
PIN_ODR_HIGH(GPIOB_PIN11) | \
PIN_ODR_HIGH(GPIOB_PIN12) | \
PIN_ODR_HIGH(GPIOB_PIN13) | \
PIN_ODR_HIGH(GPIOB_PIN14) | \
PIN_ODR_HIGH(GPIOB_PIN15))
#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \
PIN_AFIO_AF(GPIOB_PIN1, 0) | \
PIN_AFIO_AF(GPIOB_PIN2, 0) | \
PIN_AFIO_AF(GPIOB_PIN3, 0) | \
PIN_AFIO_AF(GPIOB_PIN4, 0) | \
PIN_AFIO_AF(GPIOB_PIN5, 0) | \
PIN_AFIO_AF(GPIOB_PIN6, 4) | \
PIN_AFIO_AF(GPIOB_PIN7, 0))
#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \
PIN_AFIO_AF(GPIOB_PIN9, 0) | \
PIN_AFIO_AF(GPIOB_PIN10, 0) | \
PIN_AFIO_AF(GPIOB_PIN11, 0) | \
PIN_AFIO_AF(GPIOB_PIN12, 0) | \
PIN_AFIO_AF(GPIOB_PIN13, 0) | \
PIN_AFIO_AF(GPIOB_PIN14, 0) | \
PIN_AFIO_AF(GPIOB_PIN15, 0))
/* /*
* GPIOC setup: * GPIOC setup:
@ -478,102 +299,13 @@
* PC14 - PIN14 (input floating). * PC14 - PIN14 (input floating).
* PC15 - PIN15 (input floating). * PC15 - PIN15 (input floating).
*/ */
#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ #define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | PIN_MODE_INPUT(GPIOC_PIN1) | PIN_MODE_INPUT(GPIOC_PIN2) | PIN_MODE_INPUT(GPIOC_PIN3) | PIN_MODE_INPUT(GPIOC_PIN4) | PIN_MODE_INPUT(GPIOC_PIN5) | PIN_MODE_INPUT(GPIOC_PIN6) | PIN_MODE_INPUT(GPIOC_PIN7) | PIN_MODE_INPUT(GPIOC_PIN8) | PIN_MODE_INPUT(GPIOC_PIN9) | PIN_MODE_INPUT(GPIOC_PIN10) | PIN_MODE_INPUT(GPIOC_PIN11) | PIN_MODE_INPUT(GPIOC_PIN12) | PIN_MODE_INPUT(GPIOC_PIN13) | PIN_MODE_INPUT(GPIOC_PIN14) | PIN_MODE_INPUT(GPIOC_PIN15))
PIN_MODE_INPUT(GPIOC_PIN1) | \ #define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | PIN_OTYPE_PUSHPULL(GPIOC_PIN15))
PIN_MODE_INPUT(GPIOC_PIN2) | \ #define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | PIN_OSPEED_VERYLOW(GPIOC_PIN1) | PIN_OSPEED_VERYLOW(GPIOC_PIN2) | PIN_OSPEED_VERYLOW(GPIOC_PIN3) | PIN_OSPEED_VERYLOW(GPIOC_PIN4) | PIN_OSPEED_VERYLOW(GPIOC_PIN5) | PIN_OSPEED_VERYLOW(GPIOC_PIN6) | PIN_OSPEED_VERYLOW(GPIOC_PIN7) | PIN_OSPEED_VERYLOW(GPIOC_PIN8) | PIN_OSPEED_VERYLOW(GPIOC_PIN9) | PIN_OSPEED_VERYLOW(GPIOC_PIN10) | PIN_OSPEED_VERYLOW(GPIOC_PIN11) | PIN_OSPEED_VERYLOW(GPIOC_PIN12) | PIN_OSPEED_VERYLOW(GPIOC_PIN13) | PIN_OSPEED_HIGH(GPIOC_PIN14) | PIN_OSPEED_HIGH(GPIOC_PIN15))
PIN_MODE_INPUT(GPIOC_PIN3) | \ #define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | PIN_PUPDR_PULLUP(GPIOC_PIN1) | PIN_PUPDR_PULLUP(GPIOC_PIN2) | PIN_PUPDR_PULLUP(GPIOC_PIN3) | PIN_PUPDR_PULLUP(GPIOC_PIN4) | PIN_PUPDR_PULLUP(GPIOC_PIN5) | PIN_PUPDR_PULLUP(GPIOC_PIN6) | PIN_PUPDR_PULLUP(GPIOC_PIN7) | PIN_PUPDR_PULLUP(GPIOC_PIN8) | PIN_PUPDR_PULLUP(GPIOC_PIN9) | PIN_PUPDR_PULLUP(GPIOC_PIN10) | PIN_PUPDR_PULLUP(GPIOC_PIN11) | PIN_PUPDR_PULLUP(GPIOC_PIN12) | PIN_PUPDR_PULLUP(GPIOC_PIN13) | PIN_PUPDR_FLOATING(GPIOC_PIN14) | PIN_PUPDR_FLOATING(GPIOC_PIN15))
PIN_MODE_INPUT(GPIOC_PIN4) | \ #define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | PIN_ODR_HIGH(GPIOC_PIN1) | PIN_ODR_HIGH(GPIOC_PIN2) | PIN_ODR_HIGH(GPIOC_PIN3) | PIN_ODR_HIGH(GPIOC_PIN4) | PIN_ODR_HIGH(GPIOC_PIN5) | PIN_ODR_HIGH(GPIOC_PIN6) | PIN_ODR_HIGH(GPIOC_PIN7) | PIN_ODR_HIGH(GPIOC_PIN8) | PIN_ODR_HIGH(GPIOC_PIN9) | PIN_ODR_HIGH(GPIOC_PIN10) | PIN_ODR_HIGH(GPIOC_PIN11) | PIN_ODR_HIGH(GPIOC_PIN12) | PIN_ODR_HIGH(GPIOC_PIN13) | PIN_ODR_HIGH(GPIOC_PIN14) | PIN_ODR_HIGH(GPIOC_PIN15))
PIN_MODE_INPUT(GPIOC_PIN5) | \ #define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | PIN_AFIO_AF(GPIOC_PIN1, 0) | PIN_AFIO_AF(GPIOC_PIN2, 0) | PIN_AFIO_AF(GPIOC_PIN3, 0) | PIN_AFIO_AF(GPIOC_PIN4, 0) | PIN_AFIO_AF(GPIOC_PIN5, 0) | PIN_AFIO_AF(GPIOC_PIN6, 0) | PIN_AFIO_AF(GPIOC_PIN7, 0))
PIN_MODE_INPUT(GPIOC_PIN6) | \ #define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | PIN_AFIO_AF(GPIOC_PIN9, 0) | PIN_AFIO_AF(GPIOC_PIN10, 0) | PIN_AFIO_AF(GPIOC_PIN11, 0) | PIN_AFIO_AF(GPIOC_PIN12, 0) | PIN_AFIO_AF(GPIOC_PIN13, 0) | PIN_AFIO_AF(GPIOC_PIN14, 0) | PIN_AFIO_AF(GPIOC_PIN15, 0))
PIN_MODE_INPUT(GPIOC_PIN7) | \
PIN_MODE_INPUT(GPIOC_PIN8) | \
PIN_MODE_INPUT(GPIOC_PIN9) | \
PIN_MODE_INPUT(GPIOC_PIN10) | \
PIN_MODE_INPUT(GPIOC_PIN11) | \
PIN_MODE_INPUT(GPIOC_PIN12) | \
PIN_MODE_INPUT(GPIOC_PIN13) | \
PIN_MODE_INPUT(GPIOC_PIN14) | \
PIN_MODE_INPUT(GPIOC_PIN15))
#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOC_PIN15))
#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
PIN_OSPEED_HIGH(GPIOC_PIN14) | \
PIN_OSPEED_HIGH(GPIOC_PIN15))
#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \
PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
PIN_PUPDR_PULLUP(GPIOC_PIN6) | \
PIN_PUPDR_PULLUP(GPIOC_PIN7) | \
PIN_PUPDR_PULLUP(GPIOC_PIN8) | \
PIN_PUPDR_PULLUP(GPIOC_PIN9) | \
PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
PIN_PUPDR_FLOATING(GPIOC_PIN14) | \
PIN_PUPDR_FLOATING(GPIOC_PIN15))
#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \
PIN_ODR_HIGH(GPIOC_PIN1) | \
PIN_ODR_HIGH(GPIOC_PIN2) | \
PIN_ODR_HIGH(GPIOC_PIN3) | \
PIN_ODR_HIGH(GPIOC_PIN4) | \
PIN_ODR_HIGH(GPIOC_PIN5) | \
PIN_ODR_HIGH(GPIOC_PIN6) | \
PIN_ODR_HIGH(GPIOC_PIN7) | \
PIN_ODR_HIGH(GPIOC_PIN8) | \
PIN_ODR_HIGH(GPIOC_PIN9) | \
PIN_ODR_HIGH(GPIOC_PIN10) | \
PIN_ODR_HIGH(GPIOC_PIN11) | \
PIN_ODR_HIGH(GPIOC_PIN12) | \
PIN_ODR_HIGH(GPIOC_PIN13) | \
PIN_ODR_HIGH(GPIOC_PIN14) | \
PIN_ODR_HIGH(GPIOC_PIN15))
#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \
PIN_AFIO_AF(GPIOC_PIN1, 0) | \
PIN_AFIO_AF(GPIOC_PIN2, 0) | \
PIN_AFIO_AF(GPIOC_PIN3, 0) | \
PIN_AFIO_AF(GPIOC_PIN4, 0) | \
PIN_AFIO_AF(GPIOC_PIN5, 0) | \
PIN_AFIO_AF(GPIOC_PIN6, 0) | \
PIN_AFIO_AF(GPIOC_PIN7, 0))
#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \
PIN_AFIO_AF(GPIOC_PIN9, 0) | \
PIN_AFIO_AF(GPIOC_PIN10, 0) | \
PIN_AFIO_AF(GPIOC_PIN11, 0) | \
PIN_AFIO_AF(GPIOC_PIN12, 0) | \
PIN_AFIO_AF(GPIOC_PIN13, 0) | \
PIN_AFIO_AF(GPIOC_PIN14, 0) | \
PIN_AFIO_AF(GPIOC_PIN15, 0))
/* /*
* GPIOD setup: * GPIOD setup:
@ -595,102 +327,13 @@
* PD14 - PIN14 (input pullup). * PD14 - PIN14 (input pullup).
* PD15 - PIN15 (input pullup). * PD15 - PIN15 (input pullup).
*/ */
#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ #define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | PIN_MODE_INPUT(GPIOD_PIN1) | PIN_MODE_INPUT(GPIOD_PIN2) | PIN_MODE_INPUT(GPIOD_PIN3) | PIN_MODE_INPUT(GPIOD_PIN4) | PIN_MODE_INPUT(GPIOD_PIN5) | PIN_MODE_INPUT(GPIOD_PIN6) | PIN_MODE_INPUT(GPIOD_PIN7) | PIN_MODE_INPUT(GPIOD_PIN8) | PIN_MODE_INPUT(GPIOD_PIN9) | PIN_MODE_INPUT(GPIOD_PIN10) | PIN_MODE_INPUT(GPIOD_PIN11) | PIN_MODE_INPUT(GPIOD_PIN12) | PIN_MODE_INPUT(GPIOD_PIN13) | PIN_MODE_INPUT(GPIOD_PIN14) | PIN_MODE_INPUT(GPIOD_PIN15))
PIN_MODE_INPUT(GPIOD_PIN1) | \ #define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
PIN_MODE_INPUT(GPIOD_PIN2) | \ #define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | PIN_OSPEED_VERYLOW(GPIOD_PIN1) | PIN_OSPEED_VERYLOW(GPIOD_PIN2) | PIN_OSPEED_VERYLOW(GPIOD_PIN3) | PIN_OSPEED_VERYLOW(GPIOD_PIN4) | PIN_OSPEED_VERYLOW(GPIOD_PIN5) | PIN_OSPEED_VERYLOW(GPIOD_PIN6) | PIN_OSPEED_VERYLOW(GPIOD_PIN7) | PIN_OSPEED_VERYLOW(GPIOD_PIN8) | PIN_OSPEED_VERYLOW(GPIOD_PIN9) | PIN_OSPEED_VERYLOW(GPIOD_PIN10) | PIN_OSPEED_VERYLOW(GPIOD_PIN11) | PIN_OSPEED_VERYLOW(GPIOD_PIN12) | PIN_OSPEED_VERYLOW(GPIOD_PIN13) | PIN_OSPEED_VERYLOW(GPIOD_PIN14) | PIN_OSPEED_VERYLOW(GPIOD_PIN15))
PIN_MODE_INPUT(GPIOD_PIN3) | \ #define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | PIN_PUPDR_PULLUP(GPIOD_PIN1) | PIN_PUPDR_PULLUP(GPIOD_PIN2) | PIN_PUPDR_PULLUP(GPIOD_PIN3) | PIN_PUPDR_PULLUP(GPIOD_PIN4) | PIN_PUPDR_PULLUP(GPIOD_PIN5) | PIN_PUPDR_PULLUP(GPIOD_PIN6) | PIN_PUPDR_PULLUP(GPIOD_PIN7) | PIN_PUPDR_PULLUP(GPIOD_PIN8) | PIN_PUPDR_PULLUP(GPIOD_PIN9) | PIN_PUPDR_PULLUP(GPIOD_PIN10) | PIN_PUPDR_PULLUP(GPIOD_PIN11) | PIN_PUPDR_PULLUP(GPIOD_PIN12) | PIN_PUPDR_PULLUP(GPIOD_PIN13) | PIN_PUPDR_PULLUP(GPIOD_PIN14) | PIN_PUPDR_PULLUP(GPIOD_PIN15))
PIN_MODE_INPUT(GPIOD_PIN4) | \ #define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | PIN_ODR_HIGH(GPIOD_PIN1) | PIN_ODR_HIGH(GPIOD_PIN2) | PIN_ODR_HIGH(GPIOD_PIN3) | PIN_ODR_HIGH(GPIOD_PIN4) | PIN_ODR_HIGH(GPIOD_PIN5) | PIN_ODR_HIGH(GPIOD_PIN6) | PIN_ODR_HIGH(GPIOD_PIN7) | PIN_ODR_HIGH(GPIOD_PIN8) | PIN_ODR_HIGH(GPIOD_PIN9) | PIN_ODR_HIGH(GPIOD_PIN10) | PIN_ODR_HIGH(GPIOD_PIN11) | PIN_ODR_HIGH(GPIOD_PIN12) | PIN_ODR_HIGH(GPIOD_PIN13) | PIN_ODR_HIGH(GPIOD_PIN14) | PIN_ODR_HIGH(GPIOD_PIN15))
PIN_MODE_INPUT(GPIOD_PIN5) | \ #define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | PIN_AFIO_AF(GPIOD_PIN1, 0) | PIN_AFIO_AF(GPIOD_PIN2, 0) | PIN_AFIO_AF(GPIOD_PIN3, 0) | PIN_AFIO_AF(GPIOD_PIN4, 0) | PIN_AFIO_AF(GPIOD_PIN5, 0) | PIN_AFIO_AF(GPIOD_PIN6, 0) | PIN_AFIO_AF(GPIOD_PIN7, 0))
PIN_MODE_INPUT(GPIOD_PIN6) | \ #define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | PIN_AFIO_AF(GPIOD_PIN9, 0) | PIN_AFIO_AF(GPIOD_PIN10, 0) | PIN_AFIO_AF(GPIOD_PIN11, 0) | PIN_AFIO_AF(GPIOD_PIN12, 0) | PIN_AFIO_AF(GPIOD_PIN13, 0) | PIN_AFIO_AF(GPIOD_PIN14, 0) | PIN_AFIO_AF(GPIOD_PIN15, 0))
PIN_MODE_INPUT(GPIOD_PIN7) | \
PIN_MODE_INPUT(GPIOD_PIN8) | \
PIN_MODE_INPUT(GPIOD_PIN9) | \
PIN_MODE_INPUT(GPIOD_PIN10) | \
PIN_MODE_INPUT(GPIOD_PIN11) | \
PIN_MODE_INPUT(GPIOD_PIN12) | \
PIN_MODE_INPUT(GPIOD_PIN13) | \
PIN_MODE_INPUT(GPIOD_PIN14) | \
PIN_MODE_INPUT(GPIOD_PIN15))
#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
PIN_OSPEED_VERYLOW(GPIOD_PIN15))
#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
PIN_PUPDR_PULLUP(GPIOD_PIN15))
#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
PIN_ODR_HIGH(GPIOD_PIN1) | \
PIN_ODR_HIGH(GPIOD_PIN2) | \
PIN_ODR_HIGH(GPIOD_PIN3) | \
PIN_ODR_HIGH(GPIOD_PIN4) | \
PIN_ODR_HIGH(GPIOD_PIN5) | \
PIN_ODR_HIGH(GPIOD_PIN6) | \
PIN_ODR_HIGH(GPIOD_PIN7) | \
PIN_ODR_HIGH(GPIOD_PIN8) | \
PIN_ODR_HIGH(GPIOD_PIN9) | \
PIN_ODR_HIGH(GPIOD_PIN10) | \
PIN_ODR_HIGH(GPIOD_PIN11) | \
PIN_ODR_HIGH(GPIOD_PIN12) | \
PIN_ODR_HIGH(GPIOD_PIN13) | \
PIN_ODR_HIGH(GPIOD_PIN14) | \
PIN_ODR_HIGH(GPIOD_PIN15))
#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \
PIN_AFIO_AF(GPIOD_PIN1, 0) | \
PIN_AFIO_AF(GPIOD_PIN2, 0) | \
PIN_AFIO_AF(GPIOD_PIN3, 0) | \
PIN_AFIO_AF(GPIOD_PIN4, 0) | \
PIN_AFIO_AF(GPIOD_PIN5, 0) | \
PIN_AFIO_AF(GPIOD_PIN6, 0) | \
PIN_AFIO_AF(GPIOD_PIN7, 0))
#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \
PIN_AFIO_AF(GPIOD_PIN9, 0) | \
PIN_AFIO_AF(GPIOD_PIN10, 0) | \
PIN_AFIO_AF(GPIOD_PIN11, 0) | \
PIN_AFIO_AF(GPIOD_PIN12, 0) | \
PIN_AFIO_AF(GPIOD_PIN13, 0) | \
PIN_AFIO_AF(GPIOD_PIN14, 0) | \
PIN_AFIO_AF(GPIOD_PIN15, 0))
/* /*
* GPIOE setup: * GPIOE setup:
@ -712,102 +355,13 @@
* PE14 - PIN14 (output pushpull maximum). * PE14 - PIN14 (output pushpull maximum).
* PE15 - PIN15 (output pushpull maximum). * PE15 - PIN15 (output pushpull maximum).
*/ */
#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ #define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | PIN_MODE_INPUT(GPIOE_PIN1) | PIN_MODE_INPUT(GPIOE_PIN2) | PIN_MODE_OUTPUT(GPIOE_PIN3) | PIN_MODE_INPUT(GPIOE_PIN4) | PIN_MODE_INPUT(GPIOE_PIN5) | PIN_MODE_INPUT(GPIOE_PIN6) | PIN_MODE_INPUT(GPIOE_PIN7) | PIN_MODE_OUTPUT(GPIOE_PIN8) | PIN_MODE_OUTPUT(GPIOE_PIN9) | PIN_MODE_OUTPUT(GPIOE_PIN10) | PIN_MODE_OUTPUT(GPIOE_PIN11) | PIN_MODE_OUTPUT(GPIOE_PIN12) | PIN_MODE_OUTPUT(GPIOE_PIN13) | PIN_MODE_OUTPUT(GPIOE_PIN14) | PIN_MODE_OUTPUT(GPIOE_PIN15))
PIN_MODE_INPUT(GPIOE_PIN1) | \ #define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
PIN_MODE_INPUT(GPIOE_PIN2) |\ #define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | PIN_OSPEED_VERYLOW(GPIOE_PIN1) | PIN_OSPEED_VERYLOW(GPIOE_PIN2) | PIN_OSPEED_HIGH(GPIOE_PIN3) | PIN_OSPEED_VERYLOW(GPIOE_PIN4) | PIN_OSPEED_VERYLOW(GPIOE_PIN5) | PIN_OSPEED_VERYLOW(GPIOE_PIN6) | PIN_OSPEED_VERYLOW(GPIOE_PIN7) | PIN_OSPEED_HIGH(GPIOE_PIN8) | PIN_OSPEED_HIGH(GPIOE_PIN9) | PIN_OSPEED_HIGH(GPIOE_PIN10) | PIN_OSPEED_HIGH(GPIOE_PIN11) | PIN_OSPEED_HIGH(GPIOE_PIN12) | PIN_OSPEED_HIGH(GPIOE_PIN13) | PIN_OSPEED_HIGH(GPIOE_PIN14) | PIN_OSPEED_HIGH(GPIOE_PIN15))
PIN_MODE_OUTPUT(GPIOE_PIN3) | \ #define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | PIN_PUPDR_PULLUP(GPIOE_PIN1) | PIN_PUPDR_PULLUP(GPIOE_PIN2) | PIN_PUPDR_FLOATING(GPIOE_PIN3) | PIN_PUPDR_PULLUP(GPIOE_PIN4) | PIN_PUPDR_PULLUP(GPIOE_PIN5) | PIN_PUPDR_PULLUP(GPIOE_PIN6) | PIN_PUPDR_PULLUP(GPIOE_PIN7) | PIN_PUPDR_PULLUP(GPIOE_PIN8) | PIN_PUPDR_PULLUP(GPIOE_PIN9) | PIN_PUPDR_PULLUP(GPIOE_PIN10) | PIN_PUPDR_FLOATING(GPIOE_PIN11) | PIN_PUPDR_PULLUP(GPIOE_PIN12) | PIN_PUPDR_FLOATING(GPIOE_PIN13) | PIN_PUPDR_FLOATING(GPIOE_PIN14) | PIN_PUPDR_FLOATING(GPIOE_PIN15))
PIN_MODE_INPUT(GPIOE_PIN4) |\ #define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | PIN_ODR_HIGH(GPIOE_PIN1) | PIN_ODR_HIGH(GPIOE_PIN2) | PIN_ODR_HIGH(GPIOE_PIN3) | PIN_ODR_HIGH(GPIOE_PIN4) | PIN_ODR_HIGH(GPIOE_PIN5) | PIN_ODR_HIGH(GPIOE_PIN6) | PIN_ODR_HIGH(GPIOE_PIN7) | PIN_ODR_LOW(GPIOE_PIN8) | PIN_ODR_LOW(GPIOE_PIN9) | PIN_ODR_LOW(GPIOE_PIN10) | PIN_ODR_LOW(GPIOE_PIN11) | PIN_ODR_LOW(GPIOE_PIN12) | PIN_ODR_LOW(GPIOE_PIN13) | PIN_ODR_LOW(GPIOE_PIN14) | PIN_ODR_LOW(GPIOE_PIN15))
PIN_MODE_INPUT(GPIOE_PIN5) |\ #define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | PIN_AFIO_AF(GPIOE_PIN1, 0) | PIN_AFIO_AF(GPIOE_PIN2, 0) | PIN_AFIO_AF(GPIOE_PIN3, 0) | PIN_AFIO_AF(GPIOE_PIN4, 0) | PIN_AFIO_AF(GPIOE_PIN5, 0) | PIN_AFIO_AF(GPIOE_PIN6, 0) | PIN_AFIO_AF(GPIOE_PIN7, 0))
PIN_MODE_INPUT(GPIOE_PIN6) | \ #define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | PIN_AFIO_AF(GPIOE_PIN9, 0) | PIN_AFIO_AF(GPIOE_PIN10, 0) | PIN_AFIO_AF(GPIOE_PIN11, 0) | PIN_AFIO_AF(GPIOE_PIN12, 0) | PIN_AFIO_AF(GPIOE_PIN13, 0) | PIN_AFIO_AF(GPIOE_PIN14, 0) | PIN_AFIO_AF(GPIOE_PIN15, 0))
PIN_MODE_INPUT(GPIOE_PIN7) | \
PIN_MODE_OUTPUT(GPIOE_PIN8) | \
PIN_MODE_OUTPUT(GPIOE_PIN9) | \
PIN_MODE_OUTPUT(GPIOE_PIN10) | \
PIN_MODE_OUTPUT(GPIOE_PIN11) | \
PIN_MODE_OUTPUT(GPIOE_PIN12) | \
PIN_MODE_OUTPUT(GPIOE_PIN13) | \
PIN_MODE_OUTPUT(GPIOE_PIN14) | \
PIN_MODE_OUTPUT(GPIOE_PIN15))
#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\
PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\
PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\
PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\
PIN_OSPEED_HIGH(GPIOE_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\
PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\
PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
PIN_OSPEED_HIGH(GPIOE_PIN8) | \
PIN_OSPEED_HIGH(GPIOE_PIN9) | \
PIN_OSPEED_HIGH(GPIOE_PIN10) | \
PIN_OSPEED_HIGH(GPIOE_PIN11) | \
PIN_OSPEED_HIGH(GPIOE_PIN12) | \
PIN_OSPEED_HIGH(GPIOE_PIN13) | \
PIN_OSPEED_HIGH(GPIOE_PIN14) | \
PIN_OSPEED_HIGH(GPIOE_PIN15))
#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
PIN_PUPDR_PULLUP(GPIOE_PIN2) |\
PIN_PUPDR_FLOATING(GPIOE_PIN3) | \
PIN_PUPDR_PULLUP(GPIOE_PIN4) |\
PIN_PUPDR_PULLUP(GPIOE_PIN5) |\
PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
PIN_PUPDR_FLOATING(GPIOE_PIN11) | \
PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
PIN_PUPDR_FLOATING(GPIOE_PIN13) | \
PIN_PUPDR_FLOATING(GPIOE_PIN14) |\
PIN_PUPDR_FLOATING(GPIOE_PIN15))
#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
PIN_ODR_HIGH(GPIOE_PIN1) | \
PIN_ODR_HIGH(GPIOE_PIN2) | \
PIN_ODR_HIGH(GPIOE_PIN3) | \
PIN_ODR_HIGH(GPIOE_PIN4) | \
PIN_ODR_HIGH(GPIOE_PIN5) | \
PIN_ODR_HIGH(GPIOE_PIN6) | \
PIN_ODR_HIGH(GPIOE_PIN7) | \
PIN_ODR_LOW(GPIOE_PIN8) | \
PIN_ODR_LOW(GPIOE_PIN9) | \
PIN_ODR_LOW(GPIOE_PIN10) | \
PIN_ODR_LOW(GPIOE_PIN11) | \
PIN_ODR_LOW(GPIOE_PIN12) | \
PIN_ODR_LOW(GPIOE_PIN13) | \
PIN_ODR_LOW(GPIOE_PIN14) | \
PIN_ODR_LOW(GPIOE_PIN15))
#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \
PIN_AFIO_AF(GPIOE_PIN1, 0) | \
PIN_AFIO_AF(GPIOE_PIN2, 0) |\
PIN_AFIO_AF(GPIOE_PIN3, 0) | \
PIN_AFIO_AF(GPIOE_PIN4, 0) |\
PIN_AFIO_AF(GPIOE_PIN5, 0) |\
PIN_AFIO_AF(GPIOE_PIN6, 0) | \
PIN_AFIO_AF(GPIOE_PIN7, 0))
#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \
PIN_AFIO_AF(GPIOE_PIN9, 0) | \
PIN_AFIO_AF(GPIOE_PIN10, 0) | \
PIN_AFIO_AF(GPIOE_PIN11, 0) | \
PIN_AFIO_AF(GPIOE_PIN12, 0) | \
PIN_AFIO_AF(GPIOE_PIN13, 0) | \
PIN_AFIO_AF(GPIOE_PIN14, 0) | \
PIN_AFIO_AF(GPIOE_PIN15, 0))
/* /*
* GPIOF setup: * GPIOF setup:
@ -829,102 +383,13 @@
* PF14 - PIN14 (input pullup). * PF14 - PIN14 (input pullup).
* PF15 - PIN15 (input pullup). * PF15 - PIN15 (input pullup).
*/ */
#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ #define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | PIN_MODE_INPUT(GPIOF_I2C2_SCL) | PIN_MODE_INPUT(GPIOF_PIN2) | PIN_MODE_INPUT(GPIOF_PIN3) | PIN_MODE_INPUT(GPIOF_PIN4) | PIN_MODE_INPUT(GPIOF_PIN5) | PIN_MODE_INPUT(GPIOF_PIN6) | PIN_MODE_INPUT(GPIOF_PIN7) | PIN_MODE_INPUT(GPIOF_PIN8) | PIN_MODE_INPUT(GPIOF_PIN9) | PIN_MODE_INPUT(GPIOF_PIN10) | PIN_MODE_INPUT(GPIOF_PIN11) | PIN_MODE_INPUT(GPIOF_PIN12) | PIN_MODE_INPUT(GPIOF_PIN13) | PIN_MODE_INPUT(GPIOF_PIN14) | PIN_MODE_INPUT(GPIOF_PIN15))
PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ #define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
PIN_MODE_INPUT(GPIOF_PIN2) | \ #define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | PIN_OSPEED_VERYLOW(GPIOF_PIN2) | PIN_OSPEED_VERYLOW(GPIOF_PIN3) | PIN_OSPEED_VERYLOW(GPIOF_PIN4) | PIN_OSPEED_VERYLOW(GPIOF_PIN5) | PIN_OSPEED_VERYLOW(GPIOF_PIN6) | PIN_OSPEED_VERYLOW(GPIOF_PIN7) | PIN_OSPEED_VERYLOW(GPIOF_PIN8) | PIN_OSPEED_VERYLOW(GPIOF_PIN9) | PIN_OSPEED_VERYLOW(GPIOF_PIN10) | PIN_OSPEED_VERYLOW(GPIOF_PIN11) | PIN_OSPEED_VERYLOW(GPIOF_PIN12) | PIN_OSPEED_VERYLOW(GPIOF_PIN13) | PIN_OSPEED_VERYLOW(GPIOF_PIN14) | PIN_OSPEED_VERYLOW(GPIOF_PIN15))
PIN_MODE_INPUT(GPIOF_PIN3) | \ #define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | PIN_PUPDR_PULLUP(GPIOF_PIN2) | PIN_PUPDR_PULLUP(GPIOF_PIN3) | PIN_PUPDR_PULLUP(GPIOF_PIN4) | PIN_PUPDR_PULLUP(GPIOF_PIN5) | PIN_PUPDR_PULLUP(GPIOF_PIN6) | PIN_PUPDR_PULLUP(GPIOF_PIN7) | PIN_PUPDR_PULLUP(GPIOF_PIN8) | PIN_PUPDR_PULLUP(GPIOF_PIN9) | PIN_PUPDR_PULLUP(GPIOF_PIN10) | PIN_PUPDR_PULLUP(GPIOF_PIN11) | PIN_PUPDR_PULLUP(GPIOF_PIN12) | PIN_PUPDR_PULLUP(GPIOF_PIN13) | PIN_PUPDR_PULLUP(GPIOF_PIN14) | PIN_PUPDR_PULLUP(GPIOF_PIN15))
PIN_MODE_INPUT(GPIOF_PIN4) | \ #define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | PIN_ODR_HIGH(GPIOF_I2C2_SCL) | PIN_ODR_HIGH(GPIOF_PIN2) | PIN_ODR_HIGH(GPIOF_PIN3) | PIN_ODR_HIGH(GPIOF_PIN4) | PIN_ODR_HIGH(GPIOF_PIN5) | PIN_ODR_HIGH(GPIOF_PIN6) | PIN_ODR_HIGH(GPIOF_PIN7) | PIN_ODR_HIGH(GPIOF_PIN8) | PIN_ODR_HIGH(GPIOF_PIN9) | PIN_ODR_HIGH(GPIOF_PIN10) | PIN_ODR_HIGH(GPIOF_PIN11) | PIN_ODR_HIGH(GPIOF_PIN12) | PIN_ODR_HIGH(GPIOF_PIN13) | PIN_ODR_HIGH(GPIOF_PIN14) | PIN_ODR_HIGH(GPIOF_PIN15))
PIN_MODE_INPUT(GPIOF_PIN5) | \ #define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | PIN_AFIO_AF(GPIOF_PIN2, 0) | PIN_AFIO_AF(GPIOF_PIN3, 0) | PIN_AFIO_AF(GPIOF_PIN4, 0) | PIN_AFIO_AF(GPIOF_PIN5, 0) | PIN_AFIO_AF(GPIOF_PIN6, 0) | PIN_AFIO_AF(GPIOF_PIN7, 0))
PIN_MODE_INPUT(GPIOF_PIN6) | \ #define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | PIN_AFIO_AF(GPIOF_PIN9, 0) | PIN_AFIO_AF(GPIOF_PIN10, 0) | PIN_AFIO_AF(GPIOF_PIN11, 0) | PIN_AFIO_AF(GPIOF_PIN12, 0) | PIN_AFIO_AF(GPIOF_PIN13, 0) | PIN_AFIO_AF(GPIOF_PIN14, 0) | PIN_AFIO_AF(GPIOF_PIN15, 0))
PIN_MODE_INPUT(GPIOF_PIN7) | \
PIN_MODE_INPUT(GPIOF_PIN8) | \
PIN_MODE_INPUT(GPIOF_PIN9) | \
PIN_MODE_INPUT(GPIOF_PIN10) | \
PIN_MODE_INPUT(GPIOF_PIN11) | \
PIN_MODE_INPUT(GPIOF_PIN12) | \
PIN_MODE_INPUT(GPIOF_PIN13) | \
PIN_MODE_INPUT(GPIOF_PIN14) | \
PIN_MODE_INPUT(GPIOF_PIN15))
#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \
PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \
PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
PIN_OSPEED_VERYLOW(GPIOF_PIN15))
#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \
PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \
PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
PIN_PUPDR_PULLUP(GPIOF_PIN15))
#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \
PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \
PIN_ODR_HIGH(GPIOF_PIN2) | \
PIN_ODR_HIGH(GPIOF_PIN3) | \
PIN_ODR_HIGH(GPIOF_PIN4) | \
PIN_ODR_HIGH(GPIOF_PIN5) | \
PIN_ODR_HIGH(GPIOF_PIN6) | \
PIN_ODR_HIGH(GPIOF_PIN7) | \
PIN_ODR_HIGH(GPIOF_PIN8) | \
PIN_ODR_HIGH(GPIOF_PIN9) | \
PIN_ODR_HIGH(GPIOF_PIN10) | \
PIN_ODR_HIGH(GPIOF_PIN11) | \
PIN_ODR_HIGH(GPIOF_PIN12) | \
PIN_ODR_HIGH(GPIOF_PIN13) | \
PIN_ODR_HIGH(GPIOF_PIN14) | \
PIN_ODR_HIGH(GPIOF_PIN15))
#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \
PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \
PIN_AFIO_AF(GPIOF_PIN2, 0) | \
PIN_AFIO_AF(GPIOF_PIN3, 0) | \
PIN_AFIO_AF(GPIOF_PIN4, 0) | \
PIN_AFIO_AF(GPIOF_PIN5, 0) | \
PIN_AFIO_AF(GPIOF_PIN6, 0) | \
PIN_AFIO_AF(GPIOF_PIN7, 0))
#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \
PIN_AFIO_AF(GPIOF_PIN9, 0) | \
PIN_AFIO_AF(GPIOF_PIN10, 0) | \
PIN_AFIO_AF(GPIOF_PIN11, 0) | \
PIN_AFIO_AF(GPIOF_PIN12, 0) | \
PIN_AFIO_AF(GPIOF_PIN13, 0) | \
PIN_AFIO_AF(GPIOF_PIN14, 0) | \
PIN_AFIO_AF(GPIOF_PIN15, 0))
/* /*
* GPIOG setup: * GPIOG setup:
@ -946,102 +411,13 @@
* PG14 - PIN14 (input pullup). * PG14 - PIN14 (input pullup).
* PG15 - PIN15 (input pullup). * PG15 - PIN15 (input pullup).
*/ */
#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ #define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | PIN_MODE_INPUT(GPIOG_PIN1) | PIN_MODE_INPUT(GPIOG_PIN2) | PIN_MODE_INPUT(GPIOG_PIN3) | PIN_MODE_INPUT(GPIOG_PIN4) | PIN_MODE_INPUT(GPIOG_PIN5) | PIN_MODE_INPUT(GPIOG_PIN6) | PIN_MODE_INPUT(GPIOG_PIN7) | PIN_MODE_INPUT(GPIOG_PIN8) | PIN_MODE_INPUT(GPIOG_PIN9) | PIN_MODE_INPUT(GPIOG_PIN10) | PIN_MODE_INPUT(GPIOG_PIN11) | PIN_MODE_INPUT(GPIOG_PIN12) | PIN_MODE_INPUT(GPIOG_PIN13) | PIN_MODE_INPUT(GPIOG_PIN14) | PIN_MODE_INPUT(GPIOG_PIN15))
PIN_MODE_INPUT(GPIOG_PIN1) | \ #define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | PIN_OTYPE_PUSHPULL(GPIOG_PIN15))
PIN_MODE_INPUT(GPIOG_PIN2) | \ #define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | PIN_OSPEED_VERYLOW(GPIOG_PIN1) | PIN_OSPEED_VERYLOW(GPIOG_PIN2) | PIN_OSPEED_VERYLOW(GPIOG_PIN3) | PIN_OSPEED_VERYLOW(GPIOG_PIN4) | PIN_OSPEED_VERYLOW(GPIOG_PIN5) | PIN_OSPEED_VERYLOW(GPIOG_PIN6) | PIN_OSPEED_VERYLOW(GPIOG_PIN7) | PIN_OSPEED_VERYLOW(GPIOG_PIN8) | PIN_OSPEED_VERYLOW(GPIOG_PIN9) | PIN_OSPEED_VERYLOW(GPIOG_PIN10) | PIN_OSPEED_VERYLOW(GPIOG_PIN11) | PIN_OSPEED_VERYLOW(GPIOG_PIN12) | PIN_OSPEED_VERYLOW(GPIOG_PIN13) | PIN_OSPEED_VERYLOW(GPIOG_PIN14) | PIN_OSPEED_VERYLOW(GPIOG_PIN15))
PIN_MODE_INPUT(GPIOG_PIN3) | \ #define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | PIN_PUPDR_PULLUP(GPIOG_PIN1) | PIN_PUPDR_PULLUP(GPIOG_PIN2) | PIN_PUPDR_PULLUP(GPIOG_PIN3) | PIN_PUPDR_PULLUP(GPIOG_PIN4) | PIN_PUPDR_PULLUP(GPIOG_PIN5) | PIN_PUPDR_PULLUP(GPIOG_PIN6) | PIN_PUPDR_PULLUP(GPIOG_PIN7) | PIN_PUPDR_PULLUP(GPIOG_PIN8) | PIN_PUPDR_PULLUP(GPIOG_PIN9) | PIN_PUPDR_PULLUP(GPIOG_PIN10) | PIN_PUPDR_PULLUP(GPIOG_PIN11) | PIN_PUPDR_PULLUP(GPIOG_PIN12) | PIN_PUPDR_PULLUP(GPIOG_PIN13) | PIN_PUPDR_PULLUP(GPIOG_PIN14) | PIN_PUPDR_PULLUP(GPIOG_PIN15))
PIN_MODE_INPUT(GPIOG_PIN4) | \ #define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | PIN_ODR_HIGH(GPIOG_PIN1) | PIN_ODR_HIGH(GPIOG_PIN2) | PIN_ODR_HIGH(GPIOG_PIN3) | PIN_ODR_HIGH(GPIOG_PIN4) | PIN_ODR_HIGH(GPIOG_PIN5) | PIN_ODR_HIGH(GPIOG_PIN6) | PIN_ODR_HIGH(GPIOG_PIN7) | PIN_ODR_HIGH(GPIOG_PIN8) | PIN_ODR_HIGH(GPIOG_PIN9) | PIN_ODR_HIGH(GPIOG_PIN10) | PIN_ODR_HIGH(GPIOG_PIN11) | PIN_ODR_HIGH(GPIOG_PIN12) | PIN_ODR_HIGH(GPIOG_PIN13) | PIN_ODR_HIGH(GPIOG_PIN14) | PIN_ODR_HIGH(GPIOG_PIN15))
PIN_MODE_INPUT(GPIOG_PIN5) | \ #define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | PIN_AFIO_AF(GPIOG_PIN1, 0) | PIN_AFIO_AF(GPIOG_PIN2, 0) | PIN_AFIO_AF(GPIOG_PIN3, 0) | PIN_AFIO_AF(GPIOG_PIN4, 0) | PIN_AFIO_AF(GPIOG_PIN5, 0) | PIN_AFIO_AF(GPIOG_PIN6, 0) | PIN_AFIO_AF(GPIOG_PIN7, 0))
PIN_MODE_INPUT(GPIOG_PIN6) | \ #define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | PIN_AFIO_AF(GPIOG_PIN9, 0) | PIN_AFIO_AF(GPIOG_PIN10, 0) | PIN_AFIO_AF(GPIOG_PIN11, 0) | PIN_AFIO_AF(GPIOG_PIN12, 0) | PIN_AFIO_AF(GPIOG_PIN13, 0) | PIN_AFIO_AF(GPIOG_PIN14, 0) | PIN_AFIO_AF(GPIOG_PIN15, 0))
PIN_MODE_INPUT(GPIOG_PIN7) | \
PIN_MODE_INPUT(GPIOG_PIN8) | \
PIN_MODE_INPUT(GPIOG_PIN9) | \
PIN_MODE_INPUT(GPIOG_PIN10) | \
PIN_MODE_INPUT(GPIOG_PIN11) | \
PIN_MODE_INPUT(GPIOG_PIN12) | \
PIN_MODE_INPUT(GPIOG_PIN13) | \
PIN_MODE_INPUT(GPIOG_PIN14) | \
PIN_MODE_INPUT(GPIOG_PIN15))
#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOG_PIN15))
#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \
PIN_OSPEED_VERYLOW(GPIOG_PIN15))
#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \
PIN_PUPDR_PULLUP(GPIOG_PIN1) | \
PIN_PUPDR_PULLUP(GPIOG_PIN2) | \
PIN_PUPDR_PULLUP(GPIOG_PIN3) | \
PIN_PUPDR_PULLUP(GPIOG_PIN4) | \
PIN_PUPDR_PULLUP(GPIOG_PIN5) | \
PIN_PUPDR_PULLUP(GPIOG_PIN6) | \
PIN_PUPDR_PULLUP(GPIOG_PIN7) | \
PIN_PUPDR_PULLUP(GPIOG_PIN8) | \
PIN_PUPDR_PULLUP(GPIOG_PIN9) | \
PIN_PUPDR_PULLUP(GPIOG_PIN10) | \
PIN_PUPDR_PULLUP(GPIOG_PIN11) | \
PIN_PUPDR_PULLUP(GPIOG_PIN12) | \
PIN_PUPDR_PULLUP(GPIOG_PIN13) | \
PIN_PUPDR_PULLUP(GPIOG_PIN14) | \
PIN_PUPDR_PULLUP(GPIOG_PIN15))
#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \
PIN_ODR_HIGH(GPIOG_PIN1) | \
PIN_ODR_HIGH(GPIOG_PIN2) | \
PIN_ODR_HIGH(GPIOG_PIN3) | \
PIN_ODR_HIGH(GPIOG_PIN4) | \
PIN_ODR_HIGH(GPIOG_PIN5) | \
PIN_ODR_HIGH(GPIOG_PIN6) | \
PIN_ODR_HIGH(GPIOG_PIN7) | \
PIN_ODR_HIGH(GPIOG_PIN8) | \
PIN_ODR_HIGH(GPIOG_PIN9) | \
PIN_ODR_HIGH(GPIOG_PIN10) | \
PIN_ODR_HIGH(GPIOG_PIN11) | \
PIN_ODR_HIGH(GPIOG_PIN12) | \
PIN_ODR_HIGH(GPIOG_PIN13) | \
PIN_ODR_HIGH(GPIOG_PIN14) | \
PIN_ODR_HIGH(GPIOG_PIN15))
#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \
PIN_AFIO_AF(GPIOG_PIN1, 0) | \
PIN_AFIO_AF(GPIOG_PIN2, 0) | \
PIN_AFIO_AF(GPIOG_PIN3, 0) | \
PIN_AFIO_AF(GPIOG_PIN4, 0) | \
PIN_AFIO_AF(GPIOG_PIN5, 0) | \
PIN_AFIO_AF(GPIOG_PIN6, 0) | \
PIN_AFIO_AF(GPIOG_PIN7, 0))
#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \
PIN_AFIO_AF(GPIOG_PIN9, 0) | \
PIN_AFIO_AF(GPIOG_PIN10, 0) | \
PIN_AFIO_AF(GPIOG_PIN11, 0) | \
PIN_AFIO_AF(GPIOG_PIN12, 0) | \
PIN_AFIO_AF(GPIOG_PIN13, 0) | \
PIN_AFIO_AF(GPIOG_PIN14, 0) | \
PIN_AFIO_AF(GPIOG_PIN15, 0))
/* /*
* GPIOH setup: * GPIOH setup:
@ -1063,103 +439,13 @@
* PH14 - PIN14 (input pullup). * PH14 - PIN14 (input pullup).
* PH15 - PIN15 (input pullup). * PH15 - PIN15 (input pullup).
*/ */
#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ #define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | PIN_MODE_INPUT(GPIOH_PIN1) | PIN_MODE_INPUT(GPIOH_PIN2) | PIN_MODE_INPUT(GPIOH_PIN3) | PIN_MODE_INPUT(GPIOH_PIN4) | PIN_MODE_INPUT(GPIOH_PIN5) | PIN_MODE_INPUT(GPIOH_PIN6) | PIN_MODE_INPUT(GPIOH_PIN7) | PIN_MODE_INPUT(GPIOH_PIN8) | PIN_MODE_INPUT(GPIOH_PIN9) | PIN_MODE_INPUT(GPIOH_PIN10) | PIN_MODE_INPUT(GPIOH_PIN11) | PIN_MODE_INPUT(GPIOH_PIN12) | PIN_MODE_INPUT(GPIOH_PIN13) | PIN_MODE_INPUT(GPIOH_PIN14) | PIN_MODE_INPUT(GPIOH_PIN15))
PIN_MODE_INPUT(GPIOH_PIN1) | \ #define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | PIN_OTYPE_PUSHPULL(GPIOH_PIN15))
PIN_MODE_INPUT(GPIOH_PIN2) | \ #define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | PIN_OSPEED_VERYLOW(GPIOH_PIN1) | PIN_OSPEED_VERYLOW(GPIOH_PIN2) | PIN_OSPEED_VERYLOW(GPIOH_PIN3) | PIN_OSPEED_VERYLOW(GPIOH_PIN4) | PIN_OSPEED_VERYLOW(GPIOH_PIN5) | PIN_OSPEED_VERYLOW(GPIOH_PIN6) | PIN_OSPEED_VERYLOW(GPIOH_PIN7) | PIN_OSPEED_VERYLOW(GPIOH_PIN8) | PIN_OSPEED_VERYLOW(GPIOH_PIN9) | PIN_OSPEED_VERYLOW(GPIOH_PIN10) | PIN_OSPEED_VERYLOW(GPIOH_PIN11) | PIN_OSPEED_VERYLOW(GPIOH_PIN12) | PIN_OSPEED_VERYLOW(GPIOH_PIN13) | PIN_OSPEED_VERYLOW(GPIOH_PIN14) | PIN_OSPEED_VERYLOW(GPIOH_PIN15))
PIN_MODE_INPUT(GPIOH_PIN3) | \ #define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | PIN_PUPDR_PULLUP(GPIOH_PIN1) | PIN_PUPDR_PULLUP(GPIOH_PIN2) | PIN_PUPDR_PULLUP(GPIOH_PIN3) | PIN_PUPDR_PULLUP(GPIOH_PIN4) | PIN_PUPDR_PULLUP(GPIOH_PIN5) | PIN_PUPDR_PULLUP(GPIOH_PIN6) | PIN_PUPDR_PULLUP(GPIOH_PIN7) | PIN_PUPDR_PULLUP(GPIOH_PIN8) | PIN_PUPDR_PULLUP(GPIOH_PIN9) | PIN_PUPDR_PULLUP(GPIOH_PIN10) | PIN_PUPDR_PULLUP(GPIOH_PIN11) | PIN_PUPDR_PULLUP(GPIOH_PIN12) | PIN_PUPDR_PULLUP(GPIOH_PIN13) | PIN_PUPDR_PULLUP(GPIOH_PIN14) | PIN_PUPDR_PULLUP(GPIOH_PIN15))
PIN_MODE_INPUT(GPIOH_PIN4) | \ #define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | PIN_ODR_HIGH(GPIOH_PIN1) | PIN_ODR_HIGH(GPIOH_PIN2) | PIN_ODR_HIGH(GPIOH_PIN3) | PIN_ODR_HIGH(GPIOH_PIN4) | PIN_ODR_HIGH(GPIOH_PIN5) | PIN_ODR_HIGH(GPIOH_PIN6) | PIN_ODR_HIGH(GPIOH_PIN7) | PIN_ODR_HIGH(GPIOH_PIN8) | PIN_ODR_HIGH(GPIOH_PIN9) | PIN_ODR_HIGH(GPIOH_PIN10) | PIN_ODR_HIGH(GPIOH_PIN11) | PIN_ODR_HIGH(GPIOH_PIN12) | PIN_ODR_HIGH(GPIOH_PIN13) | PIN_ODR_HIGH(GPIOH_PIN14) | PIN_ODR_HIGH(GPIOH_PIN15))
PIN_MODE_INPUT(GPIOH_PIN5) | \ #define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | PIN_AFIO_AF(GPIOH_PIN1, 0) | PIN_AFIO_AF(GPIOH_PIN2, 0) | PIN_AFIO_AF(GPIOH_PIN3, 0) | PIN_AFIO_AF(GPIOH_PIN4, 0) | PIN_AFIO_AF(GPIOH_PIN5, 0) | PIN_AFIO_AF(GPIOH_PIN6, 0) | PIN_AFIO_AF(GPIOH_PIN7, 0))
PIN_MODE_INPUT(GPIOH_PIN6) | \ #define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | PIN_AFIO_AF(GPIOH_PIN9, 0) | PIN_AFIO_AF(GPIOH_PIN10, 0) | PIN_AFIO_AF(GPIOH_PIN11, 0) | PIN_AFIO_AF(GPIOH_PIN12, 0) | PIN_AFIO_AF(GPIOH_PIN13, 0) | PIN_AFIO_AF(GPIOH_PIN14, 0) | PIN_AFIO_AF(GPIOH_PIN15, 0))
PIN_MODE_INPUT(GPIOH_PIN7) | \
PIN_MODE_INPUT(GPIOH_PIN8) | \
PIN_MODE_INPUT(GPIOH_PIN9) | \
PIN_MODE_INPUT(GPIOH_PIN10) | \
PIN_MODE_INPUT(GPIOH_PIN11) | \
PIN_MODE_INPUT(GPIOH_PIN12) | \
PIN_MODE_INPUT(GPIOH_PIN13) | \
PIN_MODE_INPUT(GPIOH_PIN14) | \
PIN_MODE_INPUT(GPIOH_PIN15))
#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \
PIN_OTYPE_PUSHPULL(GPIOH_PIN15))
#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \
PIN_OSPEED_VERYLOW(GPIOH_PIN15))
#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \
PIN_PUPDR_PULLUP(GPIOH_PIN1) | \
PIN_PUPDR_PULLUP(GPIOH_PIN2) | \
PIN_PUPDR_PULLUP(GPIOH_PIN3) | \
PIN_PUPDR_PULLUP(GPIOH_PIN4) | \
PIN_PUPDR_PULLUP(GPIOH_PIN5) | \
PIN_PUPDR_PULLUP(GPIOH_PIN6) | \
PIN_PUPDR_PULLUP(GPIOH_PIN7) | \
PIN_PUPDR_PULLUP(GPIOH_PIN8) | \
PIN_PUPDR_PULLUP(GPIOH_PIN9) | \
PIN_PUPDR_PULLUP(GPIOH_PIN10) | \
PIN_PUPDR_PULLUP(GPIOH_PIN11) | \
PIN_PUPDR_PULLUP(GPIOH_PIN12) | \
PIN_PUPDR_PULLUP(GPIOH_PIN13) | \
PIN_PUPDR_PULLUP(GPIOH_PIN14) | \
PIN_PUPDR_PULLUP(GPIOH_PIN15))
#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \
PIN_ODR_HIGH(GPIOH_PIN1) | \
PIN_ODR_HIGH(GPIOH_PIN2) | \
PIN_ODR_HIGH(GPIOH_PIN3) | \
PIN_ODR_HIGH(GPIOH_PIN4) | \
PIN_ODR_HIGH(GPIOH_PIN5) | \
PIN_ODR_HIGH(GPIOH_PIN6) | \
PIN_ODR_HIGH(GPIOH_PIN7) | \
PIN_ODR_HIGH(GPIOH_PIN8) | \
PIN_ODR_HIGH(GPIOH_PIN9) | \
PIN_ODR_HIGH(GPIOH_PIN10) | \
PIN_ODR_HIGH(GPIOH_PIN11) | \
PIN_ODR_HIGH(GPIOH_PIN12) | \
PIN_ODR_HIGH(GPIOH_PIN13) | \
PIN_ODR_HIGH(GPIOH_PIN14) | \
PIN_ODR_HIGH(GPIOH_PIN15))
#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \
PIN_AFIO_AF(GPIOH_PIN1, 0) | \
PIN_AFIO_AF(GPIOH_PIN2, 0) | \
PIN_AFIO_AF(GPIOH_PIN3, 0) | \
PIN_AFIO_AF(GPIOH_PIN4, 0) | \
PIN_AFIO_AF(GPIOH_PIN5, 0) | \
PIN_AFIO_AF(GPIOH_PIN6, 0) | \
PIN_AFIO_AF(GPIOH_PIN7, 0))
#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \
PIN_AFIO_AF(GPIOH_PIN9, 0) | \
PIN_AFIO_AF(GPIOH_PIN10, 0) | \
PIN_AFIO_AF(GPIOH_PIN11, 0) | \
PIN_AFIO_AF(GPIOH_PIN12, 0) | \
PIN_AFIO_AF(GPIOH_PIN13, 0) | \
PIN_AFIO_AF(GPIOH_PIN14, 0) | \
PIN_AFIO_AF(GPIOH_PIN15, 0))
/* /*
* USB bus activation macro, required by the USB driver. * USB bus activation macro, required by the USB driver.
@ -1171,17 +457,19 @@
* USB bus de-activation macro, required by the USB driver. * USB bus de-activation macro, required by the USB driver.
*/ */
// #define usb_lld_disconnect_bus(usbp) // #define usb_lld_disconnect_bus(usbp)
#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) #define usb_lld_disconnect_bus(usbp) \
(palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); \
palClearPad(GPIOA, GPIOA_USB_DP)
// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) // #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12)
#if !defined(_FROM_ASM_) #if !defined(_FROM_ASM_)
#ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
#endif # endif
void boardInit(void); void boardInit(void);
#ifdef __cplusplus # ifdef __cplusplus
} }
#endif # endif
#endif /* _FROM_ASM_ */ #endif /* _FROM_ASM_ */
#endif /* _BOARD_H_ */ #endif /* _BOARD_H_ */

View file

@ -21,9 +21,9 @@
* @details Digital I/O ports static configuration as defined in @p board.h. * @details Digital I/O ports static configuration as defined in @p board.h.
* This variable is used by the HAL when initializing the PAL driver. * This variable is used by the HAL when initializing the PAL driver.
*/ */
const PALConfig pal_default_config = const PALConfig pal_default_config = {
{ .ports =
.ports = { {
{ {
/* /*
* PORTA setup. * PORTA setup.
@ -37,18 +37,9 @@ const PALConfig pal_default_config =
* PTA0/3 SWD * PTA0/3 SWD
*/ */
.port = IOPORT1, .port = IOPORT1,
.pads = { .pads =
PAL_MODE_ALTERNATIVE_7, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, {
PAL_MODE_ALTERNATIVE_7, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_ALTERNATIVE_7, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_7, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
}, },
}, },
{ {
@ -65,18 +56,9 @@ const PALConfig pal_default_config =
* PTB19 - PIN25 * PTB19 - PIN25
*/ */
.port = IOPORT2, .port = IOPORT2,
.pads = { .pads =
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, {
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_3, PAL_MODE_ALTERNATIVE_3, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_3, PAL_MODE_ALTERNATIVE_3,
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
}, },
}, },
{ {
@ -97,18 +79,9 @@ const PALConfig pal_default_config =
* PTC11 - PIN30 * PTC11 - PIN30
*/ */
.port = IOPORT3, .port = IOPORT3,
.pads = { .pads =
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, {
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
}, },
}, },
{ {
@ -125,18 +98,9 @@ const PALConfig pal_default_config =
* PTD7 - PIN5 * PTD7 - PIN5
*/ */
.port = IOPORT4, .port = IOPORT4,
.pads = { .pads =
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, {
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
}, },
}, },
{ {
@ -147,18 +111,9 @@ const PALConfig pal_default_config =
* PTE1 - PIN26 * PTE1 - PIN26
*/ */
.port = IOPORT5, .port = IOPORT5,
.pads = { .pads =
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, {
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
}, },
}, },
}, },
@ -178,7 +133,8 @@ const PALConfig pal_default_config =
void __early_init(void) { void __early_init(void) {
// This is a dirty hack and should only be used as a temporary fix until this // This is a dirty hack and should only be used as a temporary fix until this
// is upstreamed. // is upstreamed.
while (WDOG_TMROUTL < 2); // Must wait for WDOG timer if already running, before jumping while (WDOG_TMROUTL < 2)
; // Must wait for WDOG timer if already running, before jumping
k20x_clock_init(); k20x_clock_init();
} }
@ -187,5 +143,4 @@ void __early_init(void) {
* @brief Board-specific initialization code. * @brief Board-specific initialization code.
* @todo Add your board-specific code, if any. * @todo Add your board-specific code, if any.
*/ */
void boardInit(void) { void boardInit(void) {}
}

View file

@ -31,7 +31,7 @@
#define KINETIS_XTAL_FREQUENCY 16000000UL #define KINETIS_XTAL_FREQUENCY 16000000UL
/* Use internal capacitors for the crystal */ /* Use internal capacitors for the crystal */
#define KINETIS_BOARD_OSCILLATOR_SETTING OSC_CR_SC8P|OSC_CR_SC2P #define KINETIS_BOARD_OSCILLATOR_SETTING OSC_CR_SC8P | OSC_CR_SC2P
/* /*
* MCU type * MCU type
@ -283,13 +283,13 @@
#define LINE_LED LINE_PIN13 #define LINE_LED LINE_PIN13
#if !defined(_FROM_ASM_) #if !defined(_FROM_ASM_)
#ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
#endif # endif
void boardInit(void); void boardInit(void);
#ifdef __cplusplus # ifdef __cplusplus
} }
#endif # endif
#endif /* _FROM_ASM_ */ #endif /* _FROM_ASM_ */
#endif /* _BOARD_H_ */ #endif /* _BOARD_H_ */

View file

@ -20,13 +20,11 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
uint8_t DRV2605L_transfer_buffer[2]; uint8_t DRV2605L_transfer_buffer[2];
uint8_t DRV2605L_tx_register[0]; uint8_t DRV2605L_tx_register[0];
uint8_t DRV2605L_read_buffer[0]; uint8_t DRV2605L_read_buffer[0];
uint8_t DRV2605L_read_register; uint8_t DRV2605L_read_register;
void DRV_write(uint8_t drv_register, uint8_t settings) { void DRV_write(uint8_t drv_register, uint8_t settings) {
DRV2605L_transfer_buffer[0] = drv_register; DRV2605L_transfer_buffer[0] = drv_register;
DRV2605L_transfer_buffer[1] = settings; DRV2605L_transfer_buffer[1] = settings;
@ -35,65 +33,60 @@ void DRV_write(uint8_t drv_register, uint8_t settings) {
uint8_t DRV_read(uint8_t regaddress) { uint8_t DRV_read(uint8_t regaddress) {
#ifdef __AVR__ #ifdef __AVR__
i2c_readReg(DRV2605L_BASE_ADDRESS << 1, i2c_readReg(DRV2605L_BASE_ADDRESS << 1, regaddress, DRV2605L_read_buffer, 1, 100);
regaddress, DRV2605L_read_buffer, 1, 100);
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0]; DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
#else #else
DRV2605L_tx_register[0] = regaddress; DRV2605L_tx_register[0] = regaddress;
if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1, if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1, DRV2605L_tx_register, 1, DRV2605L_read_buffer, 1)) {
DRV2605L_tx_register, 1,
DRV2605L_read_buffer, 1
)){
printf("err reading reg \n"); printf("err reading reg \n");
} }
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0]; DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
#endif #endif
return DRV2605L_read_register; return DRV2605L_read_register;
} }
void DRV_init(void) void DRV_init(void) {
{
i2c_init(); i2c_init();
/* 0x07 sets DRV2605 into calibration mode */ /* 0x07 sets DRV2605 into calibration mode */
DRV_write(DRV_MODE,0x07); DRV_write(DRV_MODE, 0x07);
// DRV_write(DRV_FEEDBACK_CTRL,0xB6); // DRV_write(DRV_FEEDBACK_CTRL,0xB6);
#if FB_ERM_LRA == 0 #if FB_ERM_LRA == 0
/* ERM settings */ /* ERM settings */
DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE/21.33)*1000); DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE / 21.33) * 1000);
#if ERM_OPEN_LOOP == 0 # if ERM_OPEN_LOOP == 0
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK*(DRIVE_TIME+BLANKING_TIME+IDISS_TIME))/0.02133)/(DRIVE_TIME-0.0003))); DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK * (DRIVE_TIME + BLANKING_TIME + IDISS_TIME)) / 0.02133) / (DRIVE_TIME - 0.0003)));
#elif ERM_OPEN_LOOP == 1 # elif ERM_OPEN_LOOP == 1
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196)); DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196));
#endif # endif
#elif FB_ERM_LRA == 1 #elif FB_ERM_LRA == 1
DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150+(SAMPLE_TIME*50))*0.000001)) + 0.0003)* F_LRA)/0.02071))); DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150 + (SAMPLE_TIME * 50)) * 0.000001)) + 0.0003) * F_LRA) / 0.02071)));
#if LRA_OPEN_LOOP == 0 # if LRA_OPEN_LOOP == 0
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK/sqrt(1-(F_LRA*0.0008))/0.02133))); DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK / sqrt(1 - (F_LRA * 0.0008)) / 0.02133)));
#elif LRA_OPEN_LOOP == 1 # elif LRA_OPEN_LOOP == 1
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196)); DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196));
#endif # endif
#endif #endif
DRVREG_FBR FB_SET; DRVREG_FBR FB_SET;
FB_SET.Bits.ERM_LRA = FB_ERM_LRA; FB_SET.Bits.ERM_LRA = FB_ERM_LRA;
FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR; FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR;
FB_SET.Bits.LOOP_GAIN =FB_LOOPGAIN; FB_SET.Bits.LOOP_GAIN = FB_LOOPGAIN;
FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/ FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/
DRV_write(DRV_FEEDBACK_CTRL, (uint8_t) FB_SET.Byte); DRV_write(DRV_FEEDBACK_CTRL, (uint8_t)FB_SET.Byte);
DRVREG_CTRL1 C1_SET; DRVREG_CTRL1 C1_SET;
C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME; C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME;
C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE; C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE;
C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST; C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST;
DRV_write(DRV_CTRL_1, (uint8_t) C1_SET.Byte); DRV_write(DRV_CTRL_1, (uint8_t)C1_SET.Byte);
DRVREG_CTRL2 C2_SET; DRVREG_CTRL2 C2_SET;
C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT; C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT;
C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB; C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB;
C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME; C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME;
C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME; C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME;
C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME; C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME;
DRV_write(DRV_CTRL_2, (uint8_t) C2_SET.Byte); DRV_write(DRV_CTRL_2, (uint8_t)C2_SET.Byte);
DRVREG_CTRL3 C3_SET; DRVREG_CTRL3 C3_SET;
C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP; C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP;
C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG; C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG;
@ -102,27 +95,26 @@ void DRV_init(void)
C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS; C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS;
C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP; C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP;
C3_SET.Bits.C3_NG_THRESH = NG_THRESH; C3_SET.Bits.C3_NG_THRESH = NG_THRESH;
DRV_write(DRV_CTRL_3, (uint8_t) C3_SET.Byte); DRV_write(DRV_CTRL_3, (uint8_t)C3_SET.Byte);
DRVREG_CTRL4 C4_SET; DRVREG_CTRL4 C4_SET;
C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME; C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME;
C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME; C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME;
DRV_write(DRV_CTRL_4, (uint8_t) C4_SET.Byte); DRV_write(DRV_CTRL_4, (uint8_t)C4_SET.Byte);
DRV_write(DRV_LIB_SELECTION,LIB_SELECTION); DRV_write(DRV_LIB_SELECTION, LIB_SELECTION);
DRV_write(DRV_GO, 0x01); DRV_write(DRV_GO, 0x01);
/* 0x00 sets DRV2605 out of standby and to use internal trigger /* 0x00 sets DRV2605 out of standby and to use internal trigger
* 0x01 sets DRV2605 out of standby and to use external trigger */ * 0x01 sets DRV2605 out of standby and to use external trigger */
DRV_write(DRV_MODE,0x00); DRV_write(DRV_MODE, 0x00);
//Play greeting sequence // Play greeting sequence
DRV_write(DRV_GO, 0x00); DRV_write(DRV_GO, 0x00);
DRV_write(DRV_WAVEFORM_SEQ_1, DRV_GREETING); DRV_write(DRV_WAVEFORM_SEQ_1, DRV_GREETING);
DRV_write(DRV_GO, 0x01); DRV_write(DRV_GO, 0x01);
} }
void DRV_pulse(uint8_t sequence) void DRV_pulse(uint8_t sequence) {
{
DRV_write(DRV_GO, 0x00); DRV_write(DRV_GO, 0x00);
DRV_write(DRV_WAVEFORM_SEQ_1, sequence); DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
DRV_write(DRV_GO, 0x01); DRV_write(DRV_GO, 0x01);

View file

@ -22,111 +22,111 @@
* Feedback Control Settings */ * Feedback Control Settings */
#ifndef FB_ERM_LRA #ifndef FB_ERM_LRA
#define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/ # define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/
#endif #endif
#ifndef FB_BRAKEFACTOR #ifndef FB_BRAKEFACTOR
#define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ # define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
#endif #endif
#ifndef FB_LOOPGAIN #ifndef FB_LOOPGAIN
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ # define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
#endif #endif
/* LRA specific settings */ /* LRA specific settings */
#if FB_ERM_LRA == 1 #if FB_ERM_LRA == 1
#ifndef V_RMS # ifndef V_RMS
#define V_RMS 2.0 # define V_RMS 2.0
#endif # endif
#ifndef V_PEAK # ifndef V_PEAK
#define V_PEAK 2.1 # define V_PEAK 2.1
#endif # endif
#ifndef F_LRA # ifndef F_LRA
#define F_LRA 205 # define F_LRA 205
#endif # endif
#ifndef RATED_VOLTAGE # ifndef RATED_VOLTAGE
#define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ # define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
#endif # endif
#endif #endif
#ifndef RATED_VOLTAGE #ifndef RATED_VOLTAGE
#define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ # define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
#endif #endif
#ifndef V_PEAK #ifndef V_PEAK
#define V_PEAK 2.8 # define V_PEAK 2.8
#endif #endif
/* Library Selection */ /* Library Selection */
#ifndef LIB_SELECTION #ifndef LIB_SELECTION
#if FB_ERM_LRA == 1 # if FB_ERM_LRA == 1
#define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ # define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */
#else # else
#define LIB_SELECTION 1 # define LIB_SELECTION 1
#endif # endif
#endif #endif
#ifndef DRV_GREETING #ifndef DRV_GREETING
#define DRV_GREETING alert_750ms # define DRV_GREETING alert_750ms
#endif #endif
#ifndef DRV_MODE_DEFAULT #ifndef DRV_MODE_DEFAULT
#define DRV_MODE_DEFAULT strong_click1 # define DRV_MODE_DEFAULT strong_click1
#endif #endif
/* Control 1 register settings */ /* Control 1 register settings */
#ifndef DRIVE_TIME #ifndef DRIVE_TIME
#define DRIVE_TIME 25 # define DRIVE_TIME 25
#endif #endif
#ifndef AC_COUPLE #ifndef AC_COUPLE
#define AC_COUPLE 0 # define AC_COUPLE 0
#endif #endif
#ifndef STARTUP_BOOST #ifndef STARTUP_BOOST
#define STARTUP_BOOST 1 # define STARTUP_BOOST 1
#endif #endif
/* Control 2 Settings */ /* Control 2 Settings */
#ifndef BIDIR_INPUT #ifndef BIDIR_INPUT
#define BIDIR_INPUT 1 # define BIDIR_INPUT 1
#endif #endif
#ifndef BRAKE_STAB #ifndef BRAKE_STAB
#define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */ # define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */
#endif #endif
#ifndef SAMPLE_TIME #ifndef SAMPLE_TIME
#define SAMPLE_TIME 3 # define SAMPLE_TIME 3
#endif #endif
#ifndef BLANKING_TIME #ifndef BLANKING_TIME
#define BLANKING_TIME 1 # define BLANKING_TIME 1
#endif #endif
#ifndef IDISS_TIME #ifndef IDISS_TIME
#define IDISS_TIME 1 # define IDISS_TIME 1
#endif #endif
/* Control 3 settings */ /* Control 3 settings */
#ifndef NG_THRESH #ifndef NG_THRESH
#define NG_THRESH 2 # define NG_THRESH 2
#endif #endif
#ifndef ERM_OPEN_LOOP #ifndef ERM_OPEN_LOOP
#define ERM_OPEN_LOOP 1 # define ERM_OPEN_LOOP 1
#endif #endif
#ifndef SUPPLY_COMP_DIS #ifndef SUPPLY_COMP_DIS
#define SUPPLY_COMP_DIS 0 # define SUPPLY_COMP_DIS 0
#endif #endif
#ifndef DATA_FORMAT_RTO #ifndef DATA_FORMAT_RTO
#define DATA_FORMAT_RTO 0 # define DATA_FORMAT_RTO 0
#endif #endif
#ifndef LRA_DRIVE_MODE #ifndef LRA_DRIVE_MODE
#define LRA_DRIVE_MODE 0 # define LRA_DRIVE_MODE 0
#endif #endif
#ifndef N_PWM_ANALOG #ifndef N_PWM_ANALOG
#define N_PWM_ANALOG 0 # define N_PWM_ANALOG 0
#endif #endif
#ifndef LRA_OPEN_LOOP #ifndef LRA_OPEN_LOOP
#define LRA_OPEN_LOOP 0 # define LRA_OPEN_LOOP 0
#endif #endif
/* Control 4 settings */ /* Control 4 settings */
#ifndef ZC_DET_TIME #ifndef ZC_DET_TIME
#define ZC_DET_TIME 0 # define ZC_DET_TIME 0
#endif #endif
#ifndef AUTO_CAL_TIME #ifndef AUTO_CAL_TIME
#define AUTO_CAL_TIME 3 # define AUTO_CAL_TIME 3
#endif #endif
/* register defines -------------------------------------------------------- */ /* register defines -------------------------------------------------------- */
@ -172,7 +172,7 @@ void DRV_write(const uint8_t drv_register, const uint8_t settings);
uint8_t DRV_read(const uint8_t regaddress); uint8_t DRV_read(const uint8_t regaddress);
void DRV_pulse(const uint8_t sequence); void DRV_pulse(const uint8_t sequence);
typedef enum DRV_EFFECT{ typedef enum DRV_EFFECT {
clear_sequence = 0, clear_sequence = 0,
strong_click = 1, strong_click = 1,
strong_click_60 = 2, strong_click_60 = 2,
@ -305,100 +305,100 @@ typedef enum DRV_EFFECT{
typedef union DRVREG_STATUS { /* register 0x00 */ typedef union DRVREG_STATUS { /* register 0x00 */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t OC_DETECT :1; /* set to 1 when overcurrent event is detected */ uint8_t OC_DETECT : 1; /* set to 1 when overcurrent event is detected */
uint8_t OVER_TEMP :1; /* set to 1 when device exceeds temp threshold */ uint8_t OVER_TEMP : 1; /* set to 1 when device exceeds temp threshold */
uint8_t FB_STS :1; /* set to 1 when feedback controller has timed out */ uint8_t FB_STS : 1; /* set to 1 when feedback controller has timed out */
/* auto-calibration routine and diagnostic result /* auto-calibration routine and diagnostic result
* result | auto-calibation | diagnostic | * result | auto-calibation | diagnostic |
* 0 | passed | actuator func normal | * 0 | passed | actuator func normal |
* 1 | failed | actuator func fault* | * 1 | failed | actuator func fault* |
* * actuator is not present or is shorted, timing out, or giving outof-range back-EMF */ * * actuator is not present or is shorted, timing out, or giving outof-range back-EMF */
uint8_t DIAG_RESULT :1; uint8_t DIAG_RESULT : 1;
uint8_t :1; uint8_t : 1;
uint8_t DEVICE_ID :3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */ uint8_t DEVICE_ID : 3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */
} Bits; } Bits;
} DRVREG_STATUS; } DRVREG_STATUS;
typedef union DRVREG_MODE { /* register 0x01 */ typedef union DRVREG_MODE { /* register 0x01 */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t MODE :3; /* Mode setting */ uint8_t MODE : 3; /* Mode setting */
uint8_t :3; uint8_t : 3;
uint8_t STANDBY :1; /* 0:standby 1:ready */ uint8_t STANDBY : 1; /* 0:standby 1:ready */
} Bits; } Bits;
} DRVREG_MODE; } DRVREG_MODE;
typedef union DRVREG_WAIT { typedef union DRVREG_WAIT {
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t WAIT_MODE :1; /* Set to 1 to interpret as wait for next 7 bits x10ms */ uint8_t WAIT_MODE : 1; /* Set to 1 to interpret as wait for next 7 bits x10ms */
uint8_t WAIT_TIME :7; uint8_t WAIT_TIME : 7;
} Bits; } Bits;
} DRVREG_WAIT; } DRVREG_WAIT;
typedef union DRVREG_FBR{ /* register 0x1A */ typedef union DRVREG_FBR { /* register 0x1A */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t BEMF_GAIN :2; uint8_t BEMF_GAIN : 2;
uint8_t LOOP_GAIN :2; uint8_t LOOP_GAIN : 2;
uint8_t BRAKE_FACTOR :3; uint8_t BRAKE_FACTOR : 3;
uint8_t ERM_LRA :1; uint8_t ERM_LRA : 1;
} Bits; } Bits;
} DRVREG_FBR; } DRVREG_FBR;
typedef union DRVREG_CTRL1{ /* register 0x1B */ typedef union DRVREG_CTRL1 { /* register 0x1B */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t C1_DRIVE_TIME :5; uint8_t C1_DRIVE_TIME : 5;
uint8_t C1_AC_COUPLE :1; uint8_t C1_AC_COUPLE : 1;
uint8_t :1; uint8_t : 1;
uint8_t C1_STARTUP_BOOST :1; uint8_t C1_STARTUP_BOOST : 1;
} Bits; } Bits;
} DRVREG_CTRL1; } DRVREG_CTRL1;
typedef union DRVREG_CTRL2{ /* register 0x1C */ typedef union DRVREG_CTRL2 { /* register 0x1C */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t C2_IDISS_TIME :2; uint8_t C2_IDISS_TIME : 2;
uint8_t C2_BLANKING_TIME :2; uint8_t C2_BLANKING_TIME : 2;
uint8_t C2_SAMPLE_TIME :2; uint8_t C2_SAMPLE_TIME : 2;
uint8_t C2_BRAKE_STAB :1; uint8_t C2_BRAKE_STAB : 1;
uint8_t C2_BIDIR_INPUT :1; uint8_t C2_BIDIR_INPUT : 1;
} Bits; } Bits;
} DRVREG_CTRL2; } DRVREG_CTRL2;
typedef union DRVREG_CTRL3{ /* register 0x1D */ typedef union DRVREG_CTRL3 { /* register 0x1D */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t C3_LRA_OPEN_LOOP :1; uint8_t C3_LRA_OPEN_LOOP : 1;
uint8_t C3_N_PWM_ANALOG :1; uint8_t C3_N_PWM_ANALOG : 1;
uint8_t C3_LRA_DRIVE_MODE :1; uint8_t C3_LRA_DRIVE_MODE : 1;
uint8_t C3_DATA_FORMAT_RTO :1; uint8_t C3_DATA_FORMAT_RTO : 1;
uint8_t C3_SUPPLY_COMP_DIS :1; uint8_t C3_SUPPLY_COMP_DIS : 1;
uint8_t C3_ERM_OPEN_LOOP :1; uint8_t C3_ERM_OPEN_LOOP : 1;
uint8_t C3_NG_THRESH :2; uint8_t C3_NG_THRESH : 2;
} Bits; } Bits;
} DRVREG_CTRL3; } DRVREG_CTRL3;
typedef union DRVREG_CTRL4{ /* register 0x1E */ typedef union DRVREG_CTRL4 { /* register 0x1E */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t C4_OTP_PROGRAM :1; uint8_t C4_OTP_PROGRAM : 1;
uint8_t :1; uint8_t : 1;
uint8_t C4_OTP_STATUS :1; uint8_t C4_OTP_STATUS : 1;
uint8_t :1; uint8_t : 1;
uint8_t C4_AUTO_CAL_TIME :2; uint8_t C4_AUTO_CAL_TIME : 2;
uint8_t C4_ZC_DET_TIME :2; uint8_t C4_ZC_DET_TIME : 2;
} Bits; } Bits;
} DRVREG_CTRL4; } DRVREG_CTRL4;
typedef union DRVREG_CTRL5{ /* register 0x1F */ typedef union DRVREG_CTRL5 { /* register 0x1F */
uint8_t Byte; uint8_t Byte;
struct { struct {
uint8_t C5_IDISS_TIME :2; uint8_t C5_IDISS_TIME : 2;
uint8_t C5_BLANKING_TIME :2; uint8_t C5_BLANKING_TIME : 2;
uint8_t C5_PLAYBACK_INTERVAL :1; uint8_t C5_PLAYBACK_INTERVAL : 1;
uint8_t C5_LRA_AUTO_OPEN_LOOP :1; uint8_t C5_LRA_AUTO_OPEN_LOOP : 1;
uint8_t C5_AUTO_OL_CNT :2; uint8_t C5_AUTO_OL_CNT : 2;
} Bits; } Bits;
} DRVREG_CTRL5; } DRVREG_CTRL5;

View file

@ -19,42 +19,42 @@
#include "progmem.h" #include "progmem.h"
#include "debug.h" #include "debug.h"
#ifdef DRV2605L #ifdef DRV2605L
#include "DRV2605L.h" # include "DRV2605L.h"
#endif #endif
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
#include "solenoid.h" # include "solenoid.h"
#endif #endif
haptic_config_t haptic_config; haptic_config_t haptic_config;
void haptic_init(void) { void haptic_init(void) {
debug_enable = 1; //Debug is ON! debug_enable = 1; // Debug is ON!
if (!eeconfig_is_enabled()) { if (!eeconfig_is_enabled()) {
eeconfig_init(); eeconfig_init();
} }
haptic_config.raw = eeconfig_read_haptic(); haptic_config.raw = eeconfig_read_haptic();
if (haptic_config.mode < 1){ if (haptic_config.mode < 1) {
haptic_config.mode = 1; haptic_config.mode = 1;
} }
if (!haptic_config.mode){ if (!haptic_config.mode) {
dprintf("No haptic config found in eeprom, setting default configs\n"); dprintf("No haptic config found in eeprom, setting default configs\n");
haptic_reset(); haptic_reset();
} }
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
solenoid_setup(); solenoid_setup();
dprintf("Solenoid driver initialized\n"); dprintf("Solenoid driver initialized\n");
#endif #endif
#ifdef DRV2605L #ifdef DRV2605L
DRV_init(); DRV_init();
dprintf("DRV2605 driver initialized\n"); dprintf("DRV2605 driver initialized\n");
#endif #endif
eeconfig_debug_haptic(); eeconfig_debug_haptic();
} }
void haptic_task(void) { void haptic_task(void) {
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
solenoid_check(); solenoid_check();
#endif #endif
} }
void eeconfig_debug_haptic(void) { void eeconfig_debug_haptic(void) {
@ -76,7 +76,7 @@ void haptic_disable(void) {
} }
void haptic_toggle(void) { void haptic_toggle(void) {
if (haptic_config.enable) { if (haptic_config.enable) {
haptic_disable(); haptic_disable();
} else { } else {
haptic_enable(); haptic_enable();
@ -84,10 +84,9 @@ if (haptic_config.enable) {
eeconfig_update_haptic(haptic_config.raw); eeconfig_update_haptic(haptic_config.raw);
} }
void haptic_feedback_toggle(void){ void haptic_feedback_toggle(void) {
haptic_config.feedback++; haptic_config.feedback++;
if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX) if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX) haptic_config.feedback = KEY_PRESS;
haptic_config.feedback = KEY_PRESS;
xprintf("haptic_config.feedback = %u\n", !haptic_config.feedback); xprintf("haptic_config.feedback = %u\n", !haptic_config.feedback);
eeconfig_update_haptic(haptic_config.raw); eeconfig_update_haptic(haptic_config.raw);
} }
@ -100,58 +99,58 @@ void haptic_buzz_toggle(void) {
void haptic_mode_increase(void) { void haptic_mode_increase(void) {
uint8_t mode = haptic_config.mode + 1; uint8_t mode = haptic_config.mode + 1;
#ifdef DRV2605L #ifdef DRV2605L
if (haptic_config.mode >= drv_effect_max) { if (haptic_config.mode >= drv_effect_max) {
mode = 1; mode = 1;
} }
#endif #endif
haptic_set_mode(mode); haptic_set_mode(mode);
} }
void haptic_mode_decrease(void) { void haptic_mode_decrease(void) {
uint8_t mode = haptic_config.mode -1; uint8_t mode = haptic_config.mode - 1;
#ifdef DRV2605L #ifdef DRV2605L
if (haptic_config.mode < 1) { if (haptic_config.mode < 1) {
mode = (drv_effect_max - 1); mode = (drv_effect_max - 1);
} }
#endif #endif
haptic_set_mode(mode); haptic_set_mode(mode);
} }
void haptic_dwell_increase(void) { void haptic_dwell_increase(void) {
uint8_t dwell = haptic_config.dwell + 1; uint8_t dwell = haptic_config.dwell + 1;
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
if (haptic_config.dwell >= SOLENOID_MAX_DWELL) { if (haptic_config.dwell >= SOLENOID_MAX_DWELL) {
dwell = 1; dwell = 1;
} }
solenoid_set_dwell(dwell); solenoid_set_dwell(dwell);
#endif #endif
haptic_set_dwell(dwell); haptic_set_dwell(dwell);
} }
void haptic_dwell_decrease(void) { void haptic_dwell_decrease(void) {
uint8_t dwell = haptic_config.dwell -1; uint8_t dwell = haptic_config.dwell - 1;
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
if (haptic_config.dwell < SOLENOID_MIN_DWELL) { if (haptic_config.dwell < SOLENOID_MIN_DWELL) {
dwell = SOLENOID_MAX_DWELL; dwell = SOLENOID_MAX_DWELL;
} }
solenoid_set_dwell(dwell); solenoid_set_dwell(dwell);
#endif #endif
haptic_set_dwell(dwell); haptic_set_dwell(dwell);
} }
void haptic_reset(void){ void haptic_reset(void) {
haptic_config.enable = true; haptic_config.enable = true;
uint8_t feedback = HAPTIC_FEEDBACK_DEFAULT; uint8_t feedback = HAPTIC_FEEDBACK_DEFAULT;
haptic_config.feedback = feedback; haptic_config.feedback = feedback;
#ifdef DRV2605L #ifdef DRV2605L
uint8_t mode = HAPTIC_MODE_DEFAULT; uint8_t mode = HAPTIC_MODE_DEFAULT;
haptic_config.mode = mode; haptic_config.mode = mode;
#endif #endif
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
uint8_t dwell = SOLENOID_DEFAULT_DWELL; uint8_t dwell = SOLENOID_DEFAULT_DWELL;
haptic_config.dwell = dwell; haptic_config.dwell = dwell;
#endif #endif
eeconfig_update_haptic(haptic_config.raw); eeconfig_update_haptic(haptic_config.raw);
xprintf("haptic_config.feedback = %u\n", haptic_config.feedback); xprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
xprintf("haptic_config.mode = %u\n", haptic_config.mode); xprintf("haptic_config.mode = %u\n", haptic_config.mode);
@ -182,56 +181,76 @@ void haptic_set_dwell(uint8_t dwell) {
} }
uint8_t haptic_get_mode(void) { uint8_t haptic_get_mode(void) {
if (!haptic_config.enable){ if (!haptic_config.enable) {
return false; return false;
} }
return haptic_config.mode; return haptic_config.mode;
} }
uint8_t haptic_get_feedback(void) { uint8_t haptic_get_feedback(void) {
if (!haptic_config.enable){ if (!haptic_config.enable) {
return false; return false;
} }
return haptic_config.feedback; return haptic_config.feedback;
} }
uint8_t haptic_get_dwell(void) { uint8_t haptic_get_dwell(void) {
if (!haptic_config.enable){ if (!haptic_config.enable) {
return false; return false;
} }
return haptic_config.dwell; return haptic_config.dwell;
} }
void haptic_play(void) { void haptic_play(void) {
#ifdef DRV2605L #ifdef DRV2605L
uint8_t play_eff = 0; uint8_t play_eff = 0;
play_eff = haptic_config.mode; play_eff = haptic_config.mode;
DRV_pulse(play_eff); DRV_pulse(play_eff);
#endif #endif
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
solenoid_fire(); solenoid_fire();
#endif #endif
} }
bool process_haptic(uint16_t keycode, keyrecord_t *record) { bool process_haptic(uint16_t keycode, keyrecord_t *record) {
if (keycode == HPT_ON && record->event.pressed) { haptic_enable(); } if (keycode == HPT_ON && record->event.pressed) {
if (keycode == HPT_OFF && record->event.pressed) { haptic_disable(); } haptic_enable();
if (keycode == HPT_TOG && record->event.pressed) { haptic_toggle(); } }
if (keycode == HPT_RST && record->event.pressed) { haptic_reset(); } if (keycode == HPT_OFF && record->event.pressed) {
if (keycode == HPT_FBK && record->event.pressed) { haptic_feedback_toggle(); } haptic_disable();
if (keycode == HPT_BUZ && record->event.pressed) { haptic_buzz_toggle(); } }
if (keycode == HPT_MODI && record->event.pressed) { haptic_mode_increase(); } if (keycode == HPT_TOG && record->event.pressed) {
if (keycode == HPT_MODD && record->event.pressed) { haptic_mode_decrease(); } haptic_toggle();
if (keycode == HPT_DWLI && record->event.pressed) { haptic_dwell_increase(); } }
if (keycode == HPT_DWLD && record->event.pressed) { haptic_dwell_decrease(); } if (keycode == HPT_RST && record->event.pressed) {
haptic_reset();
}
if (keycode == HPT_FBK && record->event.pressed) {
haptic_feedback_toggle();
}
if (keycode == HPT_BUZ && record->event.pressed) {
haptic_buzz_toggle();
}
if (keycode == HPT_MODI && record->event.pressed) {
haptic_mode_increase();
}
if (keycode == HPT_MODD && record->event.pressed) {
haptic_mode_decrease();
}
if (keycode == HPT_DWLI && record->event.pressed) {
haptic_dwell_increase();
}
if (keycode == HPT_DWLD && record->event.pressed) {
haptic_dwell_decrease();
}
if (haptic_config.enable) { if (haptic_config.enable) {
if ( record->event.pressed ) { if (record->event.pressed) {
// keypress // keypress
if (haptic_config.feedback < 2) { if (haptic_config.feedback < 2) {
haptic_play(); haptic_play();
} }
} else { } else {
//keyrelease // keyrelease
if (haptic_config.feedback > 0) { if (haptic_config.feedback > 0) {
haptic_play(); haptic_play();
} }
@ -241,8 +260,7 @@ bool process_haptic(uint16_t keycode, keyrecord_t *record) {
} }
void haptic_shutdown(void) { void haptic_shutdown(void) {
#ifdef SOLENOID_ENABLE #ifdef SOLENOID_ENABLE
solenoid_shutdown(); solenoid_shutdown();
#endif #endif
} }

View file

@ -20,31 +20,30 @@
#include <stdbool.h> #include <stdbool.h>
#include "quantum.h" #include "quantum.h"
#ifdef DRV2605L #ifdef DRV2605L
#include "DRV2605L.h" # include "DRV2605L.h"
#endif #endif
#ifndef HAPTIC_FEEDBACK_DEFAULT #ifndef HAPTIC_FEEDBACK_DEFAULT
#define HAPTIC_FEEDBACK_DEFAULT 0 # define HAPTIC_FEEDBACK_DEFAULT 0
#endif #endif
#ifndef HAPTIC_MODE_DEFAULT #ifndef HAPTIC_MODE_DEFAULT
#define HAPTIC_MODE_DEFAULT DRV_MODE_DEFAULT # define HAPTIC_MODE_DEFAULT DRV_MODE_DEFAULT
#endif #endif
/* EEPROM config settings */ /* EEPROM config settings */
typedef union { typedef union {
uint32_t raw; uint32_t raw;
struct { struct {
bool enable :1; bool enable : 1;
uint8_t feedback :2; uint8_t feedback : 2;
uint8_t mode :7; uint8_t mode : 7;
bool buzz :1; bool buzz : 1;
uint8_t dwell :7; uint8_t dwell : 7;
uint16_t reserved :16; uint16_t reserved : 16;
}; };
} haptic_config_t; } haptic_config_t;
typedef enum HAPTIC_FEEDBACK{ typedef enum HAPTIC_FEEDBACK {
KEY_PRESS, KEY_PRESS,
KEY_PRESS_RELEASE, KEY_PRESS_RELEASE,
KEY_RELEASE, KEY_RELEASE,
@ -75,8 +74,3 @@ void haptic_dwell_decrease(void);
void haptic_play(void); void haptic_play(void);
void haptic_shutdown(void); void haptic_shutdown(void);

View file

@ -26,19 +26,11 @@ uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
extern haptic_config_t haptic_config; extern haptic_config_t haptic_config;
void solenoid_buzz_on(void) { haptic_set_buzz(1); }
void solenoid_buzz_on(void) { void solenoid_buzz_off(void) { haptic_set_buzz(0); }
haptic_set_buzz(1);
}
void solenoid_buzz_off(void) {
haptic_set_buzz(0);
}
void solenoid_set_buzz(int buzz) {
haptic_set_buzz(buzz);
}
void solenoid_set_buzz(int buzz) { haptic_set_buzz(buzz); }
void solenoid_dwell_minus(uint8_t solenoid_dwell) { void solenoid_dwell_minus(uint8_t solenoid_dwell) {
if (solenoid_dwell > 0) solenoid_dwell--; if (solenoid_dwell > 0) solenoid_dwell--;
@ -48,9 +40,7 @@ void solenoid_dwell_plus(uint8_t solenoid_dwell) {
if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++; if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
} }
void solenoid_set_dwell(uint8_t dwell) { void solenoid_set_dwell(uint8_t dwell) { solenoid_dwell = dwell; }
solenoid_dwell = dwell;
}
void solenoid_stop(void) { void solenoid_stop(void) {
writePinLow(SOLENOID_PIN); writePinLow(SOLENOID_PIN);
@ -75,21 +65,20 @@ void solenoid_check(void) {
elapsed = timer_elapsed(solenoid_start); elapsed = timer_elapsed(solenoid_start);
//Check if it's time to finish this solenoid click cycle // Check if it's time to finish this solenoid click cycle
if (elapsed > solenoid_dwell) { if (elapsed > solenoid_dwell) {
solenoid_stop(); solenoid_stop();
return; return;
} }
//Check whether to buzz the solenoid on and off // Check whether to buzz the solenoid on and off
if (haptic_config.buzz) { if (haptic_config.buzz) {
if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){ if (elapsed / SOLENOID_MIN_DWELL % 2 == 0) {
if (!solenoid_buzzing) { if (!solenoid_buzzing) {
solenoid_buzzing = true; solenoid_buzzing = true;
writePinHigh(SOLENOID_PIN); writePinHigh(SOLENOID_PIN);
} }
} } else {
else {
if (solenoid_buzzing) { if (solenoid_buzzing) {
solenoid_buzzing = false; solenoid_buzzing = false;
writePinLow(SOLENOID_PIN); writePinLow(SOLENOID_PIN);
@ -103,7 +92,4 @@ void solenoid_setup(void) {
solenoid_fire(); solenoid_fire();
} }
void solenoid_shutdown(void) { void solenoid_shutdown(void) { writePinLow(SOLENOID_PIN); }
writePinLow(SOLENOID_PIN);
}

View file

@ -18,23 +18,23 @@
#pragma once #pragma once
#ifndef SOLENOID_DEFAULT_DWELL #ifndef SOLENOID_DEFAULT_DWELL
#define SOLENOID_DEFAULT_DWELL 12 # define SOLENOID_DEFAULT_DWELL 12
#endif #endif
#ifndef SOLENOID_MAX_DWELL #ifndef SOLENOID_MAX_DWELL
#define SOLENOID_MAX_DWELL 100 # define SOLENOID_MAX_DWELL 100
#endif #endif
#ifndef SOLENOID_MIN_DWELL #ifndef SOLENOID_MIN_DWELL
#define SOLENOID_MIN_DWELL 4 # define SOLENOID_MIN_DWELL 4
#endif #endif
#ifndef SOLENOID_ACTIVE #ifndef SOLENOID_ACTIVE
#define SOLENOID_ACTIVE false # define SOLENOID_ACTIVE false
#endif #endif
#ifndef SOLENOID_PIN #ifndef SOLENOID_PIN
#define SOLENOID_PIN F6 # define SOLENOID_PIN F6
#endif #endif
void solenoid_buzz_on(void); void solenoid_buzz_on(void);

View file

@ -37,66 +37,60 @@ uint8_t g_twi_transfer_buffer[20];
uint8_t g_pwm_buffer[18]; uint8_t g_pwm_buffer[18];
bool g_pwm_buffer_update_required = false; bool g_pwm_buffer_update_required = false;
void IS31FL3218_write_register( uint8_t reg, uint8_t data ) void IS31FL3218_write_register(uint8_t reg, uint8_t data) {
{
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
} }
void IS31FL3218_write_pwm_buffer( uint8_t *pwm_buffer ) void IS31FL3218_write_pwm_buffer(uint8_t *pwm_buffer) {
{
g_twi_transfer_buffer[0] = ISSI_REG_PWM; g_twi_transfer_buffer[0] = ISSI_REG_PWM;
for ( int i=0; i<18; i++ ) { for (int i = 0; i < 18; i++) {
g_twi_transfer_buffer[1+i] = pwm_buffer[i]; g_twi_transfer_buffer[1 + i] = pwm_buffer[i];
} }
i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT); i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT);
} }
void IS31FL3218_init(void) void IS31FL3218_init(void) {
{
// In case we ever want to reinitialize (?) // In case we ever want to reinitialize (?)
IS31FL3218_write_register( ISSI_REG_RESET, 0x00 ); IS31FL3218_write_register(ISSI_REG_RESET, 0x00);
// Turn off software shutdown // Turn off software shutdown
IS31FL3218_write_register( ISSI_REG_SHUTDOWN, 0x01 ); IS31FL3218_write_register(ISSI_REG_SHUTDOWN, 0x01);
// Set all PWM values to zero // Set all PWM values to zero
for ( uint8_t i = 0; i < 18; i++ ) { for (uint8_t i = 0; i < 18; i++) {
IS31FL3218_write_register( ISSI_REG_PWM+i, 0x00 ); IS31FL3218_write_register(ISSI_REG_PWM + i, 0x00);
} }
// Enable all channels // Enable all channels
for ( uint8_t i = 0; i < 3; i++ ) { for (uint8_t i = 0; i < 3; i++) {
IS31FL3218_write_register( ISSI_REG_CONTROL+i, 0b00111111 ); IS31FL3218_write_register(ISSI_REG_CONTROL + i, 0b00111111);
} }
// Load PWM registers and LED Control register data // Load PWM registers and LED Control register data
IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
} }
void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
{
g_pwm_buffer[index * 3 + 0] = red; g_pwm_buffer[index * 3 + 0] = red;
g_pwm_buffer[index * 3 + 1] = green; g_pwm_buffer[index * 3 + 1] = green;
g_pwm_buffer[index * 3 + 2] = blue; g_pwm_buffer[index * 3 + 2] = blue;
g_pwm_buffer_update_required = true; g_pwm_buffer_update_required = true;
} }
void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
{ for (int i = 0; i < 6; i++) {
for ( int i = 0; i < 6; i++ ) { IS31FL3218_set_color(i, red, green, blue);
IS31FL3218_set_color( i, red, green, blue );
} }
} }
void IS31FL3218_update_pwm_buffers(void) void IS31FL3218_update_pwm_buffers(void) {
{ if (g_pwm_buffer_update_required) {
if ( g_pwm_buffer_update_required ) { IS31FL3218_write_pwm_buffer(g_pwm_buffer);
IS31FL3218_write_pwm_buffer( g_pwm_buffer );
// Load PWM registers and LED Control register data // Load PWM registers and LED Control register data
IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
} }
g_pwm_buffer_update_required = false; g_pwm_buffer_update_required = false;
} }

View file

@ -19,6 +19,6 @@
#include <stdbool.h> #include <stdbool.h>
void IS31FL3218_init(void); void IS31FL3218_init(void);
void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3218_update_pwm_buffers(void); void IS31FL3218_update_pwm_buffers(void);

View file

@ -17,11 +17,11 @@
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#include <util/delay.h> # include <util/delay.h>
#else #else
#include "wait.h" # include "wait.h"
#endif #endif
#include <stdint.h> #include <stdint.h>
@ -59,11 +59,11 @@
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' #define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
#endif #endif
#ifndef ISSI_PERSISTENCE #ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -79,13 +79,13 @@ bool g_pwm_buffer_update_required = false;
/* There's probably a better way to init this... */ /* There's probably a better way to init this... */
#if LED_DRIVER_COUNT == 1 #if LED_DRIVER_COUNT == 1
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}}; uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}};
#elif LED_DRIVER_COUNT == 2 #elif LED_DRIVER_COUNT == 2
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}}; uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}};
#elif LED_DRIVER_COUNT == 3 #elif LED_DRIVER_COUNT == 3
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}}; uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}};
#elif LED_DRIVER_COUNT == 4 #elif LED_DRIVER_COUNT == 4
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}}; uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}};
#endif #endif
bool g_led_control_registers_update_required = false; bool g_led_control_registers_update_required = false;
@ -103,20 +103,19 @@ bool g_led_control_registers_update_required = false;
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09 // 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 // 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) { void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) { if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) {
break; break;
} }
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif #endif
} }
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) { void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
@ -136,14 +135,13 @@ void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
} }
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
#endif #endif
} }
} }
@ -196,7 +194,6 @@ void IS31FL3731_init(uint8_t addr) {
// most usage after initialization is just writing PWM buffers in bank 0 // most usage after initialization is just writing PWM buffers in bank 0
// as there's not much point in double-buffering // as there's not much point in double-buffering
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0); IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
} }
void IS31FL3731_set_value(int index, uint8_t value) { void IS31FL3731_set_value(int index, uint8_t value) {
@ -239,7 +236,7 @@ void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) { void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
if (g_led_control_registers_update_required) { if (g_led_control_registers_update_required) {
for (int i=0; i<18; i++) { for (int i = 0; i < 18; i++) {
IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]); IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
} }
} }

View file

@ -16,13 +16,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef IS31FL3731_DRIVER_H #ifndef IS31FL3731_DRIVER_H
#define IS31FL3731_DRIVER_H #define IS31FL3731_DRIVER_H
typedef struct is31_led { typedef struct is31_led {
uint8_t driver:2; uint8_t driver : 2;
uint8_t v; uint8_t v;
} __attribute__((packed)) is31_led; } __attribute__((packed)) is31_led;
@ -206,5 +204,4 @@ void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
#define C9_15 0xB2 #define C9_15 0xB2
#define C9_16 0xB3 #define C9_16 0xB3
#endif // IS31FL3731_DRIVER_H #endif // IS31FL3731_DRIVER_H

View file

@ -16,11 +16,11 @@
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#include <util/delay.h> # include <util/delay.h>
#else #else
#include "wait.h" # include "wait.h"
#endif #endif
#include "is31fl3731.h" #include "is31fl3731.h"
@ -55,11 +55,11 @@
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' #define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
#endif #endif
#ifndef ISSI_PERSISTENCE #ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -71,10 +71,10 @@ uint8_t g_twi_transfer_buffer[20];
// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's // buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
// probably not worth the extra complexity. // probably not worth the extra complexity.
uint8_t g_pwm_buffer[DRIVER_COUNT][144]; uint8_t g_pwm_buffer[DRIVER_COUNT][144];
bool g_pwm_buffer_update_required[DRIVER_COUNT] = { false }; bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
uint8_t g_led_control_registers[DRIVER_COUNT][18] = { { 0 }, { 0 } }; uint8_t g_led_control_registers[DRIVER_COUNT][18] = {{0}, {0}};
bool g_led_control_registers_update_required[DRIVER_COUNT] = { false }; bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
// This is the bit pattern in the LED control registers // This is the bit pattern in the LED control registers
// (for matrix A, add one to register for matrix B) // (for matrix A, add one to register for matrix B)
@ -90,114 +90,103 @@ bool g_led_control_registers_update_required[DRIVER_COUNT] = { false };
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09 // 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 // 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data )
{
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif #endif
} }
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
{
// assumes bank is already selected // assumes bank is already selected
// transmit PWM registers in 9 transfers of 16 bytes // transmit PWM registers in 9 transfers of 16 bytes
// g_twi_transfer_buffer[] is 20 bytes // g_twi_transfer_buffer[] is 20 bytes
// iterate over the pwm_buffer contents at 16 byte intervals // iterate over the pwm_buffer contents at 16 byte intervals
for ( int i = 0; i < 144; i += 16 ) { for (int i = 0; i < 144; i += 16) {
// set the first register, e.g. 0x24, 0x34, 0x44, etc. // set the first register, e.g. 0x24, 0x34, 0x44, etc.
g_twi_transfer_buffer[0] = 0x24 + i; g_twi_transfer_buffer[0] = 0x24 + i;
// copy the data from i to i+15 // copy the data from i to i+15
// device will auto-increment register for data after the first byte // device will auto-increment register for data after the first byte
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer // thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
for ( int j = 0; j < 16; j++ ) { for (int j = 0; j < 16; j++) {
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
} }
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
#endif #endif
} }
} }
void IS31FL3731_init( uint8_t addr ) void IS31FL3731_init(uint8_t addr) {
{
// In order to avoid the LEDs being driven with garbage data // In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, first enable software shutdown, // in the LED driver's PWM registers, first enable software shutdown,
// then set up the mode and other settings, clear the PWM registers, // then set up the mode and other settings, clear the PWM registers,
// then disable software shutdown. // then disable software shutdown.
// select "function register" bank // select "function register" bank
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
// enable software shutdown // enable software shutdown
IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 ); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
// this delay was copied from other drivers, might not be needed // this delay was copied from other drivers, might not be needed
#ifdef __AVR__ #ifdef __AVR__
_delay_ms( 10 ); _delay_ms(10);
#else #else
wait_ms(10); wait_ms(10);
#endif #endif
// picture mode // picture mode
IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE ); IS31FL3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
// display frame 0 // display frame 0
IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 ); IS31FL3731_write_register(addr, ISSI_REG_PICTUREFRAME, 0x00);
// audio sync off // audio sync off
IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 ); IS31FL3731_write_register(addr, ISSI_REG_AUDIOSYNC, 0x00);
// select bank 0 // select bank 0
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
// turn off all LEDs in the LED control register // turn off all LEDs in the LED control register
for ( int i = 0x00; i <= 0x11; i++ ) for (int i = 0x00; i <= 0x11; i++) {
{ IS31FL3731_write_register(addr, i, 0x00);
IS31FL3731_write_register( addr, i, 0x00 );
} }
// turn off all LEDs in the blink control register (not really needed) // turn off all LEDs in the blink control register (not really needed)
for ( int i = 0x12; i <= 0x23; i++ ) for (int i = 0x12; i <= 0x23; i++) {
{ IS31FL3731_write_register(addr, i, 0x00);
IS31FL3731_write_register( addr, i, 0x00 );
} }
// set PWM on all LEDs to 0 // set PWM on all LEDs to 0
for ( int i = 0x24; i <= 0xB3; i++ ) for (int i = 0x24; i <= 0xB3; i++) {
{ IS31FL3731_write_register(addr, i, 0x00);
IS31FL3731_write_register( addr, i, 0x00 );
} }
// select "function register" bank // select "function register" bank
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
// disable software shutdown // disable software shutdown
IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 ); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x01);
// select bank 0 and leave it selected. // select bank 0 and leave it selected.
// most usage after initialization is just writing PWM buffers in bank 0 // most usage after initialization is just writing PWM buffers in bank 0
// as there's not much point in double-buffering // as there's not much point in double-buffering
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
} }
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
{ if (index >= 0 && index < DRIVER_LED_TOTAL) {
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
// Subtract 0x24 to get the second index of g_pwm_buffer // Subtract 0x24 to get the second index of g_pwm_buffer
@ -208,16 +197,13 @@ void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
} }
} }
void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
{ for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) IS31FL3731_set_color(i, red, green, blue);
{
IS31FL3731_set_color( i, red, green, blue );
} }
} }
void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
{
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
uint8_t control_register_r = (led.r - 0x24) / 8; uint8_t control_register_r = (led.r - 0x24) / 8;
@ -227,42 +213,36 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
uint8_t bit_g = (led.g - 0x24) % 8; uint8_t bit_g = (led.g - 0x24) % 8;
uint8_t bit_b = (led.b - 0x24) % 8; uint8_t bit_b = (led.b - 0x24) % 8;
if ( red ) { if (red) {
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
} else { } else {
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
} }
if ( green ) { if (green) {
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
} else { } else {
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
} }
if ( blue ) { if (blue) {
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
} else { } else {
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
} }
g_led_control_registers_update_required[led.driver] = true; g_led_control_registers_update_required[led.driver] = true;
} }
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index ) void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
{ if (g_pwm_buffer_update_required[index]) {
if ( g_pwm_buffer_update_required[index] ) IS31FL3731_write_pwm_buffer(addr, g_pwm_buffer[index]);
{
IS31FL3731_write_pwm_buffer( addr, g_pwm_buffer[index] );
} }
g_pwm_buffer_update_required[index] = false; g_pwm_buffer_update_required[index] = false;
} }
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index ) void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
{ if (g_led_control_registers_update_required[index]) {
if ( g_led_control_registers_update_required[index] ) for (int i = 0; i < 18; i++) {
{ IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
for ( int i=0; i<18; i++ )
{
IS31FL3731_write_register( addr, i, g_led_control_registers[index][i] );
} }
} }
} }

View file

@ -15,7 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef IS31FL3731_DRIVER_H #ifndef IS31FL3731_DRIVER_H
#define IS31FL3731_DRIVER_H #define IS31FL3731_DRIVER_H
@ -23,7 +22,7 @@
#include <stdbool.h> #include <stdbool.h>
typedef struct is31_led { typedef struct is31_led {
uint8_t driver:2; uint8_t driver : 2;
uint8_t r; uint8_t r;
uint8_t g; uint8_t g;
uint8_t b; uint8_t b;
@ -31,21 +30,21 @@ typedef struct is31_led {
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
void IS31FL3731_init( uint8_t addr ); void IS31FL3731_init(uint8_t addr);
void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ); void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
// This should not be called from an interrupt // This should not be called from an interrupt
// (eg. from a timer interrupt). // (eg. from a timer interrupt).
// Call this while idle (in between matrix scans). // Call this while idle (in between matrix scans).
// If the buffer is dirty, it will update the driver with the buffer. // If the buffer is dirty, it will update the driver with the buffer.
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index ); void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index ); void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
#define C1_1 0x24 #define C1_1 0x24
#define C1_2 0x25 #define C1_2 0x25
@ -209,6 +208,4 @@ void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index );
#define C9_15 0xB2 #define C9_15 0xB2
#define C9_16 0xB3 #define C9_16 0xB3
#endif // IS31FL3731_DRIVER_H #endif // IS31FL3731_DRIVER_H

View file

@ -17,11 +17,11 @@
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#include <util/delay.h> # include <util/delay.h>
#else #else
#include "wait.h" # include "wait.h"
#endif #endif
#include "is31fl3733.h" #include "is31fl3733.h"
@ -46,23 +46,23 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 //PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 //PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 //PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 //PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 //PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 //PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11// PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F //PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 //PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
#endif #endif
#ifndef ISSI_PERSISTENCE #ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -75,56 +75,51 @@ uint8_t g_twi_transfer_buffer[20];
// buffers and the transfers in IS31FL3733_write_pwm_buffer() but it's // buffers and the transfers in IS31FL3733_write_pwm_buffer() but it's
// probably not worth the extra complexity. // probably not worth the extra complexity.
uint8_t g_pwm_buffer[DRIVER_COUNT][192]; uint8_t g_pwm_buffer[DRIVER_COUNT][192];
bool g_pwm_buffer_update_required[DRIVER_COUNT] = { false }; bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } }; uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
bool g_led_control_registers_update_required[DRIVER_COUNT] = { false }; bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
void IS31FL3733_write_register( uint8_t addr, uint8_t reg, uint8_t data ) void IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
{
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif #endif
} }
void IS31FL3733_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) void IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
{
// assumes PG1 is already selected // assumes PG1 is already selected
// transmit PWM registers in 12 transfers of 16 bytes // transmit PWM registers in 12 transfers of 16 bytes
// g_twi_transfer_buffer[] is 20 bytes // g_twi_transfer_buffer[] is 20 bytes
// iterate over the pwm_buffer contents at 16 byte intervals // iterate over the pwm_buffer contents at 16 byte intervals
for ( int i = 0; i < 192; i += 16 ) { for (int i = 0; i < 192; i += 16) {
g_twi_transfer_buffer[0] = i; g_twi_transfer_buffer[0] = i;
// copy the data from i to i+15 // copy the data from i to i+15
// device will auto-increment register for data after the first byte // device will auto-increment register for data after the first byte
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer // thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
for ( int j = 0; j < 16; j++ ) { for (int j = 0; j < 16; j++) {
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
} }
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
#endif #endif
} }
} }
void IS31FL3733_init( uint8_t addr, uint8_t sync) void IS31FL3733_init(uint8_t addr, uint8_t sync) {
{
// In order to avoid the LEDs being driven with garbage data // In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, shutdown is enabled last. // in the LED driver's PWM registers, shutdown is enabled last.
// Set up the mode and other settings, clear the PWM registers, // Set up the mode and other settings, clear the PWM registers,
@ -132,49 +127,46 @@ void IS31FL3733_init( uint8_t addr, uint8_t sync)
// Sync is passed so set it according to the datasheet. // Sync is passed so set it according to the datasheet.
// Unlock the command register. // Unlock the command register.
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG0 // Select PG0
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
// Turn off all LEDs. // Turn off all LEDs.
for ( int i = 0x00; i <= 0x17; i++ ) for (int i = 0x00; i <= 0x17; i++) {
{ IS31FL3733_write_register(addr, i, 0x00);
IS31FL3733_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG1 // Select PG1
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
// Set PWM on all LEDs to 0 // Set PWM on all LEDs to 0
// No need to setup Breath registers to PWM as that is the default. // No need to setup Breath registers to PWM as that is the default.
for ( int i = 0x00; i <= 0xBF; i++ ) for (int i = 0x00; i <= 0xBF; i++) {
{ IS31FL3733_write_register(addr, i, 0x00);
IS31FL3733_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG3 // Select PG3
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set global current to maximum. // Set global current to maximum.
IS31FL3733_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF ); IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3733_write_register( addr, ISSI_REG_CONFIGURATION, (sync << 6) | 0x01 ); IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, (sync << 6) | 0x01);
// Wait 10ms to ensure the device has woken up. // Wait 10ms to ensure the device has woken up.
#ifdef __AVR__ #ifdef __AVR__
_delay_ms( 10 ); _delay_ms(10);
#else #else
wait_ms(10); wait_ms(10);
#endif #endif
} }
void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
{ if (index >= 0 && index < DRIVER_LED_TOTAL) {
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
g_pwm_buffer[led.driver][led.r] = red; g_pwm_buffer[led.driver][led.r] = red;
@ -184,16 +176,13 @@ void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
} }
} }
void IS31FL3733_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
{ for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) IS31FL3733_set_color(i, red, green, blue);
{
IS31FL3733_set_color( i, red, green, blue );
} }
} }
void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
{
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
uint8_t control_register_r = led.r / 8; uint8_t control_register_r = led.r / 8;
@ -203,49 +192,43 @@ void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, b
uint8_t bit_g = led.g % 8; uint8_t bit_g = led.g % 8;
uint8_t bit_b = led.b % 8; uint8_t bit_b = led.b % 8;
if ( red ) { if (red) {
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
} else { } else {
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
} }
if ( green ) { if (green) {
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
} else { } else {
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
} }
if ( blue ) { if (blue) {
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
} else { } else {
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
} }
g_led_control_registers_update_required[led.driver] = true; g_led_control_registers_update_required[led.driver] = true;
} }
void IS31FL3733_update_pwm_buffers( uint8_t addr, uint8_t index ) void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index) {
{ if (g_pwm_buffer_update_required[index]) {
if ( g_pwm_buffer_update_required[index] )
{
// Firstly we need to unlock the command register and select PG1 // Firstly we need to unlock the command register and select PG1
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
IS31FL3733_write_pwm_buffer( addr, g_pwm_buffer[index] ); IS31FL3733_write_pwm_buffer(addr, g_pwm_buffer[index]);
} }
g_pwm_buffer_update_required[index] = false; g_pwm_buffer_update_required[index] = false;
} }
void IS31FL3733_update_led_control_registers( uint8_t addr, uint8_t index ) void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index) {
{ if (g_led_control_registers_update_required[index]) {
if ( g_led_control_registers_update_required[index] )
{
// Firstly we need to unlock the command register and select PG0 // Firstly we need to unlock the command register and select PG0
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
for ( int i=0; i<24; i++ ) for (int i = 0; i < 24; i++) {
{ IS31FL3733_write_register(addr, i, g_led_control_registers[index][i]);
IS31FL3733_write_register(addr, i, g_led_control_registers[index][i] );
} }
} }
g_led_control_registers_update_required[index] = false; g_led_control_registers_update_required[index] = false;

View file

@ -16,7 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef IS31FL3733_DRIVER_H #ifndef IS31FL3733_DRIVER_H
#define IS31FL3733_DRIVER_H #define IS31FL3733_DRIVER_H
@ -24,7 +23,7 @@
#include <stdbool.h> #include <stdbool.h>
typedef struct is31_led { typedef struct is31_led {
uint8_t driver:2; uint8_t driver : 2;
uint8_t r; uint8_t r;
uint8_t g; uint8_t g;
uint8_t b; uint8_t b;
@ -32,21 +31,21 @@ typedef struct is31_led {
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
void IS31FL3733_init( uint8_t addr, uint8_t sync ); void IS31FL3733_init(uint8_t addr, uint8_t sync);
void IS31FL3733_write_register( uint8_t addr, uint8_t reg, uint8_t data ); void IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
void IS31FL3733_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); void IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3733_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
// This should not be called from an interrupt // This should not be called from an interrupt
// (eg. from a timer interrupt). // (eg. from a timer interrupt).
// Call this while idle (in between matrix scans). // Call this while idle (in between matrix scans).
// If the buffer is dirty, it will update the driver with the buffer. // If the buffer is dirty, it will update the driver with the buffer.
void IS31FL3733_update_pwm_buffers( uint8_t addr, uint8_t index ); void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3733_update_led_control_registers( uint8_t addr, uint8_t index ); void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01

View file

@ -14,13 +14,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#include <util/delay.h> # include <util/delay.h>
#else #else
#include "wait.h" # include "wait.h"
#endif #endif
#include "is31fl3736.h" #include "is31fl3736.h"
@ -28,8 +27,6 @@
#include "i2c_master.h" #include "i2c_master.h"
#include "progmem.h" #include "progmem.h"
// This is a 7-bit address, that gets left-shifted and bit 0 // This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol) // set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring: // The address will vary depending on your wiring:
@ -47,23 +44,23 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 //PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 //PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 //PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 //PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 //PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 //PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11// PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F //PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 //PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
#endif #endif
#ifndef ISSI_PERSISTENCE #ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -78,103 +75,95 @@ uint8_t g_twi_transfer_buffer[20];
uint8_t g_pwm_buffer[DRIVER_COUNT][192]; uint8_t g_pwm_buffer[DRIVER_COUNT][192];
bool g_pwm_buffer_update_required = false; bool g_pwm_buffer_update_required = false;
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } }; uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
bool g_led_control_registers_update_required = false; bool g_led_control_registers_update_required = false;
void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ) void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
{
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif #endif
} }
void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
{
// assumes PG1 is already selected // assumes PG1 is already selected
// transmit PWM registers in 12 transfers of 16 bytes // transmit PWM registers in 12 transfers of 16 bytes
// g_twi_transfer_buffer[] is 20 bytes // g_twi_transfer_buffer[] is 20 bytes
// iterate over the pwm_buffer contents at 16 byte intervals // iterate over the pwm_buffer contents at 16 byte intervals
for ( int i = 0; i < 192; i += 16 ) { for (int i = 0; i < 192; i += 16) {
g_twi_transfer_buffer[0] = i; g_twi_transfer_buffer[0] = i;
// copy the data from i to i+15 // copy the data from i to i+15
// device will auto-increment register for data after the first byte // device will auto-increment register for data after the first byte
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer // thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
for ( int j = 0; j < 16; j++ ) { for (int j = 0; j < 16; j++) {
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
} }
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
#endif #endif
} }
} }
void IS31FL3736_init( uint8_t addr ) void IS31FL3736_init(uint8_t addr) {
{
// In order to avoid the LEDs being driven with garbage data // In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, shutdown is enabled last. // in the LED driver's PWM registers, shutdown is enabled last.
// Set up the mode and other settings, clear the PWM registers, // Set up the mode and other settings, clear the PWM registers,
// then disable software shutdown. // then disable software shutdown.
// Unlock the command register. // Unlock the command register.
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG0 // Select PG0
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
// Turn off all LEDs. // Turn off all LEDs.
for ( int i = 0x00; i <= 0x17; i++ ) for (int i = 0x00; i <= 0x17; i++) {
{ IS31FL3736_write_register(addr, i, 0x00);
IS31FL3736_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG1 // Select PG1
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
// Set PWM on all LEDs to 0 // Set PWM on all LEDs to 0
// No need to setup Breath registers to PWM as that is the default. // No need to setup Breath registers to PWM as that is the default.
for ( int i = 0x00; i <= 0xBF; i++ ) for (int i = 0x00; i <= 0xBF; i++) {
{ IS31FL3736_write_register(addr, i, 0x00);
IS31FL3736_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG3 // Select PG3
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION ); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set global current to maximum. // Set global current to maximum.
IS31FL3736_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF ); IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3736_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 ); IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
// Wait 10ms to ensure the device has woken up. // Wait 10ms to ensure the device has woken up.
#ifdef __AVR__ #ifdef __AVR__
_delay_ms( 10 ); _delay_ms(10);
#else #else
wait_ms(10); wait_ms(10);
#endif #endif
} }
void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
{ if (index >= 0 && index < DRIVER_LED_TOTAL) {
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
g_pwm_buffer[led.driver][led.r] = red; g_pwm_buffer[led.driver][led.r] = red;
@ -184,16 +173,13 @@ void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
} }
} }
void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
{ for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) IS31FL3736_set_color(i, red, green, blue);
{
IS31FL3736_set_color( i, red, green, blue );
} }
} }
void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
{
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
// IS31FL3733 // IS31FL3733
@ -217,29 +203,27 @@ void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, b
uint8_t bit_g = led.g % 8; uint8_t bit_g = led.g % 8;
uint8_t bit_b = led.b % 8; uint8_t bit_b = led.b % 8;
if ( red ) { if (red) {
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
} else { } else {
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
} }
if ( green ) { if (green) {
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
} else { } else {
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
} }
if ( blue ) { if (blue) {
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
} else { } else {
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
} }
g_led_control_registers_update_required = true; g_led_control_registers_update_required = true;
} }
void IS31FL3736_mono_set_brightness( int index, uint8_t value ) void IS31FL3736_mono_set_brightness(int index, uint8_t value) {
{ if (index >= 0 && index < 96) {
if ( index >= 0 && index < 96 ) {
// Index in range 0..95 -> A1..A8, B1..B8, etc. // Index in range 0..95 -> A1..A8, B1..B8, etc.
// Map index 0..95 to registers 0x00..0xBE (interleaved) // Map index 0..95 to registers 0x00..0xBE (interleaved)
uint8_t pwm_register = index * 2; uint8_t pwm_register = index * 2;
@ -248,16 +232,13 @@ void IS31FL3736_mono_set_brightness( int index, uint8_t value )
} }
} }
void IS31FL3736_mono_set_brightness_all( uint8_t value ) void IS31FL3736_mono_set_brightness_all(uint8_t value) {
{ for (int i = 0; i < 96; i++) {
for ( int i = 0; i < 96; i++ ) IS31FL3736_mono_set_brightness(i, value);
{
IS31FL3736_mono_set_brightness( i, value );
} }
} }
void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ) void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled) {
{
// Index in range 0..95 -> A1..A8, B1..B8, etc. // Index in range 0..95 -> A1..A8, B1..B8, etc.
// Map index 0..95 to registers 0x00..0xBE (interleaved) // Map index 0..95 to registers 0x00..0xBE (interleaved)
@ -266,7 +247,7 @@ void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled )
uint8_t control_register = pwm_register / 8; uint8_t control_register = pwm_register / 8;
uint8_t bit = pwm_register % 8; uint8_t bit = pwm_register % 8;
if ( enabled ) { if (enabled) {
g_led_control_registers[0][control_register] |= (1 << bit); g_led_control_registers[0][control_register] |= (1 << bit);
} else { } else {
g_led_control_registers[0][control_register] &= ~(1 << bit); g_led_control_registers[0][control_register] &= ~(1 << bit);
@ -275,32 +256,26 @@ void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled )
g_led_control_registers_update_required = true; g_led_control_registers_update_required = true;
} }
void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
{ if (g_pwm_buffer_update_required) {
if ( g_pwm_buffer_update_required )
{
// Firstly we need to unlock the command register and select PG1 // Firstly we need to unlock the command register and select PG1
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
IS31FL3736_write_pwm_buffer( addr1, g_pwm_buffer[0] ); IS31FL3736_write_pwm_buffer(addr1, g_pwm_buffer[0]);
//IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] ); // IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] );
} }
g_pwm_buffer_update_required = false; g_pwm_buffer_update_required = false;
} }
void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
{ if (g_led_control_registers_update_required) {
if ( g_led_control_registers_update_required )
{
// Firstly we need to unlock the command register and select PG0 // Firstly we need to unlock the command register and select PG0
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
for ( int i=0; i<24; i++ ) for (int i = 0; i < 24; i++) {
{ IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i]);
IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i] ); // IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] );
//IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] );
} }
} }
} }

View file

@ -19,22 +19,19 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
// Simple interface option. // Simple interface option.
// If these aren't defined, just define them to make it compile // If these aren't defined, just define them to make it compile
#ifndef DRIVER_COUNT #ifndef DRIVER_COUNT
#define DRIVER_COUNT 2 # define DRIVER_COUNT 2
#endif #endif
#ifndef DRIVER_LED_TOTAL #ifndef DRIVER_LED_TOTAL
#define DRIVER_LED_TOTAL 96 # define DRIVER_LED_TOTAL 96
#endif #endif
typedef struct is31_led { typedef struct is31_led {
uint8_t driver:2; uint8_t driver : 2;
uint8_t r; uint8_t r;
uint8_t g; uint8_t g;
uint8_t b; uint8_t b;
@ -42,25 +39,25 @@ typedef struct is31_led {
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
void IS31FL3736_init( uint8_t addr ); void IS31FL3736_init(uint8_t addr);
void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ); void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
void IS31FL3736_mono_set_brightness( int index, uint8_t value ); void IS31FL3736_mono_set_brightness(int index, uint8_t value);
void IS31FL3736_mono_set_brightness_all( uint8_t value ); void IS31FL3736_mono_set_brightness_all(uint8_t value);
void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ); void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled);
// This should not be called from an interrupt // This should not be called from an interrupt
// (eg. from a timer interrupt). // (eg. from a timer interrupt).
// Call this while idle (in between matrix scans). // Call this while idle (in between matrix scans).
// If the buffer is dirty, it will update the driver with the buffer. // If the buffer is dirty, it will update the driver with the buffer.
void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ); void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ); void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define A_1 0x00 #define A_1 0x00
#define A_2 0x02 #define A_2 0x02
@ -169,4 +166,3 @@ void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 );
#define L_6 0xBA #define L_6 0xBA
#define L_7 0xBC #define L_7 0xBC
#define L_8 0xBE #define L_8 0xBE

View file

@ -17,11 +17,11 @@
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#include <util/delay.h> # include <util/delay.h>
#else #else
#include "wait.h" # include "wait.h"
#endif #endif
#include <string.h> #include <string.h>
@ -46,23 +46,23 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 //PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 //PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 //PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 //PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 //PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 //PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11// PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F //PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 //PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
#endif #endif
#ifndef ISSI_PERSISTENCE #ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -77,103 +77,95 @@ uint8_t g_twi_transfer_buffer[20];
uint8_t g_pwm_buffer[DRIVER_COUNT][192]; uint8_t g_pwm_buffer[DRIVER_COUNT][192];
bool g_pwm_buffer_update_required = false; bool g_pwm_buffer_update_required = false;
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 } }; uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}};
bool g_led_control_registers_update_required = false; bool g_led_control_registers_update_required = false;
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data ) void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
{
g_twi_transfer_buffer[0] = reg; g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data; g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif #endif
} }
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
{
// assumes PG1 is already selected // assumes PG1 is already selected
// transmit PWM registers in 12 transfers of 16 bytes // transmit PWM registers in 12 transfers of 16 bytes
// g_twi_transfer_buffer[] is 20 bytes // g_twi_transfer_buffer[] is 20 bytes
// iterate over the pwm_buffer contents at 16 byte intervals // iterate over the pwm_buffer contents at 16 byte intervals
for ( int i = 0; i < 192; i += 16 ) { for (int i = 0; i < 192; i += 16) {
g_twi_transfer_buffer[0] = i; g_twi_transfer_buffer[0] = i;
// copy the data from i to i+15 // copy the data from i to i+15
// device will auto-increment register for data after the first byte // device will auto-increment register for data after the first byte
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer // thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
for ( int j = 0; j < 16; j++ ) { for (int j = 0; j < 16; j++) {
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
} }
#if ISSI_PERSISTENCE > 0 #if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
break;
} }
#else #else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
#endif #endif
} }
} }
void IS31FL3737_init( uint8_t addr ) void IS31FL3737_init(uint8_t addr) {
{
// In order to avoid the LEDs being driven with garbage data // In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, shutdown is enabled last. // in the LED driver's PWM registers, shutdown is enabled last.
// Set up the mode and other settings, clear the PWM registers, // Set up the mode and other settings, clear the PWM registers,
// then disable software shutdown. // then disable software shutdown.
// Unlock the command register. // Unlock the command register.
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG0 // Select PG0
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
// Turn off all LEDs. // Turn off all LEDs.
for ( int i = 0x00; i <= 0x17; i++ ) for (int i = 0x00; i <= 0x17; i++) {
{ IS31FL3737_write_register(addr, i, 0x00);
IS31FL3737_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG1 // Select PG1
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
// Set PWM on all LEDs to 0 // Set PWM on all LEDs to 0
// No need to setup Breath registers to PWM as that is the default. // No need to setup Breath registers to PWM as that is the default.
for ( int i = 0x00; i <= 0xBF; i++ ) for (int i = 0x00; i <= 0xBF; i++) {
{ IS31FL3737_write_register(addr, i, 0x00);
IS31FL3737_write_register( addr, i, 0x00 );
} }
// Unlock the command register. // Unlock the command register.
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG3 // Select PG3
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION ); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set global current to maximum. // Set global current to maximum.
IS31FL3737_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF ); IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3737_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 ); IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
// Wait 10ms to ensure the device has woken up. // Wait 10ms to ensure the device has woken up.
#ifdef __AVR__ #ifdef __AVR__
_delay_ms( 10 ); _delay_ms(10);
#else #else
wait_ms(10); wait_ms(10);
#endif #endif
} }
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
{ if (index >= 0 && index < DRIVER_LED_TOTAL) {
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
g_pwm_buffer[led.driver][led.r] = red; g_pwm_buffer[led.driver][led.r] = red;
@ -183,16 +175,13 @@ void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
} }
} }
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
{ for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) IS31FL3737_set_color(i, red, green, blue);
{
IS31FL3737_set_color( i, red, green, blue );
} }
} }
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
{
is31_led led = g_is31_leds[index]; is31_led led = g_is31_leds[index];
uint8_t control_register_r = led.r / 8; uint8_t control_register_r = led.r / 8;
@ -202,51 +191,45 @@ void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, b
uint8_t bit_g = led.g % 8; uint8_t bit_g = led.g % 8;
uint8_t bit_b = led.b % 8; uint8_t bit_b = led.b % 8;
if ( red ) { if (red) {
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
} else { } else {
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
} }
if ( green ) { if (green) {
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
} else { } else {
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
} }
if ( blue ) { if (blue) {
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
} else { } else {
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
} }
g_led_control_registers_update_required = true; g_led_control_registers_update_required = true;
} }
void IS31FL3737_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
{ if (g_pwm_buffer_update_required) {
if ( g_pwm_buffer_update_required )
{
// Firstly we need to unlock the command register and select PG1 // Firstly we need to unlock the command register and select PG1
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
IS31FL3737_write_pwm_buffer( addr1, g_pwm_buffer[0] ); IS31FL3737_write_pwm_buffer(addr1, g_pwm_buffer[0]);
//IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] ); // IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] );
} }
g_pwm_buffer_update_required = false; g_pwm_buffer_update_required = false;
} }
void IS31FL3737_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
{ if (g_led_control_registers_update_required) {
if ( g_led_control_registers_update_required )
{
// Firstly we need to unlock the command register and select PG0 // Firstly we need to unlock the command register and select PG0
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
for ( int i=0; i<24; i++ ) for (int i = 0; i < 24; i++) {
{ IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i]);
IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i] ); // IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
//IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
} }
} }
} }

View file

@ -16,7 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef IS31FL3737_DRIVER_H #ifndef IS31FL3737_DRIVER_H
#define IS31FL3737_DRIVER_H #define IS31FL3737_DRIVER_H
@ -24,7 +23,7 @@
#include <stdbool.h> #include <stdbool.h>
typedef struct is31_led { typedef struct is31_led {
uint8_t driver:2; uint8_t driver : 2;
uint8_t r; uint8_t r;
uint8_t g; uint8_t g;
uint8_t b; uint8_t b;
@ -32,21 +31,21 @@ typedef struct is31_led {
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
void IS31FL3737_init( uint8_t addr ); void IS31FL3737_init(uint8_t addr);
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data ); void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
// This should not be called from an interrupt // This should not be called from an interrupt
// (eg. from a timer interrupt). // (eg. from a timer interrupt).
// Call this while idle (in between matrix scans). // Call this while idle (in between matrix scans).
// If the buffer is dirty, it will update the driver with the buffer. // If the buffer is dirty, it will update the driver with the buffer.
void IS31FL3737_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ); void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3737_update_led_control_registers( uint8_t addr1, uint8_t addr2 ); void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01

View file

@ -1,240 +1,25 @@
#pragma once #pragma once
#ifdef __AVR__ #ifdef __AVR__
#include <avr/io.h> # include <avr/io.h>
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#elif defined(ESP8266) #elif defined(ESP8266)
#include <pgmspace.h> # include <pgmspace.h>
#else #else
#define PROGMEM # define PROGMEM
#endif #endif
// Helidox 8x6 font with QMK Firmware Logo // Helidox 8x6 font with QMK Firmware Logo
// Online editor: http://teripom.x0.com/ // Online editor: http://teripom.x0.com/
static const unsigned char font[] PROGMEM = { static const unsigned char font[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0xF0, 0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0x3F, 0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0xF0, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFC, 0x3E,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x1E, 0x06, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xDF, 0xBF, 0xBF, 0x00, 0xBF, 0xBF, 0xDF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x60, 0x60, 0xE0, 0xBF, 0x1F, 0x00, 0x7F, 0x7F, 0x07, 0x1E, 0x38, 0x1E, 0x07, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x0E, 0x1F, 0x3B, 0x71, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x0C, 0x0C, 0x0C, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x7E, 0x7E, 0x03, 0x03, 0x7F, 0x7E, 0x00, 0x0F,
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, 0x3E, 0x70, 0x3C, 0x06, 0x3C, 0x70, 0x3E, 0x0F, 0x00, 0x32, 0x7B, 0x49, 0x49, 0x3F, 0x7E, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00, 0x1E, 0x3F, 0x69, 0x69, 0x6F, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x3C, 0x78, 0x70, 0x60, 0x00, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x7E, 0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x40, 0x40, 0xF0, 0xF8, 0xF8,
0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0x3F,
0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8,
0xF8, 0xF0, 0x40, 0x40, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00,
0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00,
0x80, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xF0, 0xF8, 0xFC, 0x3E,
0x1E, 0x06, 0x01, 0x00, 0x00, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x49, 0x49, 0x49, 0xFF, 0xFF, 0xFF,
0xFF, 0xE0, 0xDF, 0xBF, 0xBF, 0x00,
0xBF, 0xBF, 0xDF, 0xE0, 0xFF, 0xFF,
0xFF, 0xFF, 0x49, 0x49, 0x49, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F,
0x60, 0x60, 0xE0, 0xBF, 0x1F, 0x00,
0x7F, 0x7F, 0x07, 0x1E, 0x38, 0x1E,
0x07, 0x7F, 0x7F, 0x00, 0x7F, 0x7F,
0x0E, 0x1F, 0x3B, 0x71, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F,
0x0C, 0x0C, 0x0C, 0x00, 0x7E, 0x7E,
0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00,
0x7F, 0x7E, 0x03, 0x03, 0x7E, 0x7E,
0x03, 0x03, 0x7F, 0x7E, 0x00, 0x0F,
0x3E, 0x70, 0x3C, 0x06, 0x3C, 0x70,
0x3E, 0x0F, 0x00, 0x32, 0x7B, 0x49,
0x49, 0x3F, 0x7E, 0x00, 0x7F, 0x7E,
0x03, 0x03, 0x00, 0x1E, 0x3F, 0x69,
0x69, 0x6F, 0x26, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x3C,
0x78, 0x70, 0x60, 0x00, 0x00, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x07, 0x0F, 0x0F,
0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x7E,
0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F,
0x0F, 0x07, 0x01, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}; };

View file

@ -23,13 +23,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <string.h> #include <string.h>
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/io.h> # include <avr/io.h>
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#elif defined(ESP8266) #elif defined(ESP8266)
#include <pgmspace.h> # include <pgmspace.h>
#else // defined(ESP8266) #else // defined(ESP8266)
#define PROGMEM # define PROGMEM
#define memcpy_P(des, src, len) memcpy(des, src, len) # define memcpy_P(des, src, len) memcpy(des, src, len)
#endif // defined(__AVR__) #endif // defined(__AVR__)
// Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf // Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
@ -91,11 +91,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define I2C_CMD 0x00 #define I2C_CMD 0x00
#define I2C_DATA 0x40 #define I2C_DATA 0x40
#if defined(__AVR__) #if defined(__AVR__)
// already defined on ARM // already defined on ARM
#define I2C_TIMEOUT 100 # define I2C_TIMEOUT 100
#define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
#else // defined(__AVR__) #else // defined(__AVR__)
#define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
#endif // defined(__AVR__) #endif // defined(__AVR__)
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT) #define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, I2C_TIMEOUT) #define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, I2C_TIMEOUT)
@ -107,7 +107,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// parts of the display unusable or don't get cleared correctly // parts of the display unusable or don't get cleared correctly
// and also allows for drawing & inverting // and also allows for drawing & inverting
uint8_t oled_buffer[OLED_MATRIX_SIZE]; uint8_t oled_buffer[OLED_MATRIX_SIZE];
uint8_t* oled_cursor; uint8_t * oled_cursor;
OLED_BLOCK_TYPE oled_dirty = 0; OLED_BLOCK_TYPE oled_dirty = 0;
bool oled_initialized = false; bool oled_initialized = false;
bool oled_active = false; bool oled_active = false;
@ -115,10 +115,10 @@ bool oled_scrolling = false;
uint8_t oled_rotation = 0; uint8_t oled_rotation = 0;
uint8_t oled_rotation_width = 0; uint8_t oled_rotation_width = 0;
#if OLED_TIMEOUT > 0 #if OLED_TIMEOUT > 0
uint32_t oled_timeout; uint32_t oled_timeout;
#endif #endif
#if OLED_SCROLL_TIMEOUT > 0 #if OLED_SCROLL_TIMEOUT > 0
uint32_t oled_scroll_timeout; uint32_t oled_scroll_timeout;
#endif #endif
// Internal variables to reduce math instructions // Internal variables to reduce math instructions
@ -126,11 +126,11 @@ uint8_t oled_rotation_width = 0;
#if defined(__AVR__) #if defined(__AVR__)
// identical to i2c_transmit, but for PROGMEM since all initialization is in PROGMEM arrays currently // identical to i2c_transmit, but for PROGMEM since all initialization is in PROGMEM arrays currently
// probably should move this into i2c_master... // probably should move this into i2c_master...
static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) { static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t *data, uint16_t length, uint16_t timeout) {
i2c_status_t status = i2c_start(address | I2C_WRITE, timeout); i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
for (uint16_t i = 0; i < length && status >= 0; i++) { for (uint16_t i = 0; i < length && status >= 0; i++) {
status = i2c_write(pgm_read_byte((const char*)data++), timeout); status = i2c_write(pgm_read_byte((const char *)data++), timeout);
if (status) break; if (status) break;
} }
@ -141,8 +141,7 @@ static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_
#endif #endif
// Flips the rendering bits for a character at the current cursor position // Flips the rendering bits for a character at the current cursor position
static void InvertCharacter(uint8_t *cursor) static void InvertCharacter(uint8_t *cursor) {
{
const uint8_t *end = cursor + OLED_FONT_WIDTH; const uint8_t *end = cursor + OLED_FONT_WIDTH;
while (cursor < end) { while (cursor < end) {
*cursor = ~(*cursor); *cursor = ~(*cursor);
@ -162,14 +161,19 @@ bool oled_init(uint8_t rotation) {
static const uint8_t PROGMEM display_setup1[] = { static const uint8_t PROGMEM display_setup1[] = {
I2C_CMD, I2C_CMD,
DISPLAY_OFF, DISPLAY_OFF,
DISPLAY_CLOCK, 0x80, DISPLAY_CLOCK,
MULTIPLEX_RATIO, OLED_DISPLAY_HEIGHT - 1, 0x80,
DISPLAY_OFFSET, 0x00, MULTIPLEX_RATIO,
OLED_DISPLAY_HEIGHT - 1,
DISPLAY_OFFSET,
0x00,
DISPLAY_START_LINE | 0x00, DISPLAY_START_LINE | 0x00,
CHARGE_PUMP, 0x14, CHARGE_PUMP,
0x14,
#if (OLED_IC != OLED_IC_SH1106) #if (OLED_IC != OLED_IC_SH1106)
// MEMORY_MODE is unsupported on SH1106 (Page Addressing only) // MEMORY_MODE is unsupported on SH1106 (Page Addressing only)
MEMORY_MODE, 0x00, // Horizontal addressing mode MEMORY_MODE,
0x00, // Horizontal addressing mode
#endif #endif
}; };
if (I2C_TRANSMIT_P(display_setup1) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_setup1) != I2C_STATUS_SUCCESS) {
@ -178,35 +182,20 @@ bool oled_init(uint8_t rotation) {
} }
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_180)) { if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_180)) {
static const uint8_t PROGMEM display_normal[] = { static const uint8_t PROGMEM display_normal[] = {I2C_CMD, SEGMENT_REMAP_INV, COM_SCAN_DEC};
I2C_CMD,
SEGMENT_REMAP_INV,
COM_SCAN_DEC };
if (I2C_TRANSMIT_P(display_normal) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_normal) != I2C_STATUS_SUCCESS) {
print("oled_init cmd normal rotation failed\n"); print("oled_init cmd normal rotation failed\n");
return false; return false;
} }
} else { } else {
static const uint8_t PROGMEM display_flipped[] = { static const uint8_t PROGMEM display_flipped[] = {I2C_CMD, SEGMENT_REMAP, COM_SCAN_INC};
I2C_CMD,
SEGMENT_REMAP,
COM_SCAN_INC };
if (I2C_TRANSMIT_P(display_flipped) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_flipped) != I2C_STATUS_SUCCESS) {
print("display_flipped failed\n"); print("display_flipped failed\n");
return false; return false;
} }
} }
static const uint8_t PROGMEM display_setup2[] = { static const uint8_t PROGMEM display_setup2[] = {I2C_CMD, COM_PINS, OLED_COM_PINS, CONTRAST, 0x8F, PRE_CHARGE_PERIOD, 0xF1, VCOM_DETECT, 0x40, DISPLAY_ALL_ON_RESUME, NORMAL_DISPLAY, DEACTIVATE_SCROLL, DISPLAY_ON};
I2C_CMD,
COM_PINS, OLED_COM_PINS,
CONTRAST, 0x8F,
PRE_CHARGE_PERIOD, 0xF1,
VCOM_DETECT, 0x40,
DISPLAY_ALL_ON_RESUME,
NORMAL_DISPLAY,
DEACTIVATE_SCROLL,
DISPLAY_ON };
if (I2C_TRANSMIT_P(display_setup2) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_setup2) != I2C_STATUS_SUCCESS) {
print("display_setup2 failed\n"); print("display_setup2 failed\n");
return false; return false;
@ -226,10 +215,7 @@ bool oled_init(uint8_t rotation) {
return true; return true;
} }
__attribute__((weak)) __attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) { return rotation; }
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return rotation;
}
void oled_clear(void) { void oled_clear(void) {
memset(oled_buffer, 0, sizeof(oled_buffer)); memset(oled_buffer, 0, sizeof(oled_buffer));
@ -237,8 +223,7 @@ void oled_clear(void) {
oled_dirty = -1; // -1 will be max value as long as display_dirty is unsigned type oled_dirty = -1; // -1 will be max value as long as display_dirty is unsigned type
} }
static void calc_bounds(uint8_t update_start, uint8_t* cmd_array) static void calc_bounds(uint8_t update_start, uint8_t *cmd_array) {
{
// Calculate commands to set memory addressing bounds. // Calculate commands to set memory addressing bounds.
uint8_t start_page = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_WIDTH; uint8_t start_page = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_WIDTH;
uint8_t start_column = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_WIDTH; uint8_t start_column = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_WIDTH;
@ -260,23 +245,21 @@ static void calc_bounds(uint8_t update_start, uint8_t* cmd_array)
#endif #endif
} }
static void calc_bounds_90(uint8_t update_start, uint8_t* cmd_array) static void calc_bounds_90(uint8_t update_start, uint8_t *cmd_array) {
{
cmd_array[1] = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8; cmd_array[1] = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8;
cmd_array[4] = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT; cmd_array[4] = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT;
cmd_array[2] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8 - 1 + cmd_array[1];; cmd_array[2] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8 - 1 + cmd_array[1];
;
cmd_array[5] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) % OLED_DISPLAY_HEIGHT / 8; cmd_array[5] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) % OLED_DISPLAY_HEIGHT / 8;
} }
uint8_t crot(uint8_t a, int8_t n) uint8_t crot(uint8_t a, int8_t n) {
{
const uint8_t mask = 0x7; const uint8_t mask = 0x7;
n &= mask; n &= mask;
return a << n | a >> (-n & mask); return a << n | a >> (-n & mask);
} }
static void rotate_90(const uint8_t* src, uint8_t* dest) static void rotate_90(const uint8_t *src, uint8_t *dest) {
{
for (uint8_t i = 0, shift = 7; i < 8; ++i, --shift) { for (uint8_t i = 0, shift = 7; i < 8; ++i, --shift) {
uint8_t selector = (1 << i); uint8_t selector = (1 << i);
for (uint8_t j = 0; j < 8; ++j) { for (uint8_t j = 0; j < 8; ++j) {
@ -293,13 +276,12 @@ void oled_render(void) {
// Find first dirty block // Find first dirty block
uint8_t update_start = 0; uint8_t update_start = 0;
while (!(oled_dirty & (1 << update_start))) { ++update_start; } while (!(oled_dirty & (1 << update_start))) {
++update_start;
}
// Set column & page position // Set column & page position
static uint8_t display_start[] = { static uint8_t display_start[] = {I2C_CMD, COLUMN_ADDR, 0, OLED_DISPLAY_WIDTH - 1, PAGE_ADDR, 0, OLED_DISPLAY_HEIGHT / 8 - 1};
I2C_CMD,
COLUMN_ADDR, 0, OLED_DISPLAY_WIDTH - 1,
PAGE_ADDR, 0, OLED_DISPLAY_HEIGHT / 8 - 1 };
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) { if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {
calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start
} else { } else {
@ -325,7 +307,7 @@ void oled_render(void) {
static uint8_t temp_buffer[OLED_BLOCK_SIZE]; static uint8_t temp_buffer[OLED_BLOCK_SIZE];
memset(temp_buffer, 0, sizeof(temp_buffer)); memset(temp_buffer, 0, sizeof(temp_buffer));
for(uint8_t i = 0; i < sizeof(source_map); ++i) { for (uint8_t i = 0; i < sizeof(source_map); ++i) {
rotate_90(&oled_buffer[OLED_BLOCK_SIZE * update_start + source_map[i]], &temp_buffer[target_map[i]]); rotate_90(&oled_buffer[OLED_BLOCK_SIZE * update_start + source_map[i]], &temp_buffer[target_map[i]]);
} }
@ -363,8 +345,7 @@ void oled_advance_page(bool clearPageRemainder) {
remaining = remaining / OLED_FONT_WIDTH; remaining = remaining / OLED_FONT_WIDTH;
// Write empty character until next line // Write empty character until next line
while (remaining--) while (remaining--) oled_write_char(' ', false);
oled_write_char(' ', false);
} else { } else {
// Next page index out of bounds? // Next page index out of bounds?
if (index + remaining >= OLED_MATRIX_SIZE) { if (index + remaining >= OLED_MATRIX_SIZE) {
@ -471,7 +452,7 @@ bool oled_on(void) {
oled_timeout = timer_read32() + OLED_TIMEOUT; oled_timeout = timer_read32() + OLED_TIMEOUT;
#endif #endif
static const uint8_t PROGMEM display_on[] = { I2C_CMD, DISPLAY_ON }; static const uint8_t PROGMEM display_on[] = {I2C_CMD, DISPLAY_ON};
if (!oled_active) { if (!oled_active) {
if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {
print("oled_on cmd failed\n"); print("oled_on cmd failed\n");
@ -483,7 +464,7 @@ bool oled_on(void) {
} }
bool oled_off(void) { bool oled_off(void) {
static const uint8_t PROGMEM display_off[] = { I2C_CMD, DISPLAY_OFF }; static const uint8_t PROGMEM display_off[] = {I2C_CMD, DISPLAY_OFF};
if (oled_active) { if (oled_active) {
if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {
print("oled_off cmd failed\n"); print("oled_off cmd failed\n");
@ -498,8 +479,7 @@ bool oled_scroll_right(void) {
// Dont enable scrolling if we need to update the display // Dont enable scrolling if we need to update the display
// This prevents scrolling of bad data from starting the scroll too early after init // This prevents scrolling of bad data from starting the scroll too early after init
if (!oled_dirty && !oled_scrolling) { if (!oled_dirty && !oled_scrolling) {
static const uint8_t PROGMEM display_scroll_right[] = { static const uint8_t PROGMEM display_scroll_right[] = {I2C_CMD, SCROLL_RIGHT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL};
I2C_CMD, SCROLL_RIGHT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL };
if (I2C_TRANSMIT_P(display_scroll_right) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_scroll_right) != I2C_STATUS_SUCCESS) {
print("oled_scroll_right cmd failed\n"); print("oled_scroll_right cmd failed\n");
return oled_scrolling; return oled_scrolling;
@ -513,8 +493,7 @@ bool oled_scroll_left(void) {
// Dont enable scrolling if we need to update the display // Dont enable scrolling if we need to update the display
// This prevents scrolling of bad data from starting the scroll too early after init // This prevents scrolling of bad data from starting the scroll too early after init
if (!oled_dirty && !oled_scrolling) { if (!oled_dirty && !oled_scrolling) {
static const uint8_t PROGMEM display_scroll_left[] = { static const uint8_t PROGMEM display_scroll_left[] = {I2C_CMD, SCROLL_LEFT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL};
I2C_CMD, SCROLL_LEFT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL };
if (I2C_TRANSMIT_P(display_scroll_left) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_scroll_left) != I2C_STATUS_SUCCESS) {
print("oled_scroll_left cmd failed\n"); print("oled_scroll_left cmd failed\n");
return oled_scrolling; return oled_scrolling;
@ -526,7 +505,7 @@ bool oled_scroll_left(void) {
bool oled_scroll_off(void) { bool oled_scroll_off(void) {
if (oled_scrolling) { if (oled_scrolling) {
static const uint8_t PROGMEM display_scroll_off[] = { I2C_CMD, DEACTIVATE_SCROLL }; static const uint8_t PROGMEM display_scroll_off[] = {I2C_CMD, DEACTIVATE_SCROLL};
if (I2C_TRANSMIT_P(display_scroll_off) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_scroll_off) != I2C_STATUS_SUCCESS) {
print("oled_scroll_off cmd failed\n"); print("oled_scroll_off cmd failed\n");
return oled_scrolling; return oled_scrolling;
@ -579,15 +558,13 @@ void oled_task(void) {
#if OLED_SCROLL_TIMEOUT > 0 #if OLED_SCROLL_TIMEOUT > 0
if (!oled_scrolling && timer_expired32(timer_read32(), oled_scroll_timeout)) { if (!oled_scrolling && timer_expired32(timer_read32(), oled_scroll_timeout)) {
#ifdef OLED_SCROLL_TIMEOUT_RIGHT # ifdef OLED_SCROLL_TIMEOUT_RIGHT
oled_scroll_right(); oled_scroll_right();
#else # else
oled_scroll_left(); oled_scroll_left();
#endif # endif
} }
#endif #endif
} }
__attribute__((weak)) __attribute__((weak)) void oled_task_user(void) {}
void oled_task_user(void) {
}

View file

@ -24,126 +24,130 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define OLED_IC_SH1106 1 #define OLED_IC_SH1106 1
#if defined(OLED_DISPLAY_CUSTOM) #if defined(OLED_DISPLAY_CUSTOM)
// Expected user to implement the necessary defines // Expected user to implement the necessary defines
#elif defined(OLED_DISPLAY_128X64) #elif defined(OLED_DISPLAY_128X64)
// Double height 128x64 // Double height 128x64
#ifndef OLED_DISPLAY_WIDTH # ifndef OLED_DISPLAY_WIDTH
#define OLED_DISPLAY_WIDTH 128 # define OLED_DISPLAY_WIDTH 128
#endif # endif
#ifndef OLED_DISPLAY_HEIGHT # ifndef OLED_DISPLAY_HEIGHT
#define OLED_DISPLAY_HEIGHT 64 # define OLED_DISPLAY_HEIGHT 64
#endif # endif
#ifndef OLED_MATRIX_SIZE # ifndef OLED_MATRIX_SIZE
#define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed) # define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed)
#endif # endif
#ifndef OLED_BLOCK_TYPE # ifndef OLED_BLOCK_TYPE
#define OLED_BLOCK_TYPE uint16_t # define OLED_BLOCK_TYPE uint16_t
#endif # endif
#ifndef OLED_BLOCK_COUNT # ifndef OLED_BLOCK_COUNT
#define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed) # define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed)
#endif # endif
#ifndef OLED_BLOCK_SIZE # ifndef OLED_BLOCK_SIZE
#define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) # define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
#endif # endif
#ifndef OLED_COM_PINS # ifndef OLED_COM_PINS
#define OLED_COM_PINS COM_PINS_ALT # define OLED_COM_PINS COM_PINS_ALT
#endif # endif
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
#ifndef OLED_SOURCE_MAP # ifndef OLED_SOURCE_MAP
#define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } # define OLED_SOURCE_MAP \
#endif { 0, 8, 16, 24, 32, 40, 48, 56 }
#ifndef OLED_TARGET_MAP # endif
#define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 } # ifndef OLED_TARGET_MAP
#endif # define OLED_TARGET_MAP \
// If OLED_BLOCK_TYPE is uint32_t, these tables would look like: { 56, 48, 40, 32, 24, 16, 8, 0 }
// #define OLED_SOURCE_MAP { 32, 40, 48, 56 } # endif
// #define OLED_TARGET_MAP { 24, 16, 8, 0 } // If OLED_BLOCK_TYPE is uint32_t, these tables would look like:
// If OLED_BLOCK_TYPE is uint16_t, these tables would look like: // #define OLED_SOURCE_MAP { 32, 40, 48, 56 }
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } // #define OLED_TARGET_MAP { 24, 16, 8, 0 }
// #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 } // If OLED_BLOCK_TYPE is uint16_t, these tables would look like:
// If OLED_BLOCK_TYPE is uint8_t, these tables would look like: // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 } // #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 }
// #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 } // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 }
// #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 }
#else // defined(OLED_DISPLAY_128X64) #else // defined(OLED_DISPLAY_128X64)
// Default 128x32 // Default 128x32
#ifndef OLED_DISPLAY_WIDTH # ifndef OLED_DISPLAY_WIDTH
#define OLED_DISPLAY_WIDTH 128 # define OLED_DISPLAY_WIDTH 128
#endif # endif
#ifndef OLED_DISPLAY_HEIGHT # ifndef OLED_DISPLAY_HEIGHT
#define OLED_DISPLAY_HEIGHT 32 # define OLED_DISPLAY_HEIGHT 32
#endif # endif
#ifndef OLED_MATRIX_SIZE # ifndef OLED_MATRIX_SIZE
#define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed) # define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed)
#endif # endif
#ifndef OLED_BLOCK_TYPE # ifndef OLED_BLOCK_TYPE
#define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only # define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only
#endif # endif
#ifndef OLED_BLOCK_COUNT # ifndef OLED_BLOCK_COUNT
#define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed) # define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed)
#endif # endif
#ifndef OLED_BLOCK_SIZE # ifndef OLED_BLOCK_SIZE
#define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) # define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
#endif # endif
#ifndef OLED_COM_PINS # ifndef OLED_COM_PINS
#define OLED_COM_PINS COM_PINS_SEQ # define OLED_COM_PINS COM_PINS_SEQ
#endif # endif
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
#ifndef OLED_SOURCE_MAP # ifndef OLED_SOURCE_MAP
#define OLED_SOURCE_MAP { 0, 8, 16, 24 } # define OLED_SOURCE_MAP \
#endif { 0, 8, 16, 24 }
#ifndef OLED_TARGET_MAP # endif
#define OLED_TARGET_MAP { 24, 16, 8, 0 } # ifndef OLED_TARGET_MAP
#endif # define OLED_TARGET_MAP \
// If OLED_BLOCK_TYPE is uint8_t, these tables would look like: { 24, 16, 8, 0 }
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } # endif
// #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 } // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
// #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 }
#endif // defined(OLED_DISPLAY_CUSTOM) #endif // defined(OLED_DISPLAY_CUSTOM)
#if !defined(OLED_IC) #if !defined(OLED_IC)
#define OLED_IC OLED_IC_SSD1306 # define OLED_IC OLED_IC_SSD1306
#endif #endif
// the column address corresponding to the first column in the display hardware // the column address corresponding to the first column in the display hardware
#if !defined(OLED_COLUMN_OFFSET) #if !defined(OLED_COLUMN_OFFSET)
#define OLED_COLUMN_OFFSET 0 # define OLED_COLUMN_OFFSET 0
#endif #endif
// Address to use for the i2c oled communication // Address to use for the i2c oled communication
#if !defined(OLED_DISPLAY_ADDRESS) #if !defined(OLED_DISPLAY_ADDRESS)
#define OLED_DISPLAY_ADDRESS 0x3C # define OLED_DISPLAY_ADDRESS 0x3C
#endif #endif
// Custom font file to use // Custom font file to use
#if !defined(OLED_FONT_H) #if !defined(OLED_FONT_H)
#define OLED_FONT_H "glcdfont.c" # define OLED_FONT_H "glcdfont.c"
#endif #endif
// unsigned char value of the first character in the font file // unsigned char value of the first character in the font file
#if !defined(OLED_FONT_START) #if !defined(OLED_FONT_START)
#define OLED_FONT_START 0 # define OLED_FONT_START 0
#endif #endif
// unsigned char value of the last character in the font file // unsigned char value of the last character in the font file
#if !defined(OLED_FONT_END) #if !defined(OLED_FONT_END)
#define OLED_FONT_END 224 # define OLED_FONT_END 224
#endif #endif
// Font render width // Font render width
#if !defined(OLED_FONT_WIDTH) #if !defined(OLED_FONT_WIDTH)
#define OLED_FONT_WIDTH 6 # define OLED_FONT_WIDTH 6
#endif #endif
// Font render height // Font render height
#if !defined(OLED_FONT_HEIGHT) #if !defined(OLED_FONT_HEIGHT)
#define OLED_FONT_HEIGHT 8 # define OLED_FONT_HEIGHT 8
#endif #endif
#if !defined(OLED_TIMEOUT) #if !defined(OLED_TIMEOUT)
#if defined(OLED_DISABLE_TIMEOUT) # if defined(OLED_DISABLE_TIMEOUT)
#define OLED_TIMEOUT 0 # define OLED_TIMEOUT 0
#else # else
#define OLED_TIMEOUT 60000 # define OLED_TIMEOUT 60000
#endif # endif
#endif #endif
// OLED Rotation enum values are flags // OLED Rotation enum values are flags
@ -208,14 +212,14 @@ void oled_write_P(const char *data, bool invert);
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM // Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
void oled_write_ln_P(const char *data, bool invert); void oled_write_ln_P(const char *data, bool invert);
#else #else
// Writes a string to the buffer at current cursor position // Writes a string to the buffer at current cursor position
// Advances the cursor while writing, inverts the pixels if true // Advances the cursor while writing, inverts the pixels if true
#define oled_write_P(data, invert) oled_write(data, invert) # define oled_write_P(data, invert) oled_write(data, invert)
// Writes a string to the buffer at current cursor position // Writes a string to the buffer at current cursor position
// Advances the cursor while writing, inverts the pixels if true // Advances the cursor while writing, inverts the pixels if true
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page // Advances the cursor to the next page, wiring ' ' to the remainder of the current page
#define oled_write_ln_P(data, invert) oled_write(data, invert) # define oled_write_ln_P(data, invert) oled_write(data, invert)
#endif // defined(__AVR__) #endif // defined(__AVR__)
// Can be used to manually turn on the screen if it is off // Can be used to manually turn on the screen if it is off

View file

@ -35,16 +35,21 @@
#include "string.h" #include "string.h"
#define TOTALFONTS 2 #define TOTALFONTS 2
const unsigned char * fonts_pointer[]= { font5x7, font8x16 }; const unsigned char* fonts_pointer[] = {font5x7, font8x16};
uint8_t foreColor,drawMode,fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY; uint8_t foreColor, drawMode, fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY;
uint16_t fontMapWidth; uint16_t fontMapWidth;
#define _BV(x) (1 << (x)) #define _BV(x) (1 << (x))
#define swap(a, b) { uint8_t t = a; a = b; b = t; } #define swap(a, b) \
{ \
uint8_t t = a; \
a = b; \
b = t; \
}
uint8_t micro_oled_transfer_buffer[20]; uint8_t micro_oled_transfer_buffer[20];
static uint8_t micro_oled_screen_current[LCDWIDTH*LCDWIDTH/8] = { 0 }; static uint8_t micro_oled_screen_current[LCDWIDTH * LCDWIDTH / 8] = {0};
/* LCD Memory organised in 64 horizontal pixel and 6 rows of byte /* LCD Memory organised in 64 horizontal pixel and 6 rows of byte
B B .............B ----- B B .............B -----
@ -64,256 +69,39 @@ static uint8_t micro_oled_screen_current[LCDWIDTH*LCDWIDTH/8] = { 0 };
*/ */
#if LCDWIDTH == 64 #if LCDWIDTH == 64
#if LCDWIDTH == 48 # if LCDWIDTH == 48
static uint8_t micro_oled_screen_buffer[] = { static uint8_t micro_oled_screen_buffer[] = {
// QMK Logo - generated at http://www.majer.ch/lcd/adf_bitmap.php // QMK Logo - generated at http://www.majer.ch/lcd/adf_bitmap.php
//64x48 image // 64x48 image
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0xF8, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xF8, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xE3, 0xE7, 0xCF, 0xCF, 0xCF, 0xCF, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0xC7, 0xE7, 0xE3, 0xF1, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, # endif
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60,
0xF8, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE,
0xFE, 0xF8, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x8C, 0x8C, 0x8C, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xE3, 0xE7, 0xCF,
0xCF, 0xCF, 0xCF, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0xC7, 0xE7,
0xE3, 0xF1, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x31, 0x31, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06,
0x06, 0x06, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x7F, 0x7F, 0x1F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
#endif
#elif LCDWIDTH == 128 #elif LCDWIDTH == 128
#if LCDHEIGHT == 32 # if LCDHEIGHT == 32
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = { static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {
//128x32 qmk image // 128x32 qmk image
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xFC, 0xFC, 0xE0, 0xF0, 0xFC, 0xE0, 0xE0, 0xFC, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x30, 0xE0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB2, 0xB2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB2, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x02, 0x03, 0x01, 0x00, 0x06, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x06, 0x00, 0x03, 0x1E, 0x18, 0x0F, 0x01, 0x0F, 0x18, 0x1E, 0x01, 0x00, 0x0F, 0x1F, 0x12, 0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x12, 0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF9, 0xF3, 0xF3, 0xC0, 0x80, 0xF3, 0xF3, 0xF3, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0xC0, 0x00, 0x70, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x1C, 0xF0, 0x00, 0x00, 0xFC, 0x0C, 0x38, 0xE0, 0x00, 0x00, 0xC0, 0x38, 0x0C, 0xFC, 0x00, 0x00, 0xFC, 0xFC, 0x60, 0x90, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xF0, 0xFC, 0xE0, 0xE0, 0xFC, 0xE0, 0xE0, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x3F, 0x3F, 0x07, 0x3F, 0x3F, 0x07, 0x0F, 0x3F, 0x07, 0x07, 0x3F, 0x07, 0x07, 0x3F, 0x3F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x04, 0x04, 0x07, 0x01, 0x00, 0x00, 0x13, 0x1E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x04, 0x04, 0x04, 0x04, 0x07, 0x0D, 0x08, 0x00, 0x07, 0x00, 0x00, 0x01, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x07, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # elif LCDHEIGHT == 64
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0x7F, 0x7E, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x7F, 0x7F, 0xFE, 0xFE, 0xFF, 0xFF, 0xFE, 0x7E, 0x7F, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF3, 0xF3, 0xE7, 0xE7, 0x00, 0x00, 0xE7, 0xE7, 0xF3, 0xF3, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x80, 0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x70, 0x88, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x00, 0x3C, 0xE0, 0xC0, 0x38, 0x1C, 0xE0, 0x80, 0x70, 0x0C, 0x00, 0xF8, 0xAC, 0x24, 0x24, 0x3C, 0x30, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x00, 0xF8, 0xAC, 0x24, 0x24, 0x2C, 0x30, 0x00, 0x70, 0xDC, 0x04, 0x04, 0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x8C, 0x04, 0x04, 0xF8, 0x00, 0x04, 0x3C, 0xE0, 0x80, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x01, 0x01, 0x01, 0x81, 0xFE, 0x3C, 0x00, 0x00, 0xFF, 0x03, 0x0E, 0x70, 0xC0, 0xE0, 0x38, 0x06, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x18, 0x38, 0x66, 0xC3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB2, 0xB2, 0xFF, // TODO: generate bitmap of QMK logo here
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0x03, # endif
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF,
0xFF, 0xB7, 0xB2, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1F, 0x02, 0x02, 0x03, 0x01, 0x00, 0x06, 0x1F, 0x10,
0x10, 0x10, 0x1F, 0x06, 0x00, 0x03, 0x1E, 0x18, 0x0F, 0x01,
0x0F, 0x18, 0x1E, 0x01, 0x00, 0x0F, 0x1F, 0x12, 0x02, 0x12,
0x13, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x12,
0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x4D, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0xF8, 0xF9, 0xF3, 0xF3, 0xC0, 0x80, 0xF3,
0xF3, 0xF3, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED,
0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0xC0, 0x00, 0x70, 0xC0,
0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C,
0x04, 0x04, 0x04, 0x04, 0x1C, 0xF0, 0x00, 0x00, 0xFC, 0x0C,
0x38, 0xE0, 0x00, 0x00, 0xC0, 0x38, 0x0C, 0xFC, 0x00, 0x00,
0xFC, 0xFC, 0x60, 0x90, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x3F,
0x3F, 0x07, 0x3F, 0x3F, 0x07, 0x0F, 0x3F, 0x07, 0x07, 0x3F,
0x07, 0x07, 0x3F, 0x3F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0x06, 0x04, 0x04, 0x07, 0x01, 0x00, 0x00, 0x13, 0x1E, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x04, 0x04,
0x04, 0x04, 0x07, 0x0D, 0x08, 0x00, 0x07, 0x00, 0x00, 0x01,
0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x07,
0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
#elif LCDHEIGHT == 64
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00,
0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xC0, 0xC0, 0xC0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF,
0x7F, 0x7E, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x7F, 0x7F, 0xFE,
0xFE, 0xFF, 0xFF, 0xFE, 0x7E, 0x7F, 0xFF, 0xFE, 0xFE, 0xFC,
0xFC, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x88, 0x88, 0x88, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xDD, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF3, 0xF3, 0xE7, 0xE7, 0x00,
0x00, 0xE7, 0xE7, 0xF3, 0xF3, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x3F,
0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F,
0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF,
0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00,
0x80, 0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x80, 0x01,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x70,
0x88, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x00, 0x3C, 0xE0, 0xC0,
0x38, 0x1C, 0xE0, 0x80, 0x70, 0x0C, 0x00, 0xF8, 0xAC, 0x24,
0x24, 0x3C, 0x30, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x00, 0xF8,
0xAC, 0x24, 0x24, 0x2C, 0x30, 0x00, 0x70, 0xDC, 0x04, 0x04,
0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x8C, 0x04, 0x04, 0xF8, 0x00, 0x04, 0x3C, 0xE0, 0x80, 0xF0,
0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x01, 0x01,
0x01, 0x81, 0xFE, 0x3C, 0x00, 0x00, 0xFF, 0x03, 0x0E, 0x70,
0xC0, 0xE0, 0x38, 0x06, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x18,
0x38, 0x66, 0xC3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//TODO: generate bitmap of QMK logo here
#endif
#else #else
//catchall for custom screen szies // catchall for custom screen szies
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {0}; static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {0};
#endif #endif
void micro_oled_init(void) { void micro_oled_init(void) {
i2c_init(); i2c_init();
i2c_start(I2C_ADDRESS_SA0_1); i2c_start(I2C_ADDRESS_SA0_1);
@ -338,11 +126,11 @@ void micro_oled_init(void) {
send_command(NORMALDISPLAY); // 0xA6 send_command(NORMALDISPLAY); // 0xA6
send_command(DISPLAYALLONRESUME); // 0xA4 send_command(DISPLAYALLONRESUME); // 0xA4
//display at regular orientation // display at regular orientation
send_command(SEGREMAP | 0x1); send_command(SEGREMAP | 0x1);
send_command(COMSCANDEC); send_command(COMSCANDEC);
//rotate display 180 // rotate display 180
#ifdef micro_oled_rotate_180 #ifdef micro_oled_rotate_180
send_command(SEGREMAP); send_command(SEGREMAP);
send_command(COMSCANINC); send_command(COMSCANINC);
@ -352,11 +140,11 @@ void micro_oled_init(void) {
send_command(0x10); send_command(0x10);
send_command(SETCOMPINS); // 0xDA send_command(SETCOMPINS); // 0xDA
if (LCDHEIGHT > 32) { if (LCDHEIGHT > 32) {
send_command(0x12); send_command(0x12);
} else { } else {
send_command(0x02); send_command(0x02);
} }
send_command(SETCONTRAST); // 0x81 send_command(SETCONTRAST); // 0x81
send_command(0x8F); send_command(0x8F);
@ -395,18 +183,18 @@ void set_page_address(uint8_t address) {
Send column address command and address to the SSD1306 OLED controller. Send column address command and address to the SSD1306 OLED controller.
*/ */
void set_column_address(uint8_t address) { void set_column_address(uint8_t address) {
send_command( ( 0x10 | (address >> 4) ) + ((128 - LCDWIDTH) >> 8) ); send_command((0x10 | (address >> 4)) + ((128 - LCDWIDTH) >> 8));
send_command( 0x0F & address ); send_command(0x0F & address);
} }
/** \brief Clear SSD1306's memory. /** \brief Clear SSD1306's memory.
To clear GDRAM inside the LCD controller. To clear GDRAM inside the LCD controller.
*/ */
void clear_screen(void) { void clear_screen(void) {
for (int i=0;i<8; i++) { for (int i = 0; i < 8; i++) {
set_page_address(i); set_page_address(i);
set_column_address(0); set_column_address(0);
for (int j=0; j<0x80; j++) { for (int j = 0; j < 0x80; j++) {
send_data(0); send_data(0);
} }
} }
@ -416,8 +204,8 @@ void clear_screen(void) {
To clear GDRAM inside the LCD controller. To clear GDRAM inside the LCD controller.
*/ */
void clear_buffer(void) { void clear_buffer(void) {
//384 // 384
memset(micro_oled_screen_buffer, 0, LCDWIDTH*LCDWIDTH/8); memset(micro_oled_screen_buffer, 0, LCDWIDTH * LCDWIDTH / 8);
} }
/** \brief Invert display. /** \brief Invert display.
@ -446,18 +234,18 @@ void send_buffer(void) {
uint8_t i, j; uint8_t i, j;
uint8_t page_addr = 0xFF; uint8_t page_addr = 0xFF;
for (i = 0; i < LCDHEIGHT/8; i++) { for (i = 0; i < LCDHEIGHT / 8; i++) {
uint8_t col_addr = 0xFF; uint8_t col_addr = 0xFF;
for (j = 0; j < LCDWIDTH; j++) { for (j = 0; j < LCDWIDTH; j++) {
if (micro_oled_screen_buffer[i*LCDWIDTH+j] != micro_oled_screen_current[i*LCDWIDTH+j]) { if (micro_oled_screen_buffer[i * LCDWIDTH + j] != micro_oled_screen_current[i * LCDWIDTH + j]) {
if (page_addr != i) { if (page_addr != i) {
set_page_address(i); set_page_address(i);
} }
if (col_addr != j) { if (col_addr != j) {
set_column_address(j); set_column_address(j);
} }
send_data(micro_oled_screen_buffer[i*LCDWIDTH+j]); send_data(micro_oled_screen_buffer[i * LCDWIDTH + j]);
micro_oled_screen_current[i*LCDWIDTH+j] = micro_oled_screen_buffer[i*LCDWIDTH+j]; micro_oled_screen_current[i * LCDWIDTH + j] = micro_oled_screen_buffer[i * LCDWIDTH + j];
col_addr = j + 1; col_addr = j + 1;
} }
} }
@ -468,17 +256,15 @@ void send_buffer(void) {
Draw color pixel in the screen buffer's x,y position with NORM or XOR draw mode. Draw color pixel in the screen buffer's x,y position with NORM or XOR draw mode.
*/ */
void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode) { void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode) {
if ((x<0) || (x>=LCDWIDTH) || (y<0) || (y>=LCDHEIGHT)) if ((x < 0) || (x >= LCDWIDTH) || (y < 0) || (y >= LCDHEIGHT)) return;
return;
if (mode == XOR) { if (mode == XOR) {
if (color == PIXEL_ON) if (color == PIXEL_ON) micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] ^= _BV((y % 8));
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] ^= _BV((y%8));
} else { } else {
if (color == PIXEL_ON) if (color == PIXEL_ON)
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] |= _BV((y%8)); micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] |= _BV((y % 8));
else else
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] &= ~_BV((y%8)); micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] &= ~_BV((y % 8));
} }
} }
@ -507,9 +293,10 @@ void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, ui
if (y0 < y1) { if (y0 < y1) {
ystep = 1; ystep = 1;
} else { } else {
ystep = -1;} ystep = -1;
}
for (; x0<x1; x0++) { for (; x0 < x1; x0++) {
if (steep) { if (steep) {
draw_pixel(y0, x0, color, mode); draw_pixel(y0, x0, color, mode);
} else { } else {
@ -526,16 +313,12 @@ void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, ui
/** \brief Draw horizontal line with color and mode. /** \brief Draw horizontal line with color and mode.
Draw horizontal line using color and mode from x,y to x+width,y of the screen buffer. Draw horizontal line using color and mode from x,y to x+width,y of the screen buffer.
*/ */
void draw_line_hori(uint8_t x, uint8_t y, uint8_t width, uint8_t color, uint8_t mode) { void draw_line_hori(uint8_t x, uint8_t y, uint8_t width, uint8_t color, uint8_t mode) { draw_line(x, y, x + width, y, color, mode); }
draw_line(x,y,x+width,y,color,mode);
}
/** \brief Draw vertical line. /** \brief Draw vertical line.
Draw vertical line using current fore color and current draw mode from x,y to x,y+height of the screen buffer. Draw vertical line using current fore color and current draw mode from x,y to x,y+height of the screen buffer.
*/ */
void draw_line_vert(uint8_t x, uint8_t y, uint8_t height, bool color, uint8_t mode) { void draw_line_vert(uint8_t x, uint8_t y, uint8_t height, bool color, uint8_t mode) { draw_line(x, y, x, y + height, color, mode); }
draw_line(x,y,x,y+height,color,mode);
}
/** \brief Draw rectangle with color and mode. /** \brief Draw rectangle with color and mode.
Draw rectangle using color and mode from x,y to x+width,y+height of the screen buffer. Draw rectangle using color and mode from x,y to x+width,y+height of the screen buffer.
@ -543,17 +326,17 @@ Draw rectangle using color and mode from x,y to x+width,y+height of the screen b
void draw_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) { void draw_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
uint8_t tempHeight; uint8_t tempHeight;
draw_line_hori(x,y, width, color, mode); draw_line_hori(x, y, width, color, mode);
draw_line_hori(x,y+height-1, width, color, mode); draw_line_hori(x, y + height - 1, width, color, mode);
tempHeight=height-2; tempHeight = height - 2;
// skip drawing vertical lines to avoid overlapping of pixel that will // skip drawing vertical lines to avoid overlapping of pixel that will
// affect XOR plot if no pixel in between horizontal lines // affect XOR plot if no pixel in between horizontal lines
if (tempHeight<1) return; if (tempHeight < 1) return;
draw_line_vert(x,y+1, tempHeight, color, mode); draw_line_vert(x, y + 1, tempHeight, color, mode);
draw_line_vert(x+width-1, y+1, tempHeight, color, mode); draw_line_vert(x + width - 1, y + 1, tempHeight, color, mode);
} }
/** \brief Draw rectangle with color and mode. /** \brief Draw rectangle with color and mode.
@ -562,17 +345,17 @@ Draw rectangle using color and mode from x,y to x+width,y+height of the screen b
void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) { void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
uint8_t tempHeight; uint8_t tempHeight;
draw_line_hori(x+1,y, width-2, color, mode); draw_line_hori(x + 1, y, width - 2, color, mode);
draw_line_hori(x+1,y+height-1, width-2, color, mode); draw_line_hori(x + 1, y + height - 1, width - 2, color, mode);
tempHeight=height-2; tempHeight = height - 2;
// skip drawing vertical lines to avoid overlapping of pixel that will // skip drawing vertical lines to avoid overlapping of pixel that will
// affect XOR plot if no pixel in between horizontal lines // affect XOR plot if no pixel in between horizontal lines
if (tempHeight<1) return; if (tempHeight < 1) return;
draw_line_vert(x,y+1, tempHeight, color, mode); draw_line_vert(x, y + 1, tempHeight, color, mode);
draw_line_vert(x+width-1, y+1, tempHeight, color, mode); draw_line_vert(x + width - 1, y + 1, tempHeight, color, mode);
} }
/** \brief Draw filled rectangle with color and mode. /** \brief Draw filled rectangle with color and mode.
@ -580,8 +363,8 @@ Draw filled rectangle using color and mode from x,y to x+width,y+height of the s
*/ */
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) { void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one // TODO - need to optimise the memory map draw so that this function will not call pixel one by one
for (int i=x; i<x+width;i++) { for (int i = x; i < x + width; i++) {
draw_line_vert(i,y, height, color, mode); draw_line_vert(i, y, height, color, mode);
} }
} }
@ -590,9 +373,9 @@ Draw filled rectangle using color and mode from x,y to x+width,y+height of the s
*/ */
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) { void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one // TODO - need to optimise the memory map draw so that this function will not call pixel one by one
for (int i=x; i<x+width;i++) { for (int i = x; i < x + width; i++) {
if (i == x || i == (x + width - 1)) if (i == x || i == (x + width - 1))
draw_line_vert(i, y+1, height-2, color, mode); draw_line_vert(i, y + 1, height - 2, color, mode);
else else
draw_line_vert(i, y, height, color, mode); draw_line_vert(i, y, height, color, mode);
} }
@ -604,46 +387,44 @@ void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height,
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font) { void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font) {
// TODO - New routine to take font of any height, at the moment limited to font height in multiple of 8 pixels // TODO - New routine to take font of any height, at the moment limited to font height in multiple of 8 pixels
uint8_t rowsToDraw,row, tempC; uint8_t rowsToDraw, row, tempC;
uint8_t i,j,temp; uint8_t i, j, temp;
uint16_t charPerBitmapRow,charColPositionOnBitmap,charRowPositionOnBitmap,charBitmapStartPosition; uint16_t charPerBitmapRow, charColPositionOnBitmap, charRowPositionOnBitmap, charBitmapStartPosition;
if ((font>=TOTALFONTS) || (font<0)) if ((font >= TOTALFONTS) || (font < 0)) return;
return;
uint8_t fontType = font; uint8_t fontType = font;
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0); uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType] + 0);
uint8_t fontHeight = pgm_read_byte(fonts_pointer[fontType]+1); uint8_t fontHeight = pgm_read_byte(fonts_pointer[fontType] + 1);
uint8_t fontStartChar = pgm_read_byte(fonts_pointer[fontType]+2); uint8_t fontStartChar = pgm_read_byte(fonts_pointer[fontType] + 2);
uint8_t fontTotalChar = pgm_read_byte(fonts_pointer[fontType]+3); uint8_t fontTotalChar = pgm_read_byte(fonts_pointer[fontType] + 3);
uint16_t fontMapWidth = (pgm_read_byte(fonts_pointer[fontType]+4)*100)+pgm_read_byte(fonts_pointer[fontType]+5); // two bytes values into integer 16 uint16_t fontMapWidth = (pgm_read_byte(fonts_pointer[fontType] + 4) * 100) + pgm_read_byte(fonts_pointer[fontType] + 5); // two bytes values into integer 16
if ((c<fontStartChar) || (c>(fontStartChar+fontTotalChar-1))) // no bitmap for the required c if ((c < fontStartChar) || (c > (fontStartChar + fontTotalChar - 1))) // no bitmap for the required c
return; return;
tempC=c-fontStartChar; tempC = c - fontStartChar;
// each row (in datasheet is call page) is 8 bits high, 16 bit high character will have 2 rows to be drawn // each row (in datasheet is call page) is 8 bits high, 16 bit high character will have 2 rows to be drawn
rowsToDraw=fontHeight/8; // 8 is LCD's page size, see SSD1306 datasheet rowsToDraw = fontHeight / 8; // 8 is LCD's page size, see SSD1306 datasheet
if (rowsToDraw<=1) rowsToDraw=1; if (rowsToDraw <= 1) rowsToDraw = 1;
// the following draw function can draw anywhere on the screen, but SLOW pixel by pixel draw // the following draw function can draw anywhere on the screen, but SLOW pixel by pixel draw
if (rowsToDraw==1) { if (rowsToDraw == 1) {
for (i=0;i<fontWidth+1;i++) { for (i = 0; i < fontWidth + 1; i++) {
if (i==fontWidth) // this is done in a weird way because for 5x7 font, there is no margin, this code add a margin after col 5 if (i == fontWidth) // this is done in a weird way because for 5x7 font, there is no margin, this code add a margin after col 5
temp=0; temp = 0;
else else
temp=pgm_read_byte(fonts_pointer[fontType]+FONTHEADERSIZE+(tempC*fontWidth)+i); temp = pgm_read_byte(fonts_pointer[fontType] + FONTHEADERSIZE + (tempC * fontWidth) + i);
for (j=0;j<8;j++) { // 8 is the LCD's page height (see datasheet for explanation) for (j = 0; j < 8; j++) { // 8 is the LCD's page height (see datasheet for explanation)
if (temp & 0x1) { if (temp & 0x1) {
draw_pixel(x+i, y+j, color,mode); draw_pixel(x + i, y + j, color, mode);
} } else {
else { draw_pixel(x + i, y + j, !color, mode);
draw_pixel(x+i, y+j, !color,mode);
} }
temp >>=1; temp >>= 1;
} }
} }
return; return;
@ -651,41 +432,36 @@ void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uin
// font height over 8 bit // font height over 8 bit
// take character "0" ASCII 48 as example // take character "0" ASCII 48 as example
charPerBitmapRow = fontMapWidth/fontWidth; // 256/8 =32 char per row charPerBitmapRow = fontMapWidth / fontWidth; // 256/8 =32 char per row
charColPositionOnBitmap = tempC % charPerBitmapRow; // =16 charColPositionOnBitmap = tempC % charPerBitmapRow; // =16
charRowPositionOnBitmap = (int)(tempC/charPerBitmapRow); // =1 charRowPositionOnBitmap = (int)(tempC / charPerBitmapRow); // =1
charBitmapStartPosition = (charRowPositionOnBitmap * fontMapWidth * (fontHeight/8)) + (charColPositionOnBitmap * fontWidth) ; charBitmapStartPosition = (charRowPositionOnBitmap * fontMapWidth * (fontHeight / 8)) + (charColPositionOnBitmap * fontWidth);
// each row on LCD is 8 bit height (see datasheet for explanation) // each row on LCD is 8 bit height (see datasheet for explanation)
for(row=0;row<rowsToDraw;row++) { for (row = 0; row < rowsToDraw; row++) {
for (i=0; i<fontWidth;i++) { for (i = 0; i < fontWidth; i++) {
temp=pgm_read_byte(fonts_pointer[fontType]+FONTHEADERSIZE+(charBitmapStartPosition+i+(row*fontMapWidth))); temp = pgm_read_byte(fonts_pointer[fontType] + FONTHEADERSIZE + (charBitmapStartPosition + i + (row * fontMapWidth)));
for (j=0;j<8;j++) { // 8 is the LCD's page height (see datasheet for explanation) for (j = 0; j < 8; j++) { // 8 is the LCD's page height (see datasheet for explanation)
if (temp & 0x1) { if (temp & 0x1) {
draw_pixel(x+i,y+j+(row*8), color, mode); draw_pixel(x + i, y + j + (row * 8), color, mode);
} else {
draw_pixel(x + i, y + j + (row * 8), !color, mode);
} }
else { temp >>= 1;
draw_pixel(x+i,y+j+(row*8), !color, mode);
}
temp >>=1;
} }
} }
} }
} }
void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font) { void draw_string(uint8_t x, uint8_t y, char* string, uint8_t color, uint8_t mode, uint8_t font) {
if ((font >= TOTALFONTS) || (font < 0)) return;
if ((font>=TOTALFONTS) || (font<0))
return;
uint8_t fontType = font; uint8_t fontType = font;
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0); uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType] + 0);
uint8_t cur_x = x; uint8_t cur_x = x;
for (int i = 0; i < strlen(string); i++) { for (int i = 0; i < strlen(string); i++) {
draw_char(cur_x, y, string[i], color, mode, font); draw_char(cur_x, y, string[i], color, mode, font);
cur_x += fontWidth + 1; cur_x += fontWidth + 1;
} }
} }

View file

@ -49,11 +49,11 @@ void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode); void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font); void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font);
void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font); void draw_string(uint8_t x, uint8_t y, char* string, uint8_t color, uint8_t mode, uint8_t font);
#define I2C_ADDRESS_SA0_0 0b0111100 #define I2C_ADDRESS_SA0_0 0b0111100
#ifndef I2C_ADDRESS_SA0_1 #ifndef I2C_ADDRESS_SA0_1
#define I2C_ADDRESS_SA0_1 0b0111101 # define I2C_ADDRESS_SA0_1 0b0111101
#endif #endif
#define I2C_COMMAND 0x00 #define I2C_COMMAND 0x00
#define I2C_DATA 0x40 #define I2C_DATA 0x40
@ -61,10 +61,10 @@ void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mod
#define PIXEL_ON 1 #define PIXEL_ON 1
#ifndef LCDWIDTH #ifndef LCDWIDTH
#define LCDWIDTH 64 # define LCDWIDTH 64
#endif #endif
#ifndef LCDWIDTH #ifndef LCDWIDTH
#define LCDHEIGHT 48 # define LCDHEIGHT 48
#endif #endif
#define FONTHEADERSIZE 6 #define FONTHEADERSIZE 6
@ -112,23 +112,23 @@ void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mod
#define VERTICALLEFTHORIZONTALSCROLL 0x2A #define VERTICALLEFTHORIZONTALSCROLL 0x2A
typedef enum CMD { typedef enum CMD {
CMD_CLEAR, //0 CMD_CLEAR, // 0
CMD_INVERT, //1 CMD_INVERT, // 1
CMD_CONTRAST, //2 CMD_CONTRAST, // 2
CMD_DISPLAY, //3 CMD_DISPLAY, // 3
CMD_SETCURSOR, //4 CMD_SETCURSOR, // 4
CMD_PIXEL, //5 CMD_PIXEL, // 5
CMD_LINE, //6 CMD_LINE, // 6
CMD_LINEH, //7 CMD_LINEH, // 7
CMD_LINEV, //8 CMD_LINEV, // 8
CMD_RECT, //9 CMD_RECT, // 9
CMD_RECTFILL, //10 CMD_RECTFILL, // 10
CMD_CIRCLE, //11 CMD_CIRCLE, // 11
CMD_CIRCLEFILL, //12 CMD_CIRCLEFILL, // 12
CMD_DRAWCHAR, //13 CMD_DRAWCHAR, // 13
CMD_DRAWBITMAP, //14 CMD_DRAWBITMAP, // 14
CMD_GETLCDWIDTH, //15 CMD_GETLCDWIDTH, // 15
CMD_GETLCDHEIGHT, //16 CMD_GETLCDHEIGHT, // 16
CMD_SETCOLOR, //17 CMD_SETCOLOR, // 17
CMD_SETDRAWMODE //18 CMD_SETDRAWMODE // 18
} commCommand_t; } commCommand_t;

View file

@ -16,16 +16,16 @@
#include "qwiic.h" #include "qwiic.h"
void qwiic_init(void) { void qwiic_init(void) {
#ifdef QWIIC_JOYSTIIC_ENABLE #ifdef QWIIC_JOYSTIIC_ENABLE
joystiic_init(); joystiic_init();
#endif #endif
#ifdef QWIIC_MICRO_OLED_ENABLE #ifdef QWIIC_MICRO_OLED_ENABLE
micro_oled_init(); micro_oled_init();
#endif #endif
} }
void qwiic_task(void) { void qwiic_task(void) {
#ifdef QWIIC_JOYSTIIC_ENABLE #ifdef QWIIC_JOYSTIIC_ENABLE
joystiic_task(); joystiic_task();
#endif #endif
} }

View file

@ -18,10 +18,10 @@
#include "i2c_master.h" #include "i2c_master.h"
#ifdef QWIIC_JOYSTIIC_ENABLE #ifdef QWIIC_JOYSTIIC_ENABLE
#include "joystiic.h" # include "joystiic.h"
#endif #endif
#ifdef QWIIC_MICRO_OLED_ENABLE #ifdef QWIIC_MICRO_OLED_ENABLE
#include "micro_oled.h" # include "micro_oled.h"
#endif #endif
void qwiic_init(void); void qwiic_init(void);

View file

@ -29,260 +29,11 @@ https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/
// Standard ASCII 5x7 font // Standard ASCII 5x7 font
static const unsigned char font5x7[] PROGMEM = { static const unsigned char font5x7[] PROGMEM = {
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256) // first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
5,8,0,255,12,75, 5, 8, 0, 255, 12, 75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x21, 0x54, 0x54, 0x78, 0x41, 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0xF0, 0x29, 0x24, 0x29, 0xF0, 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 0x32, 0x32, 0x48, 0x48, 0x48, 0x32, 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x39, 0x44, 0x44, 0x44, 0x39, 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0xAA, 0x00, 0x55, 0x00, 0xAA, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10,
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0x7C,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x2A, 0x2A, 0x3E, 0x14, 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00};
0x00, 0x18, 0x3C, 0x18, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14,
0x24, 0x2A, 0x7F, 0x2A, 0x12,
0x23, 0x13, 0x08, 0x64, 0x62,
0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x42, 0x7F, 0x40, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46,
0x21, 0x41, 0x49, 0x4D, 0x33,
0x18, 0x14, 0x12, 0x7F, 0x10,
0x27, 0x45, 0x45, 0x45, 0x39,
0x3C, 0x4A, 0x49, 0x49, 0x31,
0x41, 0x21, 0x11, 0x09, 0x07,
0x36, 0x49, 0x49, 0x49, 0x36,
0x46, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C,
0x7F, 0x49, 0x49, 0x49, 0x36,
0x3E, 0x41, 0x41, 0x41, 0x22,
0x7F, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x49, 0x49, 0x49, 0x41,
0x7F, 0x09, 0x09, 0x09, 0x01,
0x3E, 0x41, 0x41, 0x51, 0x73,
0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x41, 0x7F, 0x41, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01,
0x7F, 0x08, 0x14, 0x22, 0x41,
0x7F, 0x40, 0x40, 0x40, 0x40,
0x7F, 0x02, 0x1C, 0x02, 0x7F,
0x7F, 0x04, 0x08, 0x10, 0x7F,
0x3E, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x09, 0x09, 0x09, 0x06,
0x3E, 0x41, 0x51, 0x21, 0x5E,
0x7F, 0x09, 0x19, 0x29, 0x46,
0x26, 0x49, 0x49, 0x49, 0x32,
0x03, 0x01, 0x7F, 0x01, 0x03,
0x3F, 0x40, 0x40, 0x40, 0x3F,
0x1F, 0x20, 0x40, 0x20, 0x1F,
0x3F, 0x40, 0x38, 0x40, 0x3F,
0x63, 0x14, 0x08, 0x14, 0x63,
0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43,
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40,
0x7F, 0x28, 0x44, 0x44, 0x38,
0x38, 0x44, 0x44, 0x44, 0x28,
0x38, 0x44, 0x44, 0x28, 0x7F,
0x38, 0x54, 0x54, 0x54, 0x18,
0x00, 0x08, 0x7E, 0x09, 0x02,
0x18, 0xA4, 0xA4, 0x9C, 0x78,
0x7F, 0x08, 0x04, 0x04, 0x78,
0x00, 0x44, 0x7D, 0x40, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78,
0x7C, 0x08, 0x04, 0x04, 0x78,
0x38, 0x44, 0x44, 0x44, 0x38,
0xFC, 0x18, 0x24, 0x24, 0x18,
0x18, 0x24, 0x24, 0x18, 0xFC,
0x7C, 0x08, 0x04, 0x04, 0x08,
0x48, 0x54, 0x54, 0x54, 0x24,
0x04, 0x04, 0x3F, 0x44, 0x24,
0x3C, 0x40, 0x40, 0x20, 0x7C,
0x1C, 0x20, 0x40, 0x20, 0x1C,
0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44,
0x4C, 0x90, 0x90, 0x90, 0x7C,
0x44, 0x64, 0x54, 0x4C, 0x44,
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x21, 0x54, 0x54, 0x78, 0x41,
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0xF0, 0x29, 0x24, 0x29, 0xF0,
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x32, 0x48, 0x48, 0x48, 0x32,
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x39, 0x44, 0x44, 0x44, 0x39,
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0xAA, 0x00, 0x55, 0x00, 0xAA,
0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x00, 0x00, 0x00, 0xFF, 0x00,
0x10, 0x10, 0x10, 0xFF, 0x00,
0x14, 0x14, 0x14, 0xFF, 0x00,
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00
};

View file

@ -27,101 +27,13 @@ https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/
static const unsigned char font8x16[] PROGMEM = { static const unsigned char font8x16[] PROGMEM = {
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256) // first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
8,16,32,96,2,56, 8, 16, 32, 96, 2, 56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xBE, 0x90, 0xD0, 0xBE, 0x90, 0x00, 0x00, 0x1C, 0x62, 0xFF, 0xC2, 0x80, 0x00, 0x00, 0x0C, 0x12, 0x92, 0x4C, 0xB0, 0x88, 0x06, 0x00, 0x80, 0x7C, 0x62, 0xB2, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x24, 0x18, 0x7E, 0x18, 0x24, 0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00, 0xF8, 0x04, 0xC2, 0x32, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xC0, 0xA0, 0x98, 0x84, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x1E, 0x12, 0x12, 0x22, 0xC2, 0x00, 0x00, 0xF8, 0x44, 0x22, 0x22, 0x22, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x8C, 0x52, 0x22, 0x52, 0x8C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x26, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x00, 0x00, 0x04, 0x02, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00,
0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xBE, 0x90, 0xD0, 0xBE, 0x90, 0x00, 0x03, 0x04, 0x04, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04,
0x00, 0x1C, 0x62, 0xFF, 0xC2, 0x80, 0x00, 0x00, 0x0C, 0x12, 0x92, 0x4C, 0xB0, 0x88, 0x06, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x04, 0x72, 0x8A, 0xFA, 0x84, 0x78, 0x00, 0x00, 0xC0, 0x38, 0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x22, 0xE2, 0x00, 0x00, 0xFE, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0xFE, 0x40, 0xB0, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x80, 0x7C, 0x62, 0xB2, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFE, 0x00, 0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0xFE, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x42, 0x42, 0xA2, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x42, 0x80, 0x00, 0x00, 0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x06, 0x38, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x3E, 0xC0, 0xF0, 0x0E, 0xF0, 0xC0, 0x3E, 0x00, 0x00, 0x06, 0x98, 0x60, 0x98, 0x06, 0x00, 0x00, 0x00, 0x06, 0x18, 0xE0, 0x18, 0x06, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x40, 0x30, 0x0C, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0xE0, 0x18, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0C, 0x12, 0x11, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,
0x00, 0x24, 0x18, 0x7E, 0x18, 0x24, 0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x20, 0xFC, 0x22, 0x22, 0x22, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0xF0, 0x20, 0x10, 0xF0, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x80, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x30, 0xC0, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00, 0x10, 0x90, 0x50, 0x30, 0x00, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7E, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x24, 0x24, 0x22, 0x1F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
0xF8, 0x04, 0xC2, 0x32, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x3F, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x20, 0x20, 0x31, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00,
0xC0, 0xA0, 0x98, 0x84, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x1E, 0x12, 0x12, 0x22, 0xC2, 0x00, 0x00,
0xF8, 0x44, 0x22, 0x22, 0x22, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00,
0x00, 0x8C, 0x52, 0x22, 0x52, 0x8C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x26, 0xF8, 0x00, 0x00,
0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00,
0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x00, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x00, 0x00, 0x04, 0x02, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00,
0x03, 0x04, 0x04, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x06, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x03, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00,
0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x01, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF8, 0x04, 0x72, 0x8A, 0xFA, 0x84, 0x78, 0x00, 0x00, 0xC0, 0x38, 0x06, 0x38, 0xC0, 0x00, 0x00,
0x00, 0xFE, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
0xFE, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x22, 0xE2, 0x00, 0x00,
0xFE, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0xFE, 0x40, 0xB0, 0x08, 0x04, 0x02, 0x00, 0x00,
0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFE, 0x00,
0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00,
0xFE, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00,
0x00, 0xFE, 0x42, 0x42, 0xA2, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x42, 0x80, 0x00, 0x00,
0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
0x06, 0x38, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x3E, 0xC0, 0xF0, 0x0E, 0xF0, 0xC0, 0x3E, 0x00,
0x00, 0x06, 0x98, 0x60, 0x98, 0x06, 0x00, 0x00, 0x00, 0x06, 0x18, 0xE0, 0x18, 0x06, 0x00, 0x00,
0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00,
0x00, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00,
0x40, 0x30, 0x0C, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x02, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00,
0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
0x07, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00,
0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00,
0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00,
0x07, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0C, 0x12, 0x11, 0x10, 0x00,
0x00, 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
0x00, 0x06, 0x01, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
0x00, 0xE0, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 0x00,
0x00, 0x20, 0xFC, 0x22, 0x22, 0x22, 0x02, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00,
0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0xF0, 0x20, 0x10, 0xF0, 0x00,
0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xE0, 0x00, 0x00,
0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
0x00, 0xF0, 0x20, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x20, 0x00, 0x00,
0x00, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00,
0x00, 0x70, 0x80, 0x00, 0x80, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0xF0, 0x00,
0x00, 0x30, 0xC0, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00,
0x00, 0x10, 0x10, 0x90, 0x50, 0x30, 0x00, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x02, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7E, 0x80, 0x80, 0x00, 0x00,
0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00,
0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x24, 0x24, 0x22, 0x1F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x00, 0x3F, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x3F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00,
0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x01, 0x06, 0x01, 0x00,
0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x20, 0x20, 0x31, 0x0E, 0x03, 0x00, 0x00, 0x00,
0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

View file

@ -35,35 +35,34 @@ static const uint8_t led_mask[] = {
}; };
// The address of the LED // The address of the LED
#define LA(c, r) (c + r * 16 ) #define LA(c, r) (c + r * 16)
// Need to be an address that is not mapped, but inside the range of the controller matrix // Need to be an address that is not mapped, but inside the range of the controller matrix
#define NA LA(8, 8) #define NA LA(8, 8)
// The numbers in the comments are the led numbers DXX on the PCB // The numbers in the comments are the led numbers DXX on the PCB
// The mapping is taken from the schematic of left hand side // The mapping is taken from the schematic of left hand side
static const uint8_t led_mapping[GDISP_SCREEN_HEIGHT][GDISP_SCREEN_WIDTH] = { static const uint8_t led_mapping[GDISP_SCREEN_HEIGHT][GDISP_SCREEN_WIDTH] = {
// 45 44 43 42 41 40 39 // 45 44 43 42 41 40 39
{ LA(1, 1), LA(1, 0), LA(0, 4), LA(0, 3), LA(0, 2), LA(0, 1), LA(0, 0)}, {LA(1, 1), LA(1, 0), LA(0, 4), LA(0, 3), LA(0, 2), LA(0, 1), LA(0, 0)},
// 52 51 50 49 48 47 46 // 52 51 50 49 48 47 46
{ LA(2, 3), LA(2, 2), LA(2, 1), LA(2, 0), LA(1, 4), LA(1, 3), LA(1, 2) }, {LA(2, 3), LA(2, 2), LA(2, 1), LA(2, 0), LA(1, 4), LA(1, 3), LA(1, 2)},
// 58 57 56 55 54 53 N/A // 58 57 56 55 54 53 N/A
{ LA(3, 4), LA(3, 3), LA(3, 2), LA(3, 1), LA(3, 0), LA(2, 4), NA }, {LA(3, 4), LA(3, 3), LA(3, 2), LA(3, 1), LA(3, 0), LA(2, 4), NA},
// 67 66 65 64 63 62 61 // 67 66 65 64 63 62 61
{ LA(5, 3), LA(5, 2), LA(5, 1), LA(5, 0), LA(4, 4), LA(4, 3), LA(4, 2) }, {LA(5, 3), LA(5, 2), LA(5, 1), LA(5, 0), LA(4, 4), LA(4, 3), LA(4, 2)},
// 76 75 74 73 72 60 59 // 76 75 74 73 72 60 59
{ LA(7, 3), LA(7, 2), LA(7, 1), LA(7, 0), LA(6, 3), LA(4, 1), LA(4, 0) }, {LA(7, 3), LA(7, 2), LA(7, 1), LA(7, 0), LA(6, 3), LA(4, 1), LA(4, 0)},
// N/A N/A N/A N/A N/A N/A 68 // N/A N/A N/A N/A N/A N/A 68
{ NA, NA, NA, NA, NA, NA, LA(5, 4) }, {NA, NA, NA, NA, NA, NA, LA(5, 4)},
// N/A N/A N/A N/A 71 70 69 // N/A N/A N/A N/A 71 70 69
{ NA, NA, NA, NA, LA(6, 2), LA(6, 1), LA(6, 0) }, {NA, NA, NA, NA, LA(6, 2), LA(6, 1), LA(6, 0)},
}; };
#define IS31_ADDR_DEFAULT 0x74 // AD connected to GND #define IS31_ADDR_DEFAULT 0x74 // AD connected to GND
#define IS31_TIMEOUT 5000 #define IS31_TIMEOUT 5000
static GFXINLINE void init_board(GDisplay *g) { static GFXINLINE void init_board(GDisplay* g) {
(void) g; (void)g;
/* I2C pins */ /* I2C pins */
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
@ -77,33 +76,29 @@ static GFXINLINE void init_board(GDisplay *g) {
I2CD1.i2c->FLT = 4; I2CD1.i2c->FLT = 4;
} }
static GFXINLINE void post_init_board(GDisplay *g) { static GFXINLINE void post_init_board(GDisplay* g) { (void)g; }
(void) g;
}
static GFXINLINE const uint8_t* get_led_mask(GDisplay* g) { static GFXINLINE const uint8_t* get_led_mask(GDisplay* g) {
(void) g; (void)g;
return led_mask; return led_mask;
} }
static GFXINLINE uint8_t get_led_address(GDisplay* g, uint16_t x, uint16_t y) static GFXINLINE uint8_t get_led_address(GDisplay* g, uint16_t x, uint16_t y) {
{ (void)g;
(void) g;
return led_mapping[y][x]; return led_mapping[y][x];
} }
static GFXINLINE void set_hardware_shutdown(GDisplay* g, bool shutdown) { static GFXINLINE void set_hardware_shutdown(GDisplay* g, bool shutdown) {
(void) g; (void)g;
if(!shutdown) { if (!shutdown) {
palSetPad(GPIOB, 16); palSetPad(GPIOB, 16);
} } else {
else {
palClearPad(GPIOB, 16); palClearPad(GPIOB, 16);
} }
} }
static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) { static GFXINLINE void write_data(GDisplay* g, uint8_t* data, uint16_t length) {
(void) g; (void)g;
i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, data, length, 0, 0, US2ST(IS31_TIMEOUT)); i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, data, length, 0, 0, US2ST(IS31_TIMEOUT));
} }

View file

@ -19,15 +19,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#if GFX_USE_GDISP #if GFX_USE_GDISP
#define GDISP_DRIVER_VMT GDISPVMT_IS31FL3731C_QMK # define GDISP_DRIVER_VMT GDISPVMT_IS31FL3731C_QMK
#define GDISP_SCREEN_HEIGHT LED_HEIGHT # define GDISP_SCREEN_HEIGHT LED_HEIGHT
#define GDISP_SCREEN_WIDTH LED_WIDTH # define GDISP_SCREEN_WIDTH LED_WIDTH
#include "gdisp_lld_config.h" # include "gdisp_lld_config.h"
#include "src/gdisp/gdisp_driver.h" # include "src/gdisp/gdisp_driver.h"
#include "board_is31fl3731c.h"
# include "board_is31fl3731c.h"
// Can't include led_tables from here // Can't include led_tables from here
extern const uint8_t CIE1931_CURVE[]; extern const uint8_t CIE1931_CURVE[];
@ -36,96 +35,96 @@ extern const uint8_t CIE1931_CURVE[];
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/
#ifndef GDISP_INITIAL_CONTRAST # ifndef GDISP_INITIAL_CONTRAST
#define GDISP_INITIAL_CONTRAST 0 # define GDISP_INITIAL_CONTRAST 0
#endif # endif
#ifndef GDISP_INITIAL_BACKLIGHT # ifndef GDISP_INITIAL_BACKLIGHT
#define GDISP_INITIAL_BACKLIGHT 0 # define GDISP_INITIAL_BACKLIGHT 0
#endif # endif
#define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0) # define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER << 0)
#define IS31_ADDR_DEFAULT 0x74 # define IS31_ADDR_DEFAULT 0x74
#define IS31_REG_CONFIG 0x00 # define IS31_REG_CONFIG 0x00
// bits in reg // bits in reg
#define IS31_REG_CONFIG_PICTUREMODE 0x00 # define IS31_REG_CONFIG_PICTUREMODE 0x00
#define IS31_REG_CONFIG_AUTOPLAYMODE 0x08 # define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
#define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18 # define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
// D2:D0 bits are starting frame for autoplay mode // D2:D0 bits are starting frame for autoplay mode
#define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode # define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
#define IS31_REG_AUTOPLAYCTRL1 0x02 # define IS31_REG_AUTOPLAYCTRL1 0x02
// D6:D4 number of loops (000=infty) // D6:D4 number of loops (000=infty)
// D2:D0 number of frames to be used // D2:D0 number of frames to be used
#define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms) # define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
#define IS31_REG_DISPLAYOPT 0x05 # define IS31_REG_DISPLAYOPT 0x05
#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames # define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8 # define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8
// D2:D0 bits blink period time (*0.27s) // D2:D0 bits blink period time (*0.27s)
#define IS31_REG_AUDIOSYNC 0x06 # define IS31_REG_AUDIOSYNC 0x06
#define IS31_REG_AUDIOSYNC_ENABLE 0x1 # define IS31_REG_AUDIOSYNC_ENABLE 0x1
#define IS31_REG_FRAMESTATE 0x07 # define IS31_REG_FRAMESTATE 0x07
#define IS31_REG_BREATHCTRL1 0x08 # define IS31_REG_BREATHCTRL1 0x08
// D6:D4 fade out time (26ms*2^i) // D6:D4 fade out time (26ms*2^i)
// D2:D0 fade in time (26ms*2^i) // D2:D0 fade in time (26ms*2^i)
#define IS31_REG_BREATHCTRL2 0x09 # define IS31_REG_BREATHCTRL2 0x09
#define IS31_REG_BREATHCTRL2_ENABLE 0x10 # define IS31_REG_BREATHCTRL2_ENABLE 0x10
// D2:D0 extinguish time (3.5ms*2^i) // D2:D0 extinguish time (3.5ms*2^i)
#define IS31_REG_SHUTDOWN 0x0A # define IS31_REG_SHUTDOWN 0x0A
#define IS31_REG_SHUTDOWN_OFF 0x0 # define IS31_REG_SHUTDOWN_OFF 0x0
#define IS31_REG_SHUTDOWN_ON 0x1 # define IS31_REG_SHUTDOWN_ON 0x1
#define IS31_REG_AGCCTRL 0x0B # define IS31_REG_AGCCTRL 0x0B
#define IS31_REG_ADCRATE 0x0C # define IS31_REG_ADCRATE 0x0C
#define IS31_COMMANDREGISTER 0xFD # define IS31_COMMANDREGISTER 0xFD
#define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine' # define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine'
#define IS31_FUNCTIONREG_SIZE 0xD # define IS31_FUNCTIONREG_SIZE 0xD
#define IS31_FRAME_SIZE 0xB4 # define IS31_FRAME_SIZE 0xB4
#define IS31_PWM_REG 0x24 # define IS31_PWM_REG 0x24
#define IS31_PWM_SIZE 0x90 # define IS31_PWM_SIZE 0x90
#define IS31_LED_MASK_SIZE 0x12 # define IS31_LED_MASK_SIZE 0x12
#define IS31 # define IS31
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
typedef struct{ typedef struct {
uint8_t write_buffer_offset; uint8_t write_buffer_offset;
uint8_t write_buffer[IS31_FRAME_SIZE]; uint8_t write_buffer[IS31_FRAME_SIZE];
uint8_t frame_buffer[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH]; uint8_t frame_buffer[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH];
uint8_t page; uint8_t page;
}__attribute__((__packed__)) PrivData; } __attribute__((__packed__)) PrivData;
// Some common routines and macros // Some common routines and macros
#define PRIV(g) ((PrivData*)g->priv) # define PRIV(g) ((PrivData *)g->priv)
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported functions. */ /* Driver exported functions. */
/*===========================================================================*/ /*===========================================================================*/
static GFXINLINE void write_page(GDisplay* g, uint8_t page) { static GFXINLINE void write_page(GDisplay *g, uint8_t page) {
uint8_t tx[2] __attribute__((aligned(2))); uint8_t tx[2] __attribute__((aligned(2)));
tx[0] = IS31_COMMANDREGISTER; tx[0] = IS31_COMMANDREGISTER;
tx[1] = page; tx[1] = page;
write_data(g, tx, 2); write_data(g, tx, 2);
} }
static GFXINLINE void write_register(GDisplay* g, uint8_t page, uint8_t reg, uint8_t data) { static GFXINLINE void write_register(GDisplay *g, uint8_t page, uint8_t reg, uint8_t data) {
uint8_t tx[2] __attribute__((aligned(2))); uint8_t tx[2] __attribute__((aligned(2)));
tx[0] = reg; tx[0] = reg;
tx[1] = data; tx[1] = data;
@ -136,7 +135,7 @@ static GFXINLINE void write_register(GDisplay* g, uint8_t page, uint8_t reg, uin
static GFXINLINE void write_ram(GDisplay *g, uint8_t page, uint16_t offset, uint16_t length) { static GFXINLINE void write_ram(GDisplay *g, uint8_t page, uint16_t offset, uint16_t length) {
PRIV(g)->write_buffer_offset = offset; PRIV(g)->write_buffer_offset = offset;
write_page(g, page); write_page(g, page);
write_data(g, (uint8_t*)PRIV(g), length + 1); write_data(g, (uint8_t *)PRIV(g), length + 1);
} }
LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
@ -160,10 +159,9 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE); write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE);
gfxSleepMilliseconds(10); gfxSleepMilliseconds(10);
// zero all LED registers on all 8 pages, and enable the mask // zero all LED registers on all 8 pages, and enable the mask
__builtin_memcpy(PRIV(g)->write_buffer, get_led_mask(g), IS31_LED_MASK_SIZE); __builtin_memcpy(PRIV(g)->write_buffer, get_led_mask(g), IS31_LED_MASK_SIZE);
for(uint8_t i=0; i<8; i++) { for (uint8_t i = 0; i < 8; i++) {
write_ram(g, i, 0, IS31_FRAME_SIZE); write_ram(g, i, 0, IS31_FRAME_SIZE);
gfxSleepMilliseconds(1); gfxSleepMilliseconds(1);
} }
@ -185,11 +183,10 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
return TRUE; return TRUE;
} }
#if GDISP_HARDWARE_FLUSH # if GDISP_HARDWARE_FLUSH
LLDSPEC void gdisp_lld_flush(GDisplay *g) { LLDSPEC void gdisp_lld_flush(GDisplay *g) {
// Don't flush if we don't need it. // Don't flush if we don't need it.
if (!(g->flags & GDISP_FLG_NEEDFLUSH)) if (!(g->flags & GDISP_FLG_NEEDFLUSH)) return;
return;
PRIV(g)->page++; PRIV(g)->page++;
PRIV(g)->page %= 2; PRIV(g)->page %= 2;
@ -197,11 +194,11 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
// We should run only one physical page at a time // We should run only one physical page at a time
// This way we don't need to send so much data, and // This way we don't need to send so much data, and
// we could use slightly less memory // we could use slightly less memory
uint8_t* src = PRIV(g)->frame_buffer; uint8_t *src = PRIV(g)->frame_buffer;
for (int y=0;y<GDISP_SCREEN_HEIGHT;y++) { for (int y = 0; y < GDISP_SCREEN_HEIGHT; y++) {
for (int x=0;x<GDISP_SCREEN_WIDTH;x++) { for (int x = 0; x < GDISP_SCREEN_WIDTH; x++) {
uint8_t val = (uint16_t)*src * g->g.Backlight / 100; uint8_t val = (uint16_t)*src * g->g.Backlight / 100;
PRIV(g)->write_buffer[get_led_address(g, x, y)]=CIE1931_CURVE[val]; PRIV(g)->write_buffer[get_led_address(g, x, y)] = CIE1931_CURVE[val];
++src; ++src;
} }
} }
@ -210,55 +207,54 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
write_register(g, IS31_FUNCTIONREG, IS31_REG_PICTDISP, PRIV(g)->page); write_register(g, IS31_FUNCTIONREG, IS31_REG_PICTDISP, PRIV(g)->page);
g->flags &= ~GDISP_FLG_NEEDFLUSH; g->flags &= ~GDISP_FLG_NEEDFLUSH;
} }
#endif # endif
#if GDISP_HARDWARE_DRAWPIXEL # if GDISP_HARDWARE_DRAWPIXEL
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) { LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
coord_t x, y; coord_t x, y;
switch(g->g.Orientation) { switch (g->g.Orientation) {
default: default:
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
x = g->p.x; x = g->p.x;
y = g->p.y; y = g->p.y;
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
x = GDISP_SCREEN_WIDTH-1 - g->p.x; x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
y = g->p.y; y = g->p.y;
break; break;
} }
PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x] = gdispColor2Native(g->p.color); PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x] = gdispColor2Native(g->p.color);
g->flags |= GDISP_FLG_NEEDFLUSH; g->flags |= GDISP_FLG_NEEDFLUSH;
} }
#endif # endif
#if GDISP_HARDWARE_PIXELREAD # if GDISP_HARDWARE_PIXELREAD
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) { LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
coord_t x, y; coord_t x, y;
switch(g->g.Orientation) { switch (g->g.Orientation) {
default: default:
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
x = g->p.x; x = g->p.x;
y = g->p.y; y = g->p.y;
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
x = GDISP_SCREEN_WIDTH-1 - g->p.x; x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
y = g->p.y; y = g->p.y;
break; break;
} }
return gdispNative2Color(PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x]); return gdispNative2Color(PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x]);
} }
#endif # endif
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL # if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
LLDSPEC void gdisp_lld_control(GDisplay *g) { LLDSPEC void gdisp_lld_control(GDisplay *g) {
switch(g->p.x) { switch (g->p.x) {
case GDISP_CONTROL_POWER: case GDISP_CONTROL_POWER:
if (g->g.Powermode == (powermode_t)g->p.ptr) if (g->g.Powermode == (powermode_t)g->p.ptr) return;
return; switch ((powermode_t)g->p.ptr) {
switch((powermode_t)g->p.ptr) {
case powerOff: case powerOff:
case powerSleep: case powerSleep:
case powerDeepSleep: case powerDeepSleep:
@ -274,9 +270,8 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
return; return;
case GDISP_CONTROL_ORIENTATION: case GDISP_CONTROL_ORIENTATION:
if (g->g.Orientation == (orientation_t)g->p.ptr) if (g->g.Orientation == (orientation_t)g->p.ptr) return;
return; switch ((orientation_t)g->p.ptr) {
switch((orientation_t)g->p.ptr) {
/* Rotation is handled by the drawing routines */ /* Rotation is handled by the drawing routines */
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
@ -295,14 +290,13 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
return; return;
case GDISP_CONTROL_BACKLIGHT: case GDISP_CONTROL_BACKLIGHT:
if (g->g.Backlight == (unsigned)g->p.ptr) if (g->g.Backlight == (unsigned)g->p.ptr) return;
return;
unsigned val = (unsigned)g->p.ptr; unsigned val = (unsigned)g->p.ptr;
g->g.Backlight = val > 100 ? 100 : val; g->g.Backlight = val > 100 ? 100 : val;
g->flags |= GDISP_FLG_NEEDFLUSH; g->flags |= GDISP_FLG_NEEDFLUSH;
return; return;
} }
} }
#endif // GDISP_NEED_CONTROL # endif // GDISP_NEED_CONTROL
#endif // GFX_USE_GDISP #endif // GFX_USE_GDISP

View file

@ -24,12 +24,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing # define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
#define GDISP_HARDWARE_DRAWPIXEL TRUE # define GDISP_HARDWARE_DRAWPIXEL TRUE
#define GDISP_HARDWARE_PIXELREAD TRUE # define GDISP_HARDWARE_PIXELREAD TRUE
#define GDISP_HARDWARE_CONTROL TRUE # define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_GRAY256 # define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_GRAY256
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */

View file

@ -11,7 +11,7 @@
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6 #define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6
#define ST7565_ADC ST7565_ADC_NORMAL #define ST7565_ADC ST7565_ADC_NORMAL
#define ST7565_COM_SCAN ST7565_COM_SCAN_DEC #define ST7565_COM_SCAN ST7565_COM_SCAN_DEC
#define ST7565_PAGE_ORDER 0,1,2,3 #define ST7565_PAGE_ORDER 0, 1, 2, 3
/* /*
* Custom page order for several LCD boards, e.g. HEM12864-99 * Custom page order for several LCD boards, e.g. HEM12864-99
* #define ST7565_PAGE_ORDER 4,5,6,7,0,1,2,3 * #define ST7565_PAGE_ORDER 4,5,6,7,0,1,2,3
@ -25,11 +25,9 @@
#define ST7565_SLCK_PIN 5 #define ST7565_SLCK_PIN 5
#define ST7565_SS_PIN 4 #define ST7565_SS_PIN 4
#define palSetPadModeRaw(portname, bits) \ #define palSetPadModeRaw(portname, bits) ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
#define palSetPadModeNamed(portname, portmode) \ #define palSetPadModeNamed(portname, portmode) palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
#define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2) #define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2)
// DSPI Clock and Transfer Attributes // DSPI Clock and Transfer Attributes
@ -39,13 +37,12 @@
static const SPIConfig spi1config = { static const SPIConfig spi1config = {
// Operation complete callback or @p NULL. // Operation complete callback or @p NULL.
.end_cb = NULL, .end_cb = NULL,
//The chip select line port - when not using pcs. // The chip select line port - when not using pcs.
.ssport = ST7565_GPIOPORT, .ssport = ST7565_GPIOPORT,
// brief The chip select line pad number - when not using pcs. // brief The chip select line pad number - when not using pcs.
.sspad=ST7565_SS_PIN, .sspad = ST7565_SS_PIN,
// SPI initialization data. // SPI initialization data.
.tar0 = .tar0 = SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes
SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes
| SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns | SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns
| SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns | SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns
| SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns | SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns
@ -54,21 +51,21 @@ static const SPIConfig spi1config = {
}; };
static GFXINLINE void acquire_bus(GDisplay *g) { static GFXINLINE void acquire_bus(GDisplay *g) {
(void) g; (void)g;
// Only the LCD is using the SPI bus, so no need to acquire // Only the LCD is using the SPI bus, so no need to acquire
// spiAcquireBus(&SPID1); // spiAcquireBus(&SPID1);
spiSelect(&SPID1); spiSelect(&SPID1);
} }
static GFXINLINE void release_bus(GDisplay *g) { static GFXINLINE void release_bus(GDisplay *g) {
(void) g; (void)g;
// Only the LCD is using the SPI bus, so no need to release // Only the LCD is using the SPI bus, so no need to release
//spiReleaseBus(&SPID1); // spiReleaseBus(&SPID1);
spiUnselect(&SPID1); spiUnselect(&SPID1);
} }
static GFXINLINE void init_board(GDisplay *g) { static GFXINLINE void init_board(GDisplay *g) {
(void) g; (void)g;
palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL); palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL); palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
@ -82,31 +79,23 @@ static GFXINLINE void init_board(GDisplay *g) {
release_bus(g); release_bus(g);
} }
static GFXINLINE void post_init_board(GDisplay *g) { static GFXINLINE void post_init_board(GDisplay *g) { (void)g; }
(void) g;
}
static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) { static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
(void) g; (void)g;
if (state) { if (state) {
palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN); palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN);
} } else {
else {
palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN); palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
} }
} }
static GFXINLINE void enter_data_mode(GDisplay *g) { static GFXINLINE void enter_data_mode(GDisplay *g) { palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
}
static GFXINLINE void enter_cmd_mode(GDisplay *g) { static GFXINLINE void enter_cmd_mode(GDisplay *g) { palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN);
}
static GFXINLINE void write_data(GDisplay *g, uint8_t *data, uint16_t length) {
static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) { (void)g;
(void) g;
spiSend(&SPID1, length, data); spiSend(&SPID1, length, data);
} }

View file

@ -9,82 +9,89 @@
#if GFX_USE_GDISP #if GFX_USE_GDISP
#define GDISP_DRIVER_VMT GDISPVMT_ST7565_QMK # define GDISP_DRIVER_VMT GDISPVMT_ST7565_QMK
#include "gdisp_lld_config.h" # include "gdisp_lld_config.h"
#include "src/gdisp/gdisp_driver.h" # include "src/gdisp/gdisp_driver.h"
#include "board_st7565.h" # include "board_st7565.h"
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/
#ifndef GDISP_SCREEN_HEIGHT # ifndef GDISP_SCREEN_HEIGHT
#define GDISP_SCREEN_HEIGHT LCD_HEIGHT # define GDISP_SCREEN_HEIGHT LCD_HEIGHT
#endif # endif
#ifndef GDISP_SCREEN_WIDTH # ifndef GDISP_SCREEN_WIDTH
#define GDISP_SCREEN_WIDTH LCD_WIDTH # define GDISP_SCREEN_WIDTH LCD_WIDTH
#endif # endif
#ifndef GDISP_INITIAL_CONTRAST # ifndef GDISP_INITIAL_CONTRAST
#define GDISP_INITIAL_CONTRAST 35 # define GDISP_INITIAL_CONTRAST 35
#endif # endif
#ifndef GDISP_INITIAL_BACKLIGHT # ifndef GDISP_INITIAL_BACKLIGHT
#define GDISP_INITIAL_BACKLIGHT 100 # define GDISP_INITIAL_BACKLIGHT 100
#endif # endif
#define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0) # define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER << 0)
#include "st7565.h" # include "st7565.h"
/*===========================================================================*/ /*===========================================================================*/
/* Driver config defaults for backward compatibility. */ /* Driver config defaults for backward compatibility. */
/*===========================================================================*/ /*===========================================================================*/
#ifndef ST7565_LCD_BIAS # ifndef ST7565_LCD_BIAS
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7 # define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
#endif # endif
#ifndef ST7565_ADC # ifndef ST7565_ADC
#define ST7565_ADC ST7565_ADC_NORMAL # define ST7565_ADC ST7565_ADC_NORMAL
#endif # endif
#ifndef ST7565_COM_SCAN # ifndef ST7565_COM_SCAN
#define ST7565_COM_SCAN ST7565_COM_SCAN_INC # define ST7565_COM_SCAN ST7565_COM_SCAN_INC
#endif # endif
#ifndef ST7565_PAGE_ORDER # ifndef ST7565_PAGE_ORDER
#define ST7565_PAGE_ORDER 0,1,2,3 # define ST7565_PAGE_ORDER 0, 1, 2, 3
#endif # endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
typedef struct{ typedef struct {
bool_t buffer2; bool_t buffer2;
uint8_t data_pos; uint8_t data_pos;
uint8_t data[16]; uint8_t data[16];
uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8]; uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
}PrivData; } PrivData;
// Some common routines and macros // Some common routines and macros
#define PRIV(g) ((PrivData*)g->priv) # define PRIV(g) ((PrivData *)g->priv)
#define RAM(g) (PRIV(g)->ram) # define RAM(g) (PRIV(g)->ram)
static GFXINLINE void write_cmd(GDisplay* g, uint8_t cmd) { static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { PRIV(g)->data[PRIV(g)->data_pos++] = cmd; }
PRIV(g)->data[PRIV(g)->data_pos++] = cmd;
}
static GFXINLINE void flush_cmd(GDisplay* g) { static GFXINLINE void flush_cmd(GDisplay *g) {
write_data(g, PRIV(g)->data, PRIV(g)->data_pos); write_data(g, PRIV(g)->data, PRIV(g)->data_pos);
PRIV(g)->data_pos = 0; PRIV(g)->data_pos = 0;
} }
#define write_cmd2(g, cmd1, cmd2) { write_cmd(g, cmd1); write_cmd(g, cmd2); } # define write_cmd2(g, cmd1, cmd2) \
#define write_cmd3(g, cmd1, cmd2, cmd3) { write_cmd(g, cmd1); write_cmd(g, cmd2); write_cmd(g, cmd3); } { \
write_cmd(g, cmd1); \
write_cmd(g, cmd2); \
}
# define write_cmd3(g, cmd1, cmd2, cmd3) \
{ \
write_cmd(g, cmd1); \
write_cmd(g, cmd2); \
write_cmd(g, cmd3); \
}
// Some common routines and macros // Some common routines and macros
#define delay(us) gfxSleepMicroseconds(us) # define delay(us) gfxSleepMicroseconds(us)
#define delay_ms(ms) gfxSleepMilliseconds(ms) # define delay_ms(ms) gfxSleepMilliseconds(ms)
#define xyaddr(x, y) ((x) + ((y)>>3)*GDISP_SCREEN_WIDTH) # define xyaddr(x, y) ((x) + ((y) >> 3) * GDISP_SCREEN_WIDTH)
#define xybit(y) (1<<((y)&7)) # define xybit(y) (1 << ((y)&7))
/*===========================================================================*/ /*===========================================================================*/
/* Driver exported functions. */ /* Driver exported functions. */
@ -148,13 +155,12 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
return TRUE; return TRUE;
} }
#if GDISP_HARDWARE_FLUSH # if GDISP_HARDWARE_FLUSH
LLDSPEC void gdisp_lld_flush(GDisplay *g) { LLDSPEC void gdisp_lld_flush(GDisplay *g) {
unsigned p; unsigned p;
// Don't flush if we don't need it. // Don't flush if we don't need it.
if (!(g->flags & GDISP_FLG_NEEDFLUSH)) if (!(g->flags & GDISP_FLG_NEEDFLUSH)) return;
return;
acquire_bus(g); acquire_bus(g);
enter_cmd_mode(g); enter_cmd_mode(g);
@ -166,7 +172,7 @@ LLDSPEC void gdisp_lld_flush(GDisplay *g) {
write_cmd(g, ST7565_RMW); write_cmd(g, ST7565_RMW);
flush_cmd(g); flush_cmd(g);
enter_data_mode(g); enter_data_mode(g);
write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH); write_data(g, RAM(g) + (p * GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
enter_cmd_mode(g); enter_cmd_mode(g);
} }
unsigned line = (PRIV(g)->buffer2 ? 32 : 0); unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
@ -177,13 +183,13 @@ LLDSPEC void gdisp_lld_flush(GDisplay *g) {
g->flags &= ~GDISP_FLG_NEEDFLUSH; g->flags &= ~GDISP_FLG_NEEDFLUSH;
} }
#endif # endif
#if GDISP_HARDWARE_DRAWPIXEL # if GDISP_HARDWARE_DRAWPIXEL
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) { LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
coord_t x, y; coord_t x, y;
switch(g->g.Orientation) { switch (g->g.Orientation) {
default: default:
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
x = g->p.x; x = g->p.x;
@ -191,14 +197,14 @@ LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
x = g->p.y; x = g->p.y;
y = GDISP_SCREEN_HEIGHT-1 - g->p.x; y = GDISP_SCREEN_HEIGHT - 1 - g->p.x;
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
x = GDISP_SCREEN_WIDTH-1 - g->p.x; x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
y = GDISP_SCREEN_HEIGHT-1 - g->p.y; y = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
break; break;
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
x = GDISP_SCREEN_HEIGHT-1 - g->p.y; x = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
y = g->p.x; y = g->p.x;
break; break;
} }
@ -208,13 +214,13 @@ LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
RAM(g)[xyaddr(x, y)] &= ~xybit(y); RAM(g)[xyaddr(x, y)] &= ~xybit(y);
g->flags |= GDISP_FLG_NEEDFLUSH; g->flags |= GDISP_FLG_NEEDFLUSH;
} }
#endif # endif
#if GDISP_HARDWARE_PIXELREAD # if GDISP_HARDWARE_PIXELREAD
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) { LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
coord_t x, y; coord_t x, y;
switch(g->g.Orientation) { switch (g->g.Orientation) {
default: default:
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
x = g->p.x; x = g->p.x;
@ -222,23 +228,23 @@ LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
x = g->p.y; x = g->p.y;
y = GDISP_SCREEN_HEIGHT-1 - g->p.x; y = GDISP_SCREEN_HEIGHT - 1 - g->p.x;
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
x = GDISP_SCREEN_WIDTH-1 - g->p.x; x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
y = GDISP_SCREEN_HEIGHT-1 - g->p.y; y = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
break; break;
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
x = GDISP_SCREEN_HEIGHT-1 - g->p.y; x = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
y = g->p.x; y = g->p.x;
break; break;
} }
return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black; return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
} }
#endif # endif
LLDSPEC void gdisp_lld_blit_area(GDisplay *g) { LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
uint8_t* buffer = (uint8_t*)g->p.ptr; uint8_t *buffer = (uint8_t *)g->p.ptr;
int linelength = g->p.cx; int linelength = g->p.cx;
for (int i = 0; i < g->p.cy; i++) { for (int i = 0; i < g->p.cy; i++) {
unsigned dstx = g->p.x; unsigned dstx = g->p.x;
@ -246,15 +252,14 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
unsigned srcx = g->p.x1; unsigned srcx = g->p.x1;
unsigned srcy = g->p.y1 + i; unsigned srcy = g->p.y1 + i;
unsigned srcbit = srcy * g->p.x2 + srcx; unsigned srcbit = srcy * g->p.x2 + srcx;
for(int j=0; j < linelength; j++) { for (int j = 0; j < linelength; j++) {
uint8_t src = buffer[srcbit / 8]; uint8_t src = buffer[srcbit / 8];
uint8_t bit = 7-(srcbit % 8); uint8_t bit = 7 - (srcbit % 8);
uint8_t bitset = (src >> bit) & 1; uint8_t bitset = (src >> bit) & 1;
uint8_t* dst = &(RAM(g)[xyaddr(dstx, dsty)]); uint8_t *dst = &(RAM(g)[xyaddr(dstx, dsty)]);
if (bitset) { if (bitset) {
*dst |= xybit(dsty); *dst |= xybit(dsty);
} } else {
else {
*dst &= ~xybit(dsty); *dst &= ~xybit(dsty);
} }
dstx++; dstx++;
@ -264,13 +269,12 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
g->flags |= GDISP_FLG_NEEDFLUSH; g->flags |= GDISP_FLG_NEEDFLUSH;
} }
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL # if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
LLDSPEC void gdisp_lld_control(GDisplay *g) { LLDSPEC void gdisp_lld_control(GDisplay *g) {
switch(g->p.x) { switch (g->p.x) {
case GDISP_CONTROL_POWER: case GDISP_CONTROL_POWER:
if (g->g.Powermode == (powermode_t)g->p.ptr) if (g->g.Powermode == (powermode_t)g->p.ptr) return;
return; switch ((powermode_t)g->p.ptr) {
switch((powermode_t)g->p.ptr) {
case powerOff: case powerOff:
case powerSleep: case powerSleep:
case powerDeepSleep: case powerDeepSleep:
@ -294,9 +298,8 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
return; return;
case GDISP_CONTROL_ORIENTATION: case GDISP_CONTROL_ORIENTATION:
if (g->g.Orientation == (orientation_t)g->p.ptr) if (g->g.Orientation == (orientation_t)g->p.ptr) return;
return; switch ((orientation_t)g->p.ptr) {
switch((orientation_t)g->p.ptr) {
/* Rotation is handled by the drawing routines */ /* Rotation is handled by the drawing routines */
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
@ -324,6 +327,6 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
return; return;
} }
} }
#endif // GDISP_NEED_CONTROL # endif // GDISP_NEED_CONTROL
#endif // GFX_USE_GDISP #endif // GFX_USE_GDISP

View file

@ -14,13 +14,13 @@
/* Driver hardware support. */ /* Driver hardware support. */
/*===========================================================================*/ /*===========================================================================*/
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing # define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
#define GDISP_HARDWARE_DRAWPIXEL TRUE # define GDISP_HARDWARE_DRAWPIXEL TRUE
#define GDISP_HARDWARE_PIXELREAD TRUE # define GDISP_HARDWARE_PIXELREAD TRUE
#define GDISP_HARDWARE_CONTROL TRUE # define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_HARDWARE_BITFILLS TRUE # define GDISP_HARDWARE_BITFILLS TRUE
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO # define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO
#endif /* GFX_USE_GDISP */ #endif /* GFX_USE_GDISP */

View file

@ -17,40 +17,28 @@
#include "api.h" #include "api.h"
#include "quantum.h" #include "quantum.h"
void dword_to_bytes(uint32_t dword, uint8_t * bytes) { void dword_to_bytes(uint32_t dword, uint8_t* bytes) {
bytes[0] = (dword >> 24) & 0xFF; bytes[0] = (dword >> 24) & 0xFF;
bytes[1] = (dword >> 16) & 0xFF; bytes[1] = (dword >> 16) & 0xFF;
bytes[2] = (dword >> 8) & 0xFF; bytes[2] = (dword >> 8) & 0xFF;
bytes[3] = (dword >> 0) & 0xFF; bytes[3] = (dword >> 0) & 0xFF;
} }
uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index) { uint32_t bytes_to_dword(uint8_t* bytes, uint8_t index) { return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; }
return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3];
}
__attribute__ ((weak)) __attribute__((weak)) bool process_api_quantum(uint8_t length, uint8_t* data) { return process_api_keyboard(length, data); }
bool process_api_quantum(uint8_t length, uint8_t * data) {
return process_api_keyboard(length, data);
}
__attribute__ ((weak)) __attribute__((weak)) bool process_api_keyboard(uint8_t length, uint8_t* data) { return process_api_user(length, data); }
bool process_api_keyboard(uint8_t length, uint8_t * data) {
return process_api_user(length, data);
}
__attribute__ ((weak)) __attribute__((weak)) bool process_api_user(uint8_t length, uint8_t* data) { return true; }
bool process_api_user(uint8_t length, uint8_t * data) {
return true;
}
void process_api(uint16_t length, uint8_t * data) { void process_api(uint16_t length, uint8_t* data) {
// SEND_STRING("\nRX: "); // SEND_STRING("\nRX: ");
// for (uint8_t i = 0; i < length; i++) { // for (uint8_t i = 0; i < length; i++) {
// send_byte(data[i]); // send_byte(data[i]);
// SEND_STRING(" "); // SEND_STRING(" ");
// } // }
if (!process_api_quantum(length, data)) if (!process_api_quantum(length, data)) return;
return;
switch (data[0]) { switch (data[0]) {
case MT_SET_DATA: case MT_SET_DATA:
@ -65,10 +53,10 @@ void process_api(uint16_t length, uint8_t * data) {
break; break;
} }
case DT_RGBLIGHT: { case DT_RGBLIGHT: {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
uint32_t rgblight = bytes_to_dword(data, 2); uint32_t rgblight = bytes_to_dword(data, 2);
eeconfig_update_rgblight(rgblight); eeconfig_update_rgblight(rgblight);
#endif #endif
break; break;
} }
} }
@ -79,12 +67,12 @@ void process_api(uint16_t length, uint8_t * data) {
break; break;
} }
case DT_DEBUG: { case DT_DEBUG: {
uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) }; uint8_t debug_bytes[1] = {eeprom_read_byte(EECONFIG_DEBUG)};
MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1); MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1);
break; break;
} }
case DT_DEFAULT_LAYER: { case DT_DEFAULT_LAYER: {
uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) }; uint8_t default_bytes[1] = {eeprom_read_byte(EECONFIG_DEFAULT_LAYER)};
MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1); MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1);
break; break;
} }
@ -95,35 +83,35 @@ void process_api(uint16_t length, uint8_t * data) {
break; break;
} }
case DT_AUDIO: { case DT_AUDIO: {
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) }; uint8_t audio_bytes[1] = {eeprom_read_byte(EECONFIG_AUDIO)};
MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1); MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1);
#else #else
MT_GET_DATA_ACK(DT_AUDIO, NULL, 0); MT_GET_DATA_ACK(DT_AUDIO, NULL, 0);
#endif #endif
break; break;
} }
case DT_BACKLIGHT: { case DT_BACKLIGHT: {
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) }; uint8_t backlight_bytes[1] = {eeprom_read_byte(EECONFIG_BACKLIGHT)};
MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1); MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1);
#else #else
MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0); MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0);
#endif #endif
break; break;
} }
case DT_RGBLIGHT: { case DT_RGBLIGHT: {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
uint8_t rgblight_bytes[4]; uint8_t rgblight_bytes[4];
dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes); dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes);
MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4); MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4);
#else #else
MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0); MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0);
#endif #endif
break; break;
} }
case DT_KEYMAP_OPTIONS: { case DT_KEYMAP_OPTIONS: {
uint8_t keymap_bytes[1] = { eeconfig_read_keymap() }; uint8_t keymap_bytes[1] = {eeconfig_read_keymap()};
MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1); MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1);
break; break;
} }
@ -172,7 +160,7 @@ void process_api(uint16_t length, uint8_t * data) {
break; break;
case MT_TYPE_ERROR: case MT_TYPE_ERROR:
break; break;
default: ; // command not recognised default:; // command not recognised
SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length); SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length);
break; break;
@ -191,5 +179,4 @@ void process_api(uint16_t length, uint8_t * data) {
// break; // break;
// #endif // #endif
} }
} }

View file

@ -18,7 +18,7 @@
#define _API_H_ #define _API_H_
#ifdef __AVR__ #ifdef __AVR__
#include "lufa.h" # include "lufa.h"
#endif #endif
enum MESSAGE_TYPE { enum MESSAGE_TYPE {
@ -29,30 +29,14 @@ enum MESSAGE_TYPE {
MT_SEND_DATA = 0x30, // Sending data/action from keyboard MT_SEND_DATA = 0x30, // Sending data/action from keyboard
MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK)
MT_EXE_ACTION = 0x40, // executing actions on keyboard MT_EXE_ACTION = 0x40, // executing actions on keyboard
MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) MT_EXE_ACTION_ACK = 0x41, // return confirmation/value (ACK)
MT_TYPE_ERROR = 0x80 // type not recognised (ACK) MT_TYPE_ERROR = 0x80 // type not recognised (ACK)
}; };
enum DATA_TYPE { enum DATA_TYPE { DT_NONE = 0x00, DT_HANDSHAKE, DT_DEFAULT_LAYER, DT_CURRENT_LAYER, DT_KEYMAP_OPTIONS, DT_BACKLIGHT, DT_RGBLIGHT, DT_UNICODE, DT_DEBUG, DT_AUDIO, DT_QUANTUM_ACTION, DT_KEYBOARD_ACTION, DT_USER_ACTION, DT_KEYMAP_SIZE, DT_KEYMAP };
DT_NONE = 0x00,
DT_HANDSHAKE,
DT_DEFAULT_LAYER,
DT_CURRENT_LAYER,
DT_KEYMAP_OPTIONS,
DT_BACKLIGHT,
DT_RGBLIGHT,
DT_UNICODE,
DT_DEBUG,
DT_AUDIO,
DT_QUANTUM_ACTION,
DT_KEYBOARD_ACTION,
DT_USER_ACTION,
DT_KEYMAP_SIZE,
DT_KEYMAP
};
void dword_to_bytes(uint32_t dword, uint8_t * bytes); void dword_to_bytes(uint32_t dword, uint8_t* bytes);
uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index); uint32_t bytes_to_dword(uint8_t* bytes, uint8_t index);
#define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length) #define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length)
#define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length) #define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length)
@ -63,15 +47,12 @@ uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index);
#define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length) #define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length)
#define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length) #define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length)
void process_api(uint16_t length, uint8_t * data); void process_api(uint16_t length, uint8_t* data);
__attribute__ ((weak)) __attribute__((weak)) bool process_api_quantum(uint8_t length, uint8_t* data);
bool process_api_quantum(uint8_t length, uint8_t * data);
__attribute__ ((weak)) __attribute__((weak)) bool process_api_keyboard(uint8_t length, uint8_t* data);
bool process_api_keyboard(uint8_t length, uint8_t * data);
__attribute__ ((weak)) __attribute__((weak)) bool process_api_user(uint8_t length, uint8_t* data);
bool process_api_user(uint8_t length, uint8_t * data);
#endif #endif

View file

@ -18,7 +18,7 @@
#include "print.h" #include "print.h"
#include "qmk_midi.h" #include "qmk_midi.h"
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length) { void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t* bytes, uint16_t length) {
// SEND_STRING("\nTX: "); // SEND_STRING("\nTX: ");
// for (uint8_t i = 0; i < length; i++) { // for (uint8_t i = 0; i < length; i++) {
// send_byte(bytes[i]); // send_byte(bytes[i]);
@ -29,7 +29,6 @@ void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes,
return; return;
} }
// The buffer size required is calculated as the following // The buffer size required is calculated as the following
// API_SYSEX_MAX_SIZE is the maximum length // API_SYSEX_MAX_SIZE is the maximum length
// In addition to that we have a two byte message header consisting of the message_type and data_type // In addition to that we have a two byte message header consisting of the message_type and data_type

View file

@ -19,7 +19,7 @@
#include "api.h" #include "api.h"
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length); void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t* bytes, uint16_t length);
#define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l) #define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l)

View file

@ -18,9 +18,9 @@
#include <string.h> #include <string.h>
//#include <math.h> //#include <math.h>
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/io.h> # include <avr/io.h>
#endif #endif
#include "print.h" #include "print.h"
#include "audio.h" #include "audio.h"
@ -35,84 +35,83 @@
// Timer Abstractions // Timer Abstractions
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
//Currently we support timers 1 and 3 used at the sime time, channels A-C, // Currently we support timers 1 and 3 used at the sime time, channels A-C,
//pins PB5, PB6, PB7, PC4, PC5, and PC6 // pins PB5, PB6, PB7, PC4, PC5, and PC6
#if defined(C6_AUDIO) #if defined(C6_AUDIO)
#define CPIN_AUDIO # define CPIN_AUDIO
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6); # define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6);
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); # define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) # define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) # define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); # define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); # define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
#define TIMER_3_PERIOD ICR3 # define TIMER_3_PERIOD ICR3
#define TIMER_3_DUTY_CYCLE OCR3A # define TIMER_3_DUTY_CYCLE OCR3A
#define TIMER3_AUDIO_vect TIMER3_COMPA_vect # define TIMER3_AUDIO_vect TIMER3_COMPA_vect
#endif #endif
#if defined(C5_AUDIO) #if defined(C5_AUDIO)
#define CPIN_AUDIO # define CPIN_AUDIO
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5); # define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5);
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30); # define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30);
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B) # define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B)
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B) # define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B)
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1); # define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1);
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0)); # define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0));
#define TIMER_3_PERIOD ICR3 # define TIMER_3_PERIOD ICR3
#define TIMER_3_DUTY_CYCLE OCR3B # define TIMER_3_DUTY_CYCLE OCR3B
#define TIMER3_AUDIO_vect TIMER3_COMPB_vect # define TIMER3_AUDIO_vect TIMER3_COMPB_vect
#endif #endif
#if defined(C4_AUDIO) #if defined(C4_AUDIO)
#define CPIN_AUDIO # define CPIN_AUDIO
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4); # define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4);
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30); # define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30);
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C) # define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C)
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C) # define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C)
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1); # define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1);
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0)); # define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0));
#define TIMER_3_PERIOD ICR3 # define TIMER_3_PERIOD ICR3
#define TIMER_3_DUTY_CYCLE OCR3C # define TIMER_3_DUTY_CYCLE OCR3C
#define TIMER3_AUDIO_vect TIMER3_COMPC_vect # define TIMER3_AUDIO_vect TIMER3_COMPC_vect
#endif #endif
#if defined(B5_AUDIO) #if defined(B5_AUDIO)
#define BPIN_AUDIO # define BPIN_AUDIO
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5); # define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5);
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); # define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A) # define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A)
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A) # define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A)
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1); # define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1);
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0)); # define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0));
#define TIMER_1_PERIOD ICR1 # define TIMER_1_PERIOD ICR1
#define TIMER_1_DUTY_CYCLE OCR1A # define TIMER_1_DUTY_CYCLE OCR1A
#define TIMER1_AUDIO_vect TIMER1_COMPA_vect # define TIMER1_AUDIO_vect TIMER1_COMPA_vect
#endif #endif
#if defined(B6_AUDIO) #if defined(B6_AUDIO)
#define BPIN_AUDIO # define BPIN_AUDIO
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6); # define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6);
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10); # define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10);
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B) # define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B)
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B) # define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B)
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1); # define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1);
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0)); # define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0));
#define TIMER_1_PERIOD ICR1 # define TIMER_1_PERIOD ICR1
#define TIMER_1_DUTY_CYCLE OCR1B # define TIMER_1_DUTY_CYCLE OCR1B
#define TIMER1_AUDIO_vect TIMER1_COMPB_vect # define TIMER1_AUDIO_vect TIMER1_COMPB_vect
#endif #endif
#if defined(B7_AUDIO) #if defined(B7_AUDIO)
#define BPIN_AUDIO # define BPIN_AUDIO
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7); # define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7);
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10); # define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10);
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C) # define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C)
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C) # define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C)
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1); # define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1);
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0)); # define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0));
#define TIMER_1_PERIOD ICR1 # define TIMER_1_PERIOD ICR1
#define TIMER_1_DUTY_CYCLE OCR1C # define TIMER_1_DUTY_CYCLE OCR1C
#define TIMER1_AUDIO_vect TIMER1_COMPC_vect # define TIMER1_AUDIO_vect TIMER1_COMPC_vect
#endif #endif
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
int voices = 0; int voices = 0;
int voice_place = 0; int voice_place = 0;
float frequency = 0; float frequency = 0;
@ -126,7 +125,7 @@ bool sliding = false;
float place = 0; float place = 0;
uint8_t * sample; uint8_t* sample;
uint16_t sample_length = 0; uint16_t sample_length = 0;
bool playing_notes = false; bool playing_notes = false;
@ -136,7 +135,7 @@ float note_length = 0;
uint8_t note_tempo = TEMPO_DEFAULT; uint8_t note_tempo = TEMPO_DEFAULT;
float note_timbre = TIMBRE_DEFAULT; float note_timbre = TIMBRE_DEFAULT;
uint16_t note_position = 0; uint16_t note_position = 0;
float (* notes_pointer)[][2]; float (*notes_pointer)[][2];
uint16_t notes_count; uint16_t notes_count;
bool notes_repeat; bool notes_repeat;
bool note_resting = false; bool note_resting = false;
@ -160,70 +159,66 @@ uint16_t envelope_index = 0;
bool glissando = true; bool glissando = true;
#ifndef STARTUP_SONG #ifndef STARTUP_SONG
#define STARTUP_SONG SONG(STARTUP_SOUND) # define STARTUP_SONG SONG(STARTUP_SOUND)
#endif #endif
#ifndef AUDIO_ON_SONG #ifndef AUDIO_ON_SONG
#define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND) # define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND)
#endif #endif
#ifndef AUDIO_OFF_SONG #ifndef AUDIO_OFF_SONG
#define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND) # define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND)
#endif #endif
float startup_song[][2] = STARTUP_SONG; float startup_song[][2] = STARTUP_SONG;
float audio_on_song[][2] = AUDIO_ON_SONG; float audio_on_song[][2] = AUDIO_ON_SONG;
float audio_off_song[][2] = AUDIO_OFF_SONG; float audio_off_song[][2] = AUDIO_OFF_SONG;
void audio_init() void audio_init() {
{
// Check EEPROM // Check EEPROM
if (!eeconfig_is_enabled()) if (!eeconfig_is_enabled()) {
{
eeconfig_init(); eeconfig_init();
} }
audio_config.raw = eeconfig_read_audio(); audio_config.raw = eeconfig_read_audio();
if (!audio_initialized) { if (!audio_initialized) {
// Set audio ports as output
// Set audio ports as output #ifdef CPIN_AUDIO
#ifdef CPIN_AUDIO
CPIN_SET_DIRECTION CPIN_SET_DIRECTION
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
BPIN_SET_DIRECTION BPIN_SET_DIRECTION
DISABLE_AUDIO_COUNTER_1_ISR; DISABLE_AUDIO_COUNTER_1_ISR;
#endif #endif
// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B
// Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation // Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation
// OC3A -- PC6 // OC3A -- PC6
// OC3B -- PC5 // OC3B -- PC5
// OC3C -- PC4 // OC3C -- PC4
// OC1A -- PB5 // OC1A -- PB5
// OC1B -- PB6 // OC1B -- PB6
// OC1C -- PB7 // OC1C -- PB7
// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A) // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A)
// OCR3A - PC6 // OCR3A - PC6
// OCR3B - PC5 // OCR3B - PC5
// OCR3C - PC4 // OCR3C - PC4
// OCR1A - PB5 // OCR1A - PB5
// OCR1B - PB6 // OCR1B - PB6
// OCR1C - PB7 // OCR1C - PB7
// Clock Select (CS3n) = 0b010 = Clock / 8 // Clock Select (CS3n) = 0b010 = Clock / 8
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
INIT_AUDIO_COUNTER_3 INIT_AUDIO_COUNTER_3
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
INIT_AUDIO_COUNTER_1 INIT_AUDIO_COUNTER_1
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
#endif #endif
audio_initialized = true; audio_initialized = true;
} }
@ -231,11 +226,9 @@ void audio_init()
if (audio_config.enable) { if (audio_config.enable) {
PLAY_SONG(startup_song); PLAY_SONG(startup_song);
} }
} }
void stop_all_notes() void stop_all_notes() {
{
dprintf("audio stop all notes"); dprintf("audio stop all notes");
if (!audio_initialized) { if (!audio_initialized) {
@ -243,15 +236,15 @@ void stop_all_notes()
} }
voices = 0; voices = 0;
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
DISABLE_AUDIO_COUNTER_3_OUTPUT; DISABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
DISABLE_AUDIO_COUNTER_1_ISR; DISABLE_AUDIO_COUNTER_1_ISR;
DISABLE_AUDIO_COUNTER_1_OUTPUT; DISABLE_AUDIO_COUNTER_1_OUTPUT;
#endif #endif
playing_notes = false; playing_notes = false;
playing_note = false; playing_note = false;
@ -259,15 +252,13 @@ void stop_all_notes()
frequency_alt = 0; frequency_alt = 0;
volume = 0; volume = 0;
for (uint8_t i = 0; i < 8; i++) for (uint8_t i = 0; i < 8; i++) {
{
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
} }
} }
void stop_note(float freq) void stop_note(float freq) {
{
dprintf("audio stop note freq=%d", (int)freq); dprintf("audio stop note freq=%d", (int)freq);
if (playing_note) { if (playing_note) {
@ -279,29 +270,28 @@ void stop_note(float freq)
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
for (int j = i; (j < 7); j++) { for (int j = i; (j < 7); j++) {
frequencies[j] = frequencies[j+1]; frequencies[j] = frequencies[j + 1];
frequencies[j+1] = 0; frequencies[j + 1] = 0;
volumes[j] = volumes[j+1]; volumes[j] = volumes[j + 1];
volumes[j+1] = 0; volumes[j + 1] = 0;
} }
break; break;
} }
} }
voices--; voices--;
if (voices < 0) if (voices < 0) voices = 0;
voices = 0;
if (voice_place >= voices) { if (voice_place >= voices) {
voice_place = 0; voice_place = 0;
} }
if (voices == 0) { if (voices == 0) {
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
DISABLE_AUDIO_COUNTER_3_OUTPUT; DISABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
DISABLE_AUDIO_COUNTER_1_ISR; DISABLE_AUDIO_COUNTER_1_ISR;
DISABLE_AUDIO_COUNTER_1_OUTPUT; DISABLE_AUDIO_COUNTER_1_OUTPUT;
#endif #endif
frequency = 0; frequency = 0;
frequency_alt = 0; frequency_alt = 0;
volume = 0; volume = 0;
@ -312,41 +302,38 @@ void stop_note(float freq)
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
float mod(float a, int b) float mod(float a, int b) {
{
float r = fmod(a, b); float r = fmod(a, b);
return r < 0 ? r + b : r; return r < 0 ? r + b : r;
} }
float vibrato(float average_freq) { float vibrato(float average_freq) {
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
#else # else
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
#endif # endif
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
return vibrated_freq; return vibrated_freq;
} }
#endif #endif
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
ISR(TIMER3_AUDIO_vect) ISR(TIMER3_AUDIO_vect) {
{
float freq; float freq;
if (playing_note) { if (playing_note) {
if (voices > 0) { if (voices > 0) {
# ifdef BPIN_AUDIO
#ifdef BPIN_AUDIO
float freq_alt = 0; float freq_alt = 0;
if (voices > 1) { if (voices > 1) {
if (polyphony_rate == 0) { if (polyphony_rate == 0) {
if (glissando) { if (glissando) {
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) { if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) {
frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2); frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2);
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) { } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) {
frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2); frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2);
} else { } else {
frequency_alt = frequencies[voices - 2]; frequency_alt = frequencies[voices - 2];
} }
@ -354,15 +341,15 @@ ISR(TIMER3_AUDIO_vect)
frequency_alt = frequencies[voices - 2]; frequency_alt = frequencies[voices - 2];
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq_alt = vibrato(frequency_alt); freq_alt = vibrato(frequency_alt);
} else { } else {
freq_alt = frequency_alt; freq_alt = frequency_alt;
} }
#else # else
freq_alt = frequency_alt; freq_alt = frequency_alt;
#endif # endif
} }
if (envelope_index < 65535) { if (envelope_index < 65535) {
@ -378,7 +365,7 @@ ISR(TIMER3_AUDIO_vect)
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER)); TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER));
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre);
} }
#endif # endif
if (polyphony_rate > 0) { if (polyphony_rate > 0) {
if (voices > 1) { if (voices > 1) {
@ -389,21 +376,21 @@ ISR(TIMER3_AUDIO_vect)
} }
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]); freq = vibrato(frequencies[voice_place]);
} else { } else {
freq = frequencies[voice_place]; freq = frequencies[voice_place];
} }
#else # else
freq = frequencies[voice_place]; freq = frequencies[voice_place];
#endif # endif
} else { } else {
if (glissando) { if (glissando) {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, 440/frequency/12/2); frequency = frequency * pow(2, 440 / frequency / 12 / 2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, -440/frequency/12/2); frequency = frequency * pow(2, -440 / frequency / 12 / 2);
} else { } else {
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
@ -411,15 +398,15 @@ ISR(TIMER3_AUDIO_vect)
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequency); freq = vibrato(frequency);
} else { } else {
freq = frequency; freq = frequency;
} }
#else # else
freq = frequency; freq = frequency;
#endif # endif
} }
if (envelope_index < 65535) { if (envelope_index < 65535) {
@ -439,15 +426,15 @@ ISR(TIMER3_AUDIO_vect)
if (playing_notes) { if (playing_notes) {
if (note_frequency > 0) { if (note_frequency > 0) {
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(note_frequency); freq = vibrato(note_frequency);
} else { } else {
freq = note_frequency; freq = note_frequency;
} }
#else # else
freq = note_frequency; freq = note_frequency;
#endif # endif
if (envelope_index < 65535) { if (envelope_index < 65535) {
envelope_index++; envelope_index++;
@ -513,9 +500,8 @@ ISR(TIMER3_AUDIO_vect)
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
ISR(TIMER1_AUDIO_vect) ISR(TIMER1_AUDIO_vect) {
{ # if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
#if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
float freq = 0; float freq = 0;
if (playing_note) { if (playing_note) {
@ -529,21 +515,21 @@ ISR(TIMER1_AUDIO_vect)
} }
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]); freq = vibrato(frequencies[voice_place]);
} else { } else {
freq = frequencies[voice_place]; freq = frequencies[voice_place];
} }
#else # else
freq = frequencies[voice_place]; freq = frequencies[voice_place];
#endif # endif
} else { } else {
if (glissando) { if (glissando) {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, 440/frequency/12/2); frequency = frequency * pow(2, 440 / frequency / 12 / 2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, -440/frequency/12/2); frequency = frequency * pow(2, -440 / frequency / 12 / 2);
} else { } else {
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
@ -551,15 +537,15 @@ ISR(TIMER1_AUDIO_vect)
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequency); freq = vibrato(frequency);
} else { } else {
freq = frequency; freq = frequency;
} }
#else # else
freq = frequency; freq = frequency;
#endif # endif
} }
if (envelope_index < 65535) { if (envelope_index < 65535) {
@ -579,15 +565,15 @@ ISR(TIMER1_AUDIO_vect)
if (playing_notes) { if (playing_notes) {
if (note_frequency > 0) { if (note_frequency > 0) {
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(note_frequency); freq = vibrato(note_frequency);
} else { } else {
freq = note_frequency; freq = note_frequency;
} }
#else # else
freq = note_frequency; freq = note_frequency;
#endif # endif
if (envelope_index < 65535) { if (envelope_index < 65535) {
envelope_index++; envelope_index++;
@ -649,12 +635,11 @@ ISR(TIMER1_AUDIO_vect)
playing_notes = false; playing_notes = false;
playing_note = false; playing_note = false;
} }
#endif # endif
} }
#endif #endif
void play_note(float freq, int vol) { void play_note(float freq, int vol) {
dprintf("audio play note freq=%d vol=%d", (int)freq, vol); dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
if (!audio_initialized) { if (!audio_initialized) {
@ -662,16 +647,15 @@ void play_note(float freq, int vol) {
} }
if (audio_config.enable && voices < 8) { if (audio_config.enable && voices < 8) {
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
DISABLE_AUDIO_COUNTER_1_ISR; DISABLE_AUDIO_COUNTER_1_ISR;
#endif #endif
// Cancel notes if notes are playing // Cancel notes if notes are playing
if (playing_notes) if (playing_notes) stop_all_notes();
stop_all_notes();
playing_note = true; playing_note = true;
@ -683,44 +667,39 @@ void play_note(float freq, int vol) {
voices++; voices++;
} }
#ifdef CPIN_AUDIO #ifdef CPIN_AUDIO
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
ENABLE_AUDIO_COUNTER_3_OUTPUT; ENABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
#ifdef CPIN_AUDIO # ifdef CPIN_AUDIO
if (voices > 1) { if (voices > 1) {
ENABLE_AUDIO_COUNTER_1_ISR; ENABLE_AUDIO_COUNTER_1_ISR;
ENABLE_AUDIO_COUNTER_1_OUTPUT; ENABLE_AUDIO_COUNTER_1_OUTPUT;
} }
#else # else
ENABLE_AUDIO_COUNTER_1_ISR; ENABLE_AUDIO_COUNTER_1_ISR;
ENABLE_AUDIO_COUNTER_1_OUTPUT; ENABLE_AUDIO_COUNTER_1_OUTPUT;
#endif # endif
#endif #endif
} }
} }
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
{
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
if (audio_config.enable) { if (audio_config.enable) {
#ifdef CPIN_AUDIO
#ifdef CPIN_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
DISABLE_AUDIO_COUNTER_1_ISR; DISABLE_AUDIO_COUNTER_1_ISR;
#endif #endif
// Cancel note if a note is playing // Cancel note if a note is playing
if (playing_note) if (playing_note) stop_all_notes();
stop_all_notes();
playing_notes = true; playing_notes = true;
@ -735,34 +714,27 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
note_position = 0; note_position = 0;
#ifdef CPIN_AUDIO
#ifdef CPIN_AUDIO
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
ENABLE_AUDIO_COUNTER_3_OUTPUT; ENABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
#ifdef BPIN_AUDIO #ifdef BPIN_AUDIO
#ifndef CPIN_AUDIO # ifndef CPIN_AUDIO
ENABLE_AUDIO_COUNTER_1_ISR; ENABLE_AUDIO_COUNTER_1_ISR;
ENABLE_AUDIO_COUNTER_1_OUTPUT; ENABLE_AUDIO_COUNTER_1_OUTPUT;
#endif # endif
#endif #endif
} }
} }
bool is_playing_notes(void) { bool is_playing_notes(void) { return playing_notes; }
return playing_notes;
}
bool is_audio_on(void) { bool is_audio_on(void) { return (audio_config.enable != 0); }
return (audio_config.enable != 0);
}
void audio_toggle(void) { void audio_toggle(void) {
audio_config.enable ^= 1; audio_config.enable ^= 1;
eeconfig_update_audio(audio_config.raw); eeconfig_update_audio(audio_config.raw);
if (audio_config.enable) if (audio_config.enable) audio_on_user();
audio_on_user();
} }
void audio_on(void) { void audio_on(void) {
@ -784,73 +756,45 @@ void audio_off(void) {
// Vibrato rate functions // Vibrato rate functions
void set_vibrato_rate(float rate) { void set_vibrato_rate(float rate) { vibrato_rate = rate; }
vibrato_rate = rate;
}
void increase_vibrato_rate(float change) { void increase_vibrato_rate(float change) { vibrato_rate *= change; }
vibrato_rate *= change;
}
void decrease_vibrato_rate(float change) { void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
vibrato_rate /= change;
}
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength) { void set_vibrato_strength(float strength) { vibrato_strength = strength; }
vibrato_strength = strength;
}
void increase_vibrato_strength(float change) { void increase_vibrato_strength(float change) { vibrato_strength *= change; }
vibrato_strength *= change;
}
void decrease_vibrato_strength(float change) { void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
vibrato_strength /= change;
}
#endif /* VIBRATO_STRENGTH_ENABLE */ # endif /* VIBRATO_STRENGTH_ENABLE */
#endif /* VIBRATO_ENABLE */ #endif /* VIBRATO_ENABLE */
// Polyphony functions // Polyphony functions
void set_polyphony_rate(float rate) { void set_polyphony_rate(float rate) { polyphony_rate = rate; }
polyphony_rate = rate;
}
void enable_polyphony() { void enable_polyphony() { polyphony_rate = 5; }
polyphony_rate = 5;
}
void disable_polyphony() { void disable_polyphony() { polyphony_rate = 0; }
polyphony_rate = 0;
}
void increase_polyphony_rate(float change) { void increase_polyphony_rate(float change) { polyphony_rate *= change; }
polyphony_rate *= change;
}
void decrease_polyphony_rate(float change) { void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
polyphony_rate /= change;
}
// Timbre function // Timbre function
void set_timbre(float timbre) { void set_timbre(float timbre) { note_timbre = timbre; }
note_timbre = timbre;
}
// Tempo functions // Tempo functions
void set_tempo(uint8_t tempo) { void set_tempo(uint8_t tempo) { note_tempo = tempo; }
note_tempo = tempo;
}
void decrease_tempo(uint8_t tempo_change) { void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
note_tempo += tempo_change;
}
void increase_tempo(uint8_t tempo_change) { void increase_tempo(uint8_t tempo_change) {
if (note_tempo - tempo_change < 10) { if (note_tempo - tempo_change < 10) {

View file

@ -19,7 +19,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/io.h> # include <avr/io.h>
#endif #endif
#include "wait.h" #include "wait.h"
#include "musical_notes.h" #include "musical_notes.h"
@ -39,9 +39,9 @@
typedef union { typedef union {
uint8_t raw; uint8_t raw;
struct { struct {
bool enable :1; bool enable : 1;
bool clicky_enable :1; bool clicky_enable : 1;
uint8_t level :6; uint8_t level : 6;
}; };
} audio_config_t; } audio_config_t;
@ -58,13 +58,13 @@ void set_vibrato_rate(float rate);
void increase_vibrato_rate(float change); void increase_vibrato_rate(float change);
void decrease_vibrato_rate(float change); void decrease_vibrato_rate(float change);
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength); void set_vibrato_strength(float strength);
void increase_vibrato_strength(float change); void increase_vibrato_strength(float change);
void decrease_vibrato_strength(float change); void decrease_vibrato_strength(float change);
#endif # endif
#endif #endif
@ -85,25 +85,23 @@ void decrease_tempo(uint8_t tempo_change);
void audio_init(void); void audio_init(void);
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
void play_sample(uint8_t * s, uint16_t l, bool r); void play_sample(uint8_t* s, uint16_t l, bool r);
#endif #endif
void play_note(float freq, int vol); void play_note(float freq, int vol);
void stop_note(float freq); void stop_note(float freq);
void stop_all_notes(void); void stop_all_notes(void);
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat); void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat);
#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ #define SCALE \
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ (int8_t[]) { 0 + (12 * 0), 2 + (12 * 0), 4 + (12 * 0), 5 + (12 * 0), 7 + (12 * 0), 9 + (12 * 0), 11 + (12 * 0), 0 + (12 * 1), 2 + (12 * 1), 4 + (12 * 1), 5 + (12 * 1), 7 + (12 * 1), 9 + (12 * 1), 11 + (12 * 1), 0 + (12 * 2), 2 + (12 * 2), 4 + (12 * 2), 5 + (12 * 2), 7 + (12 * 2), 9 + (12 * 2), 11 + (12 * 2), 0 + (12 * 3), 2 + (12 * 3), 4 + (12 * 3), 5 + (12 * 3), 7 + (12 * 3), 9 + (12 * 3), 11 + (12 * 3), 0 + (12 * 4), 2 + (12 * 4), 4 + (12 * 4), 5 + (12 * 4), 7 + (12 * 4), 9 + (12 * 4), 11 + (12 * 4), }
0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
// These macros are used to allow play_notes to play an array of indeterminate // These macros are used to allow play_notes to play an array of indeterminate
// length. This works around the limitation of C's sizeof operation on pointers. // length. This works around the limitation of C's sizeof operation on pointers.
// The global float array for the song must be used here. // The global float array for the song must be used here.
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) #define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \ #define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) \
_Pragma ("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"") play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
_Pragma("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
#define PLAY_SONG(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), false) #define PLAY_SONG(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), false)
#define PLAY_LOOP(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), true) #define PLAY_LOOP(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), true)

View file

@ -39,7 +39,7 @@ bool sliding = false;
float place = 0; float place = 0;
uint8_t * sample; uint8_t *sample;
uint16_t sample_length = 0; uint16_t sample_length = 0;
bool playing_notes = false; bool playing_notes = false;
@ -49,7 +49,7 @@ float note_length = 0;
uint8_t note_tempo = TEMPO_DEFAULT; uint8_t note_tempo = TEMPO_DEFAULT;
float note_timbre = TIMBRE_DEFAULT; float note_timbre = TIMBRE_DEFAULT;
uint16_t note_position = 0; uint16_t note_position = 0;
float (* notes_pointer)[][2]; float (*notes_pointer)[][2];
uint16_t notes_count; uint16_t notes_count;
bool notes_repeat; bool notes_repeat;
bool note_resting = false; bool note_resting = false;
@ -73,7 +73,7 @@ uint16_t envelope_index = 0;
bool glissando = true; bool glissando = true;
#ifndef STARTUP_SONG #ifndef STARTUP_SONG
#define STARTUP_SONG SONG(STARTUP_SOUND) # define STARTUP_SONG SONG(STARTUP_SOUND)
#endif #endif
float startup_song[][2] = STARTUP_SONG; float startup_song[][2] = STARTUP_SONG;
@ -81,27 +81,32 @@ static void gpt_cb8(GPTDriver *gptp);
#define DAC_BUFFER_SIZE 100 #define DAC_BUFFER_SIZE 100
#ifndef DAC_SAMPLE_MAX #ifndef DAC_SAMPLE_MAX
#define DAC_SAMPLE_MAX 65535U # define DAC_SAMPLE_MAX 65535U
#endif #endif
#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ #define START_CHANNEL_1() \
gptStart(&GPTD6, &gpt6cfg1); \
gptStartContinuous(&GPTD6, 2U) gptStartContinuous(&GPTD6, 2U)
#define START_CHANNEL_2() gptStart(&GPTD7, &gpt7cfg1); \ #define START_CHANNEL_2() \
gptStart(&GPTD7, &gpt7cfg1); \
gptStartContinuous(&GPTD7, 2U) gptStartContinuous(&GPTD7, 2U)
#define STOP_CHANNEL_1() gptStopTimer(&GPTD6) #define STOP_CHANNEL_1() gptStopTimer(&GPTD6)
#define STOP_CHANNEL_2() gptStopTimer(&GPTD7) #define STOP_CHANNEL_2() gptStopTimer(&GPTD7)
#define RESTART_CHANNEL_1() STOP_CHANNEL_1(); \ #define RESTART_CHANNEL_1() \
STOP_CHANNEL_1(); \
START_CHANNEL_1() START_CHANNEL_1()
#define RESTART_CHANNEL_2() STOP_CHANNEL_2(); \ #define RESTART_CHANNEL_2() \
STOP_CHANNEL_2(); \
START_CHANNEL_2() START_CHANNEL_2()
#define UPDATE_CHANNEL_1_FREQ(freq) gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \ #define UPDATE_CHANNEL_1_FREQ(freq) \
gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \
RESTART_CHANNEL_1() RESTART_CHANNEL_1()
#define UPDATE_CHANNEL_2_FREQ(freq) gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \ #define UPDATE_CHANNEL_2_FREQ(freq) \
gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \
RESTART_CHANNEL_2() RESTART_CHANNEL_2()
#define GET_CHANNEL_1_FREQ (uint16_t)(gpt6cfg1.frequency * DAC_BUFFER_SIZE) #define GET_CHANNEL_1_FREQ (uint16_t)(gpt6cfg1.frequency * DAC_BUFFER_SIZE)
#define GET_CHANNEL_2_FREQ (uint16_t)(gpt7cfg1.frequency * DAC_BUFFER_SIZE) #define GET_CHANNEL_2_FREQ (uint16_t)(gpt7cfg1.frequency * DAC_BUFFER_SIZE)
/* /*
* GPT6 configuration. * GPT6 configuration.
*/ */
@ -112,27 +117,20 @@ static void gpt_cb8(GPTDriver *gptp);
// .dier = 0U // .dier = 0U
// }; // };
GPTConfig gpt6cfg1 = { GPTConfig gpt6cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE,
.frequency = 440U*DAC_BUFFER_SIZE,
.callback = NULL, .callback = NULL,
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
.dier = 0U .dier = 0U};
};
GPTConfig gpt7cfg1 = { GPTConfig gpt7cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE,
.frequency = 440U*DAC_BUFFER_SIZE,
.callback = NULL, .callback = NULL,
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
.dier = 0U .dier = 0U};
};
GPTConfig gpt8cfg1 = { GPTConfig gpt8cfg1 = {.frequency = 10,
.frequency = 10,
.callback = gpt_cb8, .callback = gpt_cb8,
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */ .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
.dier = 0U .dier = 0U};
};
/* /*
* DAC test buffer (sine wave). * DAC test buffer (sine wave).
@ -206,15 +204,15 @@ GPTConfig gpt8cfg1 = {
// squarewave // squarewave
static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
// First half is max, second half is 0 // First half is max, second half is 0
[0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX, [0 ... DAC_BUFFER_SIZE / 2 - 1] = DAC_SAMPLE_MAX,
[DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0, [DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = 0,
}; };
// squarewave // squarewave
static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
// opposite of dac_buffer above // opposite of dac_buffer above
[0 ... DAC_BUFFER_SIZE/2-1] = 0, [0 ... DAC_BUFFER_SIZE / 2 - 1] = 0,
[DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = DAC_SAMPLE_MAX, [DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = DAC_SAMPLE_MAX,
}; };
/* /*
@ -222,14 +220,12 @@ static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
*/ */
size_t nx = 0, ny = 0, nz = 0; size_t nx = 0, ny = 0, nz = 0;
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) { static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
(void)dacp; (void)dacp;
nz++; nz++;
if (dac_buffer == buffer) { if (dac_buffer == buffer) {
nx += n; nx += n;
} } else {
else {
ny += n; ny += n;
} }
@ -242,54 +238,36 @@ static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
* DAC error callback. * DAC error callback.
*/ */
static void error_cb1(DACDriver *dacp, dacerror_t err) { static void error_cb1(DACDriver *dacp, dacerror_t err) {
(void)dacp; (void)dacp;
(void)err; (void)err;
chSysHalt("DAC failure"); chSysHalt("DAC failure");
} }
static const DACConfig dac1cfg1 = { static const DACConfig dac1cfg1 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT};
.init = DAC_SAMPLE_MAX,
.datamode = DAC_DHRM_12BIT_RIGHT
};
static const DACConversionGroup dacgrpcfg1 = { static const DACConversionGroup dacgrpcfg1 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)};
.num_channels = 1U,
.end_cb = end_cb1,
.error_cb = error_cb1,
.trigger = DAC_TRG(0)
};
static const DACConfig dac1cfg2 = { static const DACConfig dac1cfg2 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT};
.init = DAC_SAMPLE_MAX,
.datamode = DAC_DHRM_12BIT_RIGHT
};
static const DACConversionGroup dacgrpcfg2 = { static const DACConversionGroup dacgrpcfg2 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)};
.num_channels = 1U,
.end_cb = end_cb1,
.error_cb = error_cb1,
.trigger = DAC_TRG(0)
};
void audio_init() { void audio_init() {
if (audio_initialized) { if (audio_initialized) {
return; return;
} }
// Check EEPROM // Check EEPROM
#if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) #if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE)
if (!eeconfig_is_enabled()) { if (!eeconfig_is_enabled()) {
eeconfig_init(); eeconfig_init();
} }
audio_config.raw = eeconfig_read_audio(); audio_config.raw = eeconfig_read_audio();
#else // ARM EEPROM #else // ARM EEPROM
audio_config.enable = true; audio_config.enable = true;
#ifdef AUDIO_CLICKY_ON # ifdef AUDIO_CLICKY_ON
audio_config.clicky_enable = true; audio_config.clicky_enable = true;
#endif # endif
#endif // ARM EEPROM #endif // ARM EEPROM
/* /*
@ -320,7 +298,6 @@ void audio_init() {
} else { } else {
stop_all_notes(); stop_all_notes();
} }
} }
void stop_all_notes() { void stop_all_notes() {
@ -341,8 +318,7 @@ void stop_all_notes() {
frequency_alt = 0; frequency_alt = 0;
volume = 0; volume = 0;
for (uint8_t i = 0; i < 8; i++) for (uint8_t i = 0; i < 8; i++) {
{
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
} }
@ -360,10 +336,10 @@ void stop_note(float freq) {
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
for (int j = i; (j < 7); j++) { for (int j = i; (j < 7); j++) {
frequencies[j] = frequencies[j+1]; frequencies[j] = frequencies[j + 1];
frequencies[j+1] = 0; frequencies[j + 1] = 0;
volumes[j] = volumes[j+1]; volumes[j] = volumes[j + 1];
volumes[j+1] = 0; volumes[j + 1] = 0;
} }
break; break;
} }
@ -395,12 +371,12 @@ float mod(float a, int b) {
} }
float vibrato(float average_freq) { float vibrato(float average_freq) {
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
#else # else
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
#endif # endif
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
return vibrated_freq; return vibrated_freq;
} }
@ -411,15 +387,14 @@ static void gpt_cb8(GPTDriver *gptp) {
if (playing_note) { if (playing_note) {
if (voices > 0) { if (voices > 0) {
float freq_alt = 0; float freq_alt = 0;
if (voices > 1) { if (voices > 1) {
if (polyphony_rate == 0) { if (polyphony_rate == 0) {
if (glissando) { if (glissando) {
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) { if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) {
frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2); frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2);
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) { } else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) {
frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2); frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2);
} else { } else {
frequency_alt = frequencies[voices - 2]; frequency_alt = frequencies[voices - 2];
} }
@ -427,15 +402,15 @@ static void gpt_cb8(GPTDriver *gptp) {
frequency_alt = frequencies[voices - 2]; frequency_alt = frequencies[voices - 2];
} }
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq_alt = vibrato(frequency_alt); freq_alt = vibrato(frequency_alt);
} else { } else {
freq_alt = frequency_alt; freq_alt = frequency_alt;
} }
#else #else
freq_alt = frequency_alt; freq_alt = frequency_alt;
#endif #endif
} }
if (envelope_index < 65535) { if (envelope_index < 65535) {
@ -453,7 +428,7 @@ static void gpt_cb8(GPTDriver *gptp) {
} else { } else {
RESTART_CHANNEL_2(); RESTART_CHANNEL_2();
} }
//note_timbre; // note_timbre;
} }
if (polyphony_rate > 0) { if (polyphony_rate > 0) {
@ -465,21 +440,21 @@ static void gpt_cb8(GPTDriver *gptp) {
} }
} }
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]); freq = vibrato(frequencies[voice_place]);
} else { } else {
freq = frequencies[voice_place]; freq = frequencies[voice_place];
} }
#else #else
freq = frequencies[voice_place]; freq = frequencies[voice_place];
#endif #endif
} else { } else {
if (glissando) { if (glissando) {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, 440/frequency/12/2); frequency = frequency * pow(2, 440 / frequency / 12 / 2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, -440/frequency/12/2); frequency = frequency * pow(2, -440 / frequency / 12 / 2);
} else { } else {
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
@ -487,15 +462,15 @@ static void gpt_cb8(GPTDriver *gptp) {
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequency); freq = vibrato(frequency);
} else { } else {
freq = frequency; freq = frequency;
} }
#else #else
freq = frequency; freq = frequency;
#endif #endif
} }
if (envelope_index < 65535) { if (envelope_index < 65535) {
@ -508,39 +483,37 @@ static void gpt_cb8(GPTDriver *gptp) {
freq = 30.52; freq = 30.52;
} }
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
UPDATE_CHANNEL_1_FREQ(freq); UPDATE_CHANNEL_1_FREQ(freq);
} else { } else {
RESTART_CHANNEL_1(); RESTART_CHANNEL_1();
} }
//note_timbre; // note_timbre;
} }
} }
if (playing_notes) { if (playing_notes) {
if (note_frequency > 0) { if (note_frequency > 0) {
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(note_frequency); freq = vibrato(note_frequency);
} else { } else {
freq = note_frequency; freq = note_frequency;
} }
#else #else
freq = note_frequency; freq = note_frequency;
#endif #endif
if (envelope_index < 65535) { if (envelope_index < 65535) {
envelope_index++; envelope_index++;
} }
freq = voice_envelope(freq); freq = voice_envelope(freq);
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) { if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
UPDATE_CHANNEL_1_FREQ(freq); UPDATE_CHANNEL_1_FREQ(freq);
UPDATE_CHANNEL_2_FREQ(freq); UPDATE_CHANNEL_2_FREQ(freq);
} }
//note_timbre; // note_timbre;
} else { } else {
// gptStopTimer(&GPTD6); // gptStopTimer(&GPTD6);
// gptStopTimer(&GPTD7); // gptStopTimer(&GPTD7);
@ -550,11 +523,11 @@ static void gpt_cb8(GPTDriver *gptp) {
bool end_of_note = false; bool end_of_note = false;
if (GET_CHANNEL_1_FREQ > 0) { if (GET_CHANNEL_1_FREQ > 0) {
if (!note_resting) if (!note_resting)
end_of_note = (note_position >= (note_length*8 - 1)); end_of_note = (note_position >= (note_length * 8 - 1));
else else
end_of_note = (note_position >= (note_length*8)); end_of_note = (note_position >= (note_length * 8));
} else { } else {
end_of_note = (note_position >= (note_length*8)); end_of_note = (note_position >= (note_length * 8));
} }
if (end_of_note) { if (end_of_note) {
@ -598,7 +571,6 @@ static void gpt_cb8(GPTDriver *gptp) {
} }
void play_note(float freq, int vol) { void play_note(float freq, int vol) {
dprintf("audio play note freq=%d vol=%d", (int)freq, vol); dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
if (!audio_initialized) { if (!audio_initialized) {
@ -606,7 +578,6 @@ void play_note(float freq, int vol) {
} }
if (audio_config.enable && voices < 8) { if (audio_config.enable && voices < 8) {
// Cancel notes if notes are playing // Cancel notes if notes are playing
if (playing_notes) { if (playing_notes) {
stop_all_notes(); stop_all_notes();
@ -627,17 +598,14 @@ void play_note(float freq, int vol) {
RESTART_CHANNEL_1(); RESTART_CHANNEL_1();
RESTART_CHANNEL_2(); RESTART_CHANNEL_2();
} }
} }
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) { void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
if (audio_config.enable) { if (audio_config.enable) {
// Cancel note if a note is playing // Cancel note if a note is playing
if (playing_note) { if (playing_note) {
stop_all_notes(); stop_all_notes();
@ -663,13 +631,9 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
} }
} }
bool is_playing_notes(void) { bool is_playing_notes(void) { return playing_notes; }
return playing_notes;
}
bool is_audio_on(void) { bool is_audio_on(void) { return (audio_config.enable != 0); }
return (audio_config.enable != 0);
}
void audio_toggle(void) { void audio_toggle(void) {
audio_config.enable ^= 1; audio_config.enable ^= 1;
@ -695,73 +659,45 @@ void audio_off(void) {
// Vibrato rate functions // Vibrato rate functions
void set_vibrato_rate(float rate) { void set_vibrato_rate(float rate) { vibrato_rate = rate; }
vibrato_rate = rate;
}
void increase_vibrato_rate(float change) { void increase_vibrato_rate(float change) { vibrato_rate *= change; }
vibrato_rate *= change;
}
void decrease_vibrato_rate(float change) { void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
vibrato_rate /= change;
}
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength) { void set_vibrato_strength(float strength) { vibrato_strength = strength; }
vibrato_strength = strength;
}
void increase_vibrato_strength(float change) { void increase_vibrato_strength(float change) { vibrato_strength *= change; }
vibrato_strength *= change;
}
void decrease_vibrato_strength(float change) { void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
vibrato_strength /= change;
}
#endif /* VIBRATO_STRENGTH_ENABLE */ # endif /* VIBRATO_STRENGTH_ENABLE */
#endif /* VIBRATO_ENABLE */ #endif /* VIBRATO_ENABLE */
// Polyphony functions // Polyphony functions
void set_polyphony_rate(float rate) { void set_polyphony_rate(float rate) { polyphony_rate = rate; }
polyphony_rate = rate;
}
void enable_polyphony() { void enable_polyphony() { polyphony_rate = 5; }
polyphony_rate = 5;
}
void disable_polyphony() { void disable_polyphony() { polyphony_rate = 0; }
polyphony_rate = 0;
}
void increase_polyphony_rate(float change) { void increase_polyphony_rate(float change) { polyphony_rate *= change; }
polyphony_rate *= change;
}
void decrease_polyphony_rate(float change) { void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
polyphony_rate /= change;
}
// Timbre function // Timbre function
void set_timbre(float timbre) { void set_timbre(float timbre) { note_timbre = timbre; }
note_timbre = timbre;
}
// Tempo functions // Tempo functions
void set_tempo(uint8_t tempo) { void set_tempo(uint8_t tempo) { note_tempo = tempo; }
note_tempo = tempo;
}
void decrease_tempo(uint8_t tempo_change) { void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
note_tempo += tempo_change;
}
void increase_tempo(uint8_t tempo_change) { void increase_tempo(uint8_t tempo_change) {
if (note_tempo - tempo_change < 10) { if (note_tempo - tempo_change < 10) {

View file

@ -29,7 +29,6 @@
#define CPU_PRESCALER 8 #define CPU_PRESCALER 8
// Timer Abstractions // Timer Abstractions
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register // TIMSK3 - Timer/Counter #3 Interrupt Mask Register
@ -37,30 +36,27 @@
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) #define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) #define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
// TCCR3A: Timer/Counter #3 Control Register // TCCR3A: Timer/Counter #3 Control Register
// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); #define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); #define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
#define NOTE_PERIOD ICR3 #define NOTE_PERIOD ICR3
#define NOTE_DUTY_CYCLE OCR3A #define NOTE_DUTY_CYCLE OCR3A
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
#include "wave.h" # include "wave.h"
#define SAMPLE_DIVIDER 39 # define SAMPLE_DIVIDER 39
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) # define SAMPLE_RATE (2000000.0 / SAMPLE_DIVIDER / 2048)
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
uint16_t place_int = 0; uint16_t place_int = 0;
bool repeat = true; bool repeat = true;
#endif #endif
void delay_us(int count) { void delay_us(int count) {
while(count--) { while (count--) {
_delay_us(1); _delay_us(1);
} }
} }
@ -77,7 +73,7 @@ bool sliding = false;
float place = 0; float place = 0;
uint8_t * sample; uint8_t* sample;
uint16_t sample_length = 0; uint16_t sample_length = 0;
// float freq = 0; // float freq = 0;
@ -88,7 +84,7 @@ float note_length = 0;
uint8_t note_tempo = TEMPO_DEFAULT; uint8_t note_tempo = TEMPO_DEFAULT;
float note_timbre = TIMBRE_DEFAULT; float note_timbre = TIMBRE_DEFAULT;
uint16_t note_position = 0; uint16_t note_position = 0;
float (* notes_pointer)[][2]; float (*notes_pointer)[][2];
uint16_t notes_count; uint16_t notes_count;
bool notes_repeat; bool notes_repeat;
float notes_rest; float notes_rest;
@ -112,19 +108,18 @@ audio_config_t audio_config;
uint16_t envelope_index = 0; uint16_t envelope_index = 0;
void audio_init() { void audio_init() {
// Check EEPROM // Check EEPROM
if (!eeconfig_is_enabled()) if (!eeconfig_is_enabled()) {
{
eeconfig_init(); eeconfig_init();
} }
audio_config.raw = eeconfig_read_audio(); audio_config.raw = eeconfig_read_audio();
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
PLLFRQ = _BV(PDIV2); PLLFRQ = _BV(PDIV2);
PLLCSR = _BV(PLLE); PLLCSR = _BV(PLLE);
while(!(PLLCSR & _BV(PLOCK))); while (!(PLLCSR & _BV(PLOCK)))
;
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
/* Init a fast PWM on Timer4 */ /* Init a fast PWM on Timer4 */
@ -141,7 +136,7 @@ void audio_init() {
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
#else #else
// Set port PC6 (OC3A and /OC4A) as output // Set port PC6 (OC3A and /OC4A) as output
DDRC |= _BV(PORTC6); DDRC |= _BV(PORTC6);
@ -155,7 +150,7 @@ void audio_init() {
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
#endif #endif
audio_initialized = true; audio_initialized = true;
} }
@ -165,60 +160,57 @@ void stop_all_notes() {
audio_init(); audio_init();
} }
voices = 0; voices = 0;
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#else #else
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
DISABLE_AUDIO_COUNTER_3_OUTPUT; DISABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
playing_notes = false; playing_notes = false;
playing_note = false; playing_note = false;
frequency = 0; frequency = 0;
volume = 0; volume = 0;
for (uint8_t i = 0; i < 8; i++) for (uint8_t i = 0; i < 8; i++) {
{
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
} }
} }
void stop_note(float freq) void stop_note(float freq) {
{
if (playing_note) { if (playing_note) {
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE; freq = freq / SAMPLE_RATE;
#endif #endif
for (int i = 7; i >= 0; i--) { for (int i = 7; i >= 0; i--) {
if (frequencies[i] == freq) { if (frequencies[i] == freq) {
frequencies[i] = 0; frequencies[i] = 0;
volumes[i] = 0; volumes[i] = 0;
for (int j = i; (j < 7); j++) { for (int j = i; (j < 7); j++) {
frequencies[j] = frequencies[j+1]; frequencies[j] = frequencies[j + 1];
frequencies[j+1] = 0; frequencies[j + 1] = 0;
volumes[j] = volumes[j+1]; volumes[j] = volumes[j + 1];
volumes[j+1] = 0; volumes[j + 1] = 0;
} }
break; break;
} }
} }
voices--; voices--;
if (voices < 0) if (voices < 0) voices = 0;
voices = 0;
if (voice_place >= voices) { if (voice_place >= voices) {
voice_place = 0; voice_place = 0;
} }
if (voices == 0) { if (voices == 0) {
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#else #else
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
DISABLE_AUDIO_COUNTER_3_OUTPUT; DISABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
frequency = 0; frequency = 0;
volume = 0; volume = 0;
playing_note = false; playing_note = false;
@ -228,28 +220,26 @@ void stop_note(float freq)
#ifdef VIBRATO_ENABLE #ifdef VIBRATO_ENABLE
float mod(float a, int b) float mod(float a, int b) {
{
float r = fmod(a, b); float r = fmod(a, b);
return r < 0 ? r + b : r; return r < 0 ? r + b : r;
} }
float vibrato(float average_freq) { float vibrato(float average_freq) {
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
#else # else
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
#endif # endif
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
return vibrated_freq; return vibrated_freq;
} }
#endif #endif
ISR(TIMER3_COMPA_vect) ISR(TIMER3_COMPA_vect) {
{
if (playing_note) { if (playing_note) {
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
if (voices == 1) { if (voices == 1) {
// SINE // SINE
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
@ -273,8 +263,7 @@ ISR(TIMER3_COMPA_vect)
place += frequency; place += frequency;
if (place >= SINE_LENGTH) if (place >= SINE_LENGTH) place -= SINE_LENGTH;
place -= SINE_LENGTH;
} else { } else {
int sum = 0; int sum = 0;
@ -291,12 +280,11 @@ ISR(TIMER3_COMPA_vect)
places[i] += frequencies[i]; places[i] += frequencies[i];
if (places[i] >= SINE_LENGTH) if (places[i] >= SINE_LENGTH) places[i] -= SINE_LENGTH;
places[i] -= SINE_LENGTH;
} }
OCR4A = sum; OCR4A = sum;
} }
#else #else
if (voices > 0) { if (voices > 0) {
float freq; float freq;
if (polyphony_rate > 0) { if (polyphony_rate > 0) {
@ -307,32 +295,31 @@ ISR(TIMER3_COMPA_vect)
place = 0.0; place = 0.0;
} }
} }
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequencies[voice_place]); freq = vibrato(frequencies[voice_place]);
} else { } else {
#else # else
{ {
#endif # endif
freq = frequencies[voice_place]; freq = frequencies[voice_place];
} }
} else { } else {
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, 440/frequency/12/2); frequency = frequency * pow(2, 440 / frequency / 12 / 2);
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
frequency = frequency * pow(2, -440/frequency/12/2); frequency = frequency * pow(2, -440 / frequency / 12 / 2);
} else { } else {
frequency = frequencies[voices - 1]; frequency = frequencies[voices - 1];
} }
# ifdef VIBRATO_ENABLE
#ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(frequency); freq = vibrato(frequency);
} else { } else {
#else # else
{ {
#endif # endif
freq = frequency; freq = frequency;
} }
} }
@ -342,12 +329,11 @@ ISR(TIMER3_COMPA_vect)
} }
freq = voice_envelope(freq); freq = voice_envelope(freq);
if (freq < 30.517578125) if (freq < 30.517578125) freq = 30.52;
freq = 30.52;
NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
} }
#endif #endif
} }
// SAMPLE // SAMPLE
@ -361,25 +347,23 @@ ISR(TIMER3_COMPA_vect)
// else // else
// DISABLE_AUDIO_COUNTER_3_ISR; // DISABLE_AUDIO_COUNTER_3_ISR;
if (playing_notes) { if (playing_notes) {
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
place += note_frequency; place += note_frequency;
if (place >= SINE_LENGTH) if (place >= SINE_LENGTH) place -= SINE_LENGTH;
place -= SINE_LENGTH; #else
#else
if (note_frequency > 0) { if (note_frequency > 0) {
float freq; float freq;
#ifdef VIBRATO_ENABLE # ifdef VIBRATO_ENABLE
if (vibrato_strength > 0) { if (vibrato_strength > 0) {
freq = vibrato(note_frequency); freq = vibrato(note_frequency);
} else { } else {
#else # else
{ {
#endif # endif
freq = note_frequency; freq = note_frequency;
} }
@ -394,8 +378,7 @@ ISR(TIMER3_COMPA_vect)
NOTE_PERIOD = 0; NOTE_PERIOD = 0;
NOTE_DUTY_CYCLE = 0; NOTE_DUTY_CYCLE = 0;
} }
#endif #endif
note_position++; note_position++;
bool end_of_note = false; bool end_of_note = false;
@ -409,12 +392,12 @@ ISR(TIMER3_COMPA_vect)
if (notes_repeat) { if (notes_repeat) {
current_note = 0; current_note = 0;
} else { } else {
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
#else #else
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
DISABLE_AUDIO_COUNTER_3_OUTPUT; DISABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
playing_notes = false; playing_notes = false;
return; return;
} }
@ -426,18 +409,17 @@ ISR(TIMER3_COMPA_vect)
current_note--; current_note--;
} else { } else {
note_resting = false; note_resting = false;
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
#else #else
envelope_index = 0; envelope_index = 0;
note_frequency = (*notes_pointer)[current_note][0]; note_frequency = (*notes_pointer)[current_note][0];
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
#endif #endif
} }
note_position = 0; note_position = 0;
} }
} }
if (!audio_config.enable) { if (!audio_config.enable) {
@ -447,7 +429,6 @@ ISR(TIMER3_COMPA_vect)
} }
void play_note(float freq, int vol) { void play_note(float freq, int vol) {
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
@ -456,46 +437,40 @@ void play_note(float freq, int vol) {
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
// Cancel notes if notes are playing // Cancel notes if notes are playing
if (playing_notes) if (playing_notes) stop_all_notes();
stop_all_notes();
playing_note = true; playing_note = true;
envelope_index = 0; envelope_index = 0;
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
freq = freq / SAMPLE_RATE; freq = freq / SAMPLE_RATE;
#endif #endif
if (freq > 0) { if (freq > 0) {
frequencies[voices] = freq; frequencies[voices] = freq;
volumes[voices] = vol; volumes[voices] = vol;
voices++; voices++;
} }
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
#else #else
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
ENABLE_AUDIO_COUNTER_3_OUTPUT; ENABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
} }
} }
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) {
{
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
if (audio_config.enable) { if (audio_config.enable) {
DISABLE_AUDIO_COUNTER_3_ISR; DISABLE_AUDIO_COUNTER_3_ISR;
// Cancel note if a note is playing // Cancel note if a note is playing
if (playing_note) if (playing_note) stop_all_notes();
stop_all_notes();
playing_notes = true; playing_notes = true;
@ -507,28 +482,26 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
place = 0; place = 0;
current_note = 0; current_note = 0;
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
#else #else
note_frequency = (*notes_pointer)[current_note][0]; note_frequency = (*notes_pointer)[current_note][0];
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
#endif #endif
note_position = 0; note_position = 0;
#ifdef PWM_AUDIO
#ifdef PWM_AUDIO
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
#else #else
ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_ISR;
ENABLE_AUDIO_COUNTER_3_OUTPUT; ENABLE_AUDIO_COUNTER_3_OUTPUT;
#endif #endif
} }
} }
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
void play_sample(uint8_t * s, uint16_t l, bool r) { void play_sample(uint8_t* s, uint16_t l, bool r) {
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();
} }
@ -546,7 +519,6 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
} }
#endif #endif
void audio_toggle(void) { void audio_toggle(void) {
audio_config.enable ^= 1; audio_config.enable ^= 1;
eeconfig_update_audio(audio_config.raw); eeconfig_update_audio(audio_config.raw);
@ -566,73 +538,45 @@ void audio_off(void) {
// Vibrato rate functions // Vibrato rate functions
void set_vibrato_rate(float rate) { void set_vibrato_rate(float rate) { vibrato_rate = rate; }
vibrato_rate = rate;
}
void increase_vibrato_rate(float change) { void increase_vibrato_rate(float change) { vibrato_rate *= change; }
vibrato_rate *= change;
}
void decrease_vibrato_rate(float change) { void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
vibrato_rate /= change;
}
#ifdef VIBRATO_STRENGTH_ENABLE # ifdef VIBRATO_STRENGTH_ENABLE
void set_vibrato_strength(float strength) { void set_vibrato_strength(float strength) { vibrato_strength = strength; }
vibrato_strength = strength;
}
void increase_vibrato_strength(float change) { void increase_vibrato_strength(float change) { vibrato_strength *= change; }
vibrato_strength *= change;
}
void decrease_vibrato_strength(float change) { void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
vibrato_strength /= change;
}
#endif /* VIBRATO_STRENGTH_ENABLE */ # endif /* VIBRATO_STRENGTH_ENABLE */
#endif /* VIBRATO_ENABLE */ #endif /* VIBRATO_ENABLE */
// Polyphony functions // Polyphony functions
void set_polyphony_rate(float rate) { void set_polyphony_rate(float rate) { polyphony_rate = rate; }
polyphony_rate = rate;
}
void enable_polyphony() { void enable_polyphony() { polyphony_rate = 5; }
polyphony_rate = 5;
}
void disable_polyphony() { void disable_polyphony() { polyphony_rate = 0; }
polyphony_rate = 0;
}
void increase_polyphony_rate(float change) { void increase_polyphony_rate(float change) { polyphony_rate *= change; }
polyphony_rate *= change;
}
void decrease_polyphony_rate(float change) { void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
polyphony_rate /= change;
}
// Timbre function // Timbre function
void set_timbre(float timbre) { void set_timbre(float timbre) { note_timbre = timbre; }
note_timbre = timbre;
}
// Tempo functions // Tempo functions
void set_tempo(uint8_t tempo) { void set_tempo(uint8_t tempo) { note_tempo = tempo; }
note_tempo = tempo;
}
void decrease_tempo(uint8_t tempo_change) { void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
note_tempo += tempo_change;
}
void increase_tempo(uint8_t tempo_change) { void increase_tempo(uint8_t tempo_change) {
if (note_tempo - tempo_change < 10) { if (note_tempo - tempo_change < 10) {
@ -642,17 +586,10 @@ void increase_tempo(uint8_t tempo_change) {
} }
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Override these functions in your keymap file to play different tunes on // Override these functions in your keymap file to play different tunes on
// startup and bootloader jump // startup and bootloader jump
__attribute__ ((weak)) __attribute__((weak)) void play_startup_tone() {}
void play_startup_tone()
{
}
__attribute__ ((weak)) __attribute__((weak)) void play_goodbye_tone() {}
void play_goodbye_tone()
{
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -16,380 +16,12 @@
#include "luts.h" #include "luts.h"
const float vibrato_lut[VIBRATO_LUT_LENGTH] = const float vibrato_lut[VIBRATO_LUT_LENGTH] = {
{ 1.0022336811487, 1.0042529943610, 1.0058584256028, 1.0068905285205, 1.0072464122237, 1.0068905285205, 1.0058584256028, 1.0042529943610, 1.0022336811487, 1.0000000000000, 0.9977712970630, 0.9957650169978, 0.9941756956510, 0.9931566259436, 0.9928057204913, 0.9931566259436, 0.9941756956510, 0.9957650169978, 0.9977712970630, 1.0000000000000,
1.0022336811487,
1.0042529943610,
1.0058584256028,
1.0068905285205,
1.0072464122237,
1.0068905285205,
1.0058584256028,
1.0042529943610,
1.0022336811487,
1.0000000000000,
0.9977712970630,
0.9957650169978,
0.9941756956510,
0.9931566259436,
0.9928057204913,
0.9931566259436,
0.9941756956510,
0.9957650169978,
0.9977712970630,
1.0000000000000,
}; };
const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = {
{ 0x8E0B, 0x8C02, 0x8A00, 0x8805, 0x8612, 0x8426, 0x8241, 0x8063, 0x7E8C, 0x7CBB, 0x7AF2, 0x792E, 0x7772, 0x75BB, 0x740B, 0x7261, 0x70BD, 0x6F20, 0x6D88, 0x6BF6, 0x6A69, 0x68E3, 0x6762, 0x65E6, 0x6470, 0x6300, 0x6194, 0x602E, 0x5ECD, 0x5D71, 0x5C1A, 0x5AC8, 0x597B, 0x5833, 0x56EF, 0x55B0, 0x5475, 0x533F, 0x520E, 0x50E1, 0x4FB8, 0x4E93, 0x4D73, 0x4C57, 0x4B3E, 0x4A2A, 0x491A, 0x480E, 0x4705, 0x4601, 0x4500, 0x4402, 0x4309, 0x4213, 0x4120, 0x4031, 0x3F46, 0x3E5D, 0x3D79, 0x3C97, 0x3BB9, 0x3ADD, 0x3A05, 0x3930, 0x385E, 0x3790, 0x36C4, 0x35FB, 0x3534, 0x3471, 0x33B1, 0x32F3, 0x3238, 0x3180, 0x30CA, 0x3017, 0x2F66, 0x2EB8, 0x2E0D, 0x2D64, 0x2CBD, 0x2C19, 0x2B77, 0x2AD8, 0x2A3A, 0x299F, 0x2907, 0x2870, 0x27DC, 0x2749, 0x26B9, 0x262B, 0x259F, 0x2515, 0x248D, 0x2407, 0x2382, 0x2300, 0x2280, 0x2201, 0x2184, 0x2109, 0x2090, 0x2018, 0x1FA3, 0x1F2E, 0x1EBC, 0x1E4B, 0x1DDC, 0x1D6E, 0x1D02, 0x1C98, 0x1C2F, 0x1BC8, 0x1B62, 0x1AFD, 0x1A9A,
0x8E0B, 0x1A38, 0x19D8, 0x1979, 0x191C, 0x18C0, 0x1865, 0x180B, 0x17B3, 0x175C, 0x1706, 0x16B2, 0x165E, 0x160C, 0x15BB, 0x156C, 0x151D, 0x14CF, 0x1483, 0x1438, 0x13EE, 0x13A4, 0x135C, 0x1315, 0x12CF, 0x128A, 0x1246, 0x1203, 0x11C1, 0x1180, 0x1140, 0x1100, 0x10C2, 0x1084, 0x1048, 0x100C, 0xFD1, 0xF97, 0xF5E, 0xF25, 0xEEE, 0xEB7, 0xE81, 0xE4C, 0xE17, 0xDE4, 0xDB1, 0xD7E, 0xD4D, 0xD1C, 0xCEC, 0xCBC, 0xC8E, 0xC60, 0xC32, 0xC05, 0xBD9, 0xBAE, 0xB83, 0xB59, 0xB2F, 0xB06, 0xADD, 0xAB6, 0xA8E, 0xA67, 0xA41, 0xA1C, 0x9F7, 0x9D2, 0x9AE, 0x98A, 0x967, 0x945, 0x923, 0x901, 0x8E0, 0x8C0, 0x8A0, 0x880, 0x861, 0x842, 0x824, 0x806, 0x7E8, 0x7CB, 0x7AF, 0x792, 0x777, 0x75B, 0x740, 0x726, 0x70B, 0x6F2, 0x6D8, 0x6BF, 0x6A6, 0x68E, 0x676, 0x65E, 0x647, 0x630, 0x619, 0x602, 0x5EC, 0x5D7, 0x5C1, 0x5AC, 0x597, 0x583, 0x56E, 0x55B, 0x547, 0x533, 0x520, 0x50E, 0x4FB, 0x4E9,
0x8C02, 0x4D7, 0x4C5, 0x4B3, 0x4A2, 0x491, 0x480, 0x470, 0x460, 0x450, 0x440, 0x430, 0x421, 0x412, 0x403, 0x3F4, 0x3E5, 0x3D7, 0x3C9, 0x3BB, 0x3AD, 0x3A0, 0x393, 0x385, 0x379, 0x36C, 0x35F, 0x353, 0x347, 0x33B, 0x32F, 0x323, 0x318, 0x30C, 0x301, 0x2F6, 0x2EB, 0x2E0, 0x2D6, 0x2CB, 0x2C1, 0x2B7, 0x2AD, 0x2A3, 0x299, 0x290, 0x287, 0x27D, 0x274, 0x26B, 0x262, 0x259, 0x251, 0x248, 0x240, 0x238, 0x230, 0x228, 0x220, 0x218, 0x210, 0x209, 0x201, 0x1FA, 0x1F2, 0x1EB, 0x1E4, 0x1DD, 0x1D6, 0x1D0, 0x1C9, 0x1C2, 0x1BC, 0x1B6, 0x1AF, 0x1A9, 0x1A3, 0x19D, 0x197, 0x191, 0x18C, 0x186, 0x180, 0x17B, 0x175, 0x170, 0x16B, 0x165, 0x160, 0x15B, 0x156, 0x151, 0x14C, 0x148, 0x143, 0x13E, 0x13A, 0x135, 0x131, 0x12C, 0x128, 0x124, 0x120, 0x11C, 0x118, 0x114, 0x110, 0x10C, 0x108, 0x104, 0x100, 0xFD, 0xF9, 0xF5, 0xF2, 0xEE,
0x8A00,
0x8805,
0x8612,
0x8426,
0x8241,
0x8063,
0x7E8C,
0x7CBB,
0x7AF2,
0x792E,
0x7772,
0x75BB,
0x740B,
0x7261,
0x70BD,
0x6F20,
0x6D88,
0x6BF6,
0x6A69,
0x68E3,
0x6762,
0x65E6,
0x6470,
0x6300,
0x6194,
0x602E,
0x5ECD,
0x5D71,
0x5C1A,
0x5AC8,
0x597B,
0x5833,
0x56EF,
0x55B0,
0x5475,
0x533F,
0x520E,
0x50E1,
0x4FB8,
0x4E93,
0x4D73,
0x4C57,
0x4B3E,
0x4A2A,
0x491A,
0x480E,
0x4705,
0x4601,
0x4500,
0x4402,
0x4309,
0x4213,
0x4120,
0x4031,
0x3F46,
0x3E5D,
0x3D79,
0x3C97,
0x3BB9,
0x3ADD,
0x3A05,
0x3930,
0x385E,
0x3790,
0x36C4,
0x35FB,
0x3534,
0x3471,
0x33B1,
0x32F3,
0x3238,
0x3180,
0x30CA,
0x3017,
0x2F66,
0x2EB8,
0x2E0D,
0x2D64,
0x2CBD,
0x2C19,
0x2B77,
0x2AD8,
0x2A3A,
0x299F,
0x2907,
0x2870,
0x27DC,
0x2749,
0x26B9,
0x262B,
0x259F,
0x2515,
0x248D,
0x2407,
0x2382,
0x2300,
0x2280,
0x2201,
0x2184,
0x2109,
0x2090,
0x2018,
0x1FA3,
0x1F2E,
0x1EBC,
0x1E4B,
0x1DDC,
0x1D6E,
0x1D02,
0x1C98,
0x1C2F,
0x1BC8,
0x1B62,
0x1AFD,
0x1A9A,
0x1A38,
0x19D8,
0x1979,
0x191C,
0x18C0,
0x1865,
0x180B,
0x17B3,
0x175C,
0x1706,
0x16B2,
0x165E,
0x160C,
0x15BB,
0x156C,
0x151D,
0x14CF,
0x1483,
0x1438,
0x13EE,
0x13A4,
0x135C,
0x1315,
0x12CF,
0x128A,
0x1246,
0x1203,
0x11C1,
0x1180,
0x1140,
0x1100,
0x10C2,
0x1084,
0x1048,
0x100C,
0xFD1,
0xF97,
0xF5E,
0xF25,
0xEEE,
0xEB7,
0xE81,
0xE4C,
0xE17,
0xDE4,
0xDB1,
0xD7E,
0xD4D,
0xD1C,
0xCEC,
0xCBC,
0xC8E,
0xC60,
0xC32,
0xC05,
0xBD9,
0xBAE,
0xB83,
0xB59,
0xB2F,
0xB06,
0xADD,
0xAB6,
0xA8E,
0xA67,
0xA41,
0xA1C,
0x9F7,
0x9D2,
0x9AE,
0x98A,
0x967,
0x945,
0x923,
0x901,
0x8E0,
0x8C0,
0x8A0,
0x880,
0x861,
0x842,
0x824,
0x806,
0x7E8,
0x7CB,
0x7AF,
0x792,
0x777,
0x75B,
0x740,
0x726,
0x70B,
0x6F2,
0x6D8,
0x6BF,
0x6A6,
0x68E,
0x676,
0x65E,
0x647,
0x630,
0x619,
0x602,
0x5EC,
0x5D7,
0x5C1,
0x5AC,
0x597,
0x583,
0x56E,
0x55B,
0x547,
0x533,
0x520,
0x50E,
0x4FB,
0x4E9,
0x4D7,
0x4C5,
0x4B3,
0x4A2,
0x491,
0x480,
0x470,
0x460,
0x450,
0x440,
0x430,
0x421,
0x412,
0x403,
0x3F4,
0x3E5,
0x3D7,
0x3C9,
0x3BB,
0x3AD,
0x3A0,
0x393,
0x385,
0x379,
0x36C,
0x35F,
0x353,
0x347,
0x33B,
0x32F,
0x323,
0x318,
0x30C,
0x301,
0x2F6,
0x2EB,
0x2E0,
0x2D6,
0x2CB,
0x2C1,
0x2B7,
0x2AD,
0x2A3,
0x299,
0x290,
0x287,
0x27D,
0x274,
0x26B,
0x262,
0x259,
0x251,
0x248,
0x240,
0x238,
0x230,
0x228,
0x220,
0x218,
0x210,
0x209,
0x201,
0x1FA,
0x1F2,
0x1EB,
0x1E4,
0x1DD,
0x1D6,
0x1D0,
0x1C9,
0x1C2,
0x1BC,
0x1B6,
0x1AF,
0x1A9,
0x1A3,
0x19D,
0x197,
0x191,
0x18C,
0x186,
0x180,
0x17B,
0x175,
0x170,
0x16B,
0x165,
0x160,
0x15B,
0x156,
0x151,
0x14C,
0x148,
0x143,
0x13E,
0x13A,
0x135,
0x131,
0x12C,
0x128,
0x124,
0x120,
0x11C,
0x118,
0x114,
0x110,
0x10C,
0x108,
0x104,
0x100,
0xFD,
0xF9,
0xF5,
0xF2,
0xEE,
}; };

View file

@ -15,20 +15,20 @@
*/ */
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/io.h> # include <avr/io.h>
#include <avr/interrupt.h> # include <avr/interrupt.h>
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#else #else
#include "ch.h" # include "ch.h"
#include "hal.h" # include "hal.h"
#endif #endif
#ifndef LUTS_H #ifndef LUTS_H
#define LUTS_H # define LUTS_H
#define VIBRATO_LUT_LENGTH 20 # define VIBRATO_LUT_LENGTH 20
#define FREQUENCY_LUT_LENGTH 349 # define FREQUENCY_LUT_LENGTH 349
extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; extern const float vibrato_lut[VIBRATO_LUT_LENGTH];
extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH]; extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH];

View file

@ -1,52 +1,8 @@
#include "muse.h" #include "muse.h"
enum { enum { MUSE_OFF, MUSE_ON, MUSE_C_1_2, MUSE_C1, MUSE_C2, MUSE_C4, MUSE_C8, MUSE_C3, MUSE_C6, MUSE_B1, MUSE_B2, MUSE_B3, MUSE_B4, MUSE_B5, MUSE_B6, MUSE_B7, MUSE_B8, MUSE_B9, MUSE_B10, MUSE_B11, MUSE_B12, MUSE_B13, MUSE_B14, MUSE_B15, MUSE_B16, MUSE_B17, MUSE_B18, MUSE_B19, MUSE_B20, MUSE_B21, MUSE_B22, MUSE_B23, MUSE_B24, MUSE_B25, MUSE_B26, MUSE_B27, MUSE_B28, MUSE_B29, MUSE_B30, MUSE_B31 };
MUSE_OFF,
MUSE_ON,
MUSE_C_1_2,
MUSE_C1,
MUSE_C2,
MUSE_C4,
MUSE_C8,
MUSE_C3,
MUSE_C6,
MUSE_B1,
MUSE_B2,
MUSE_B3,
MUSE_B4,
MUSE_B5,
MUSE_B6,
MUSE_B7,
MUSE_B8,
MUSE_B9,
MUSE_B10,
MUSE_B11,
MUSE_B12,
MUSE_B13,
MUSE_B14,
MUSE_B15,
MUSE_B16,
MUSE_B17,
MUSE_B18,
MUSE_B19,
MUSE_B20,
MUSE_B21,
MUSE_B22,
MUSE_B23,
MUSE_B24,
MUSE_B25,
MUSE_B26,
MUSE_B27,
MUSE_B28,
MUSE_B29,
MUSE_B30,
MUSE_B31
};
bool number_of_ones_to_bool[16] = { bool number_of_ones_to_bool[16] = {1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1};
1, 0, 0, 1, 0, 1, 1, 0,
0, 1, 1, 0, 1, 0, 0, 1
};
uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28}; uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28};
uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17}; uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17};
@ -83,13 +39,7 @@ bool bit_for_value(uint8_t value) {
} }
uint8_t muse_clock_pulse(void) { uint8_t muse_clock_pulse(void) {
bool top = number_of_ones_to_bool[bit_for_value(muse_theme[0]) + (bit_for_value(muse_theme[1]) << 1) + (bit_for_value(muse_theme[2]) << 2) + (bit_for_value(muse_theme[3]) << 3)];
bool top = number_of_ones_to_bool[
bit_for_value(muse_theme[0]) +
(bit_for_value(muse_theme[1]) << 1) +
(bit_for_value(muse_theme[2]) << 2) +
(bit_for_value(muse_theme[3]) << 3)
];
if (muse_timer_1bit == 0) { if (muse_timer_1bit == 0) {
if (muse_timer_2bit_counter == 0) { if (muse_timer_2bit_counter == 0) {
@ -102,10 +52,5 @@ uint8_t muse_clock_pulse(void) {
muse_timer_1bit = (muse_timer_1bit + 1) % 2; muse_timer_1bit = (muse_timer_1bit + 1) % 2;
return return bit_for_value(muse_interval[0]) + (bit_for_value(muse_interval[1]) << 1) + (bit_for_value(muse_interval[2]) << 2) + (bit_for_value(muse_interval[3]) << 3);
bit_for_value(muse_interval[0]) +
(bit_for_value(muse_interval[1]) << 1) +
(bit_for_value(muse_interval[2]) << 2) +
(bit_for_value(muse_interval[3]) << 3);
} }

View file

@ -20,12 +20,12 @@
// Tempo Placeholder // Tempo Placeholder
#define TEMPO_DEFAULT 100 #define TEMPO_DEFAULT 100
#define SONG(notes...) \
#define SONG(notes...) { notes } { notes }
// Note Types // Note Types
#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration} #define MUSICAL_NOTE(note, duration) \
{ (NOTE##note), duration }
#define BREVE_NOTE(note) MUSICAL_NOTE(note, 128) #define BREVE_NOTE(note) MUSICAL_NOTE(note, 128)
#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64) #define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
#define HALF_NOTE(note) MUSICAL_NOTE(note, 32) #define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
@ -33,12 +33,12 @@
#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8) #define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4) #define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
#define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128+64) #define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128 + 64)
#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32) #define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64 + 32)
#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16) #define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32 + 16)
#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8) #define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16 + 8)
#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4) #define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8 + 4)
#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2) #define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4 + 2)
// Note Type Shortcuts // Note Type Shortcuts
#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration) #define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
@ -66,9 +66,9 @@
// Notes - # = Octave // Notes - # = Octave
#ifdef __arm__ #ifdef __arm__
#define NOTE_REST 1.00f # define NOTE_REST 1.00f
#else #else
#define NOTE_REST 0.00f # define NOTE_REST 0.00f
#endif #endif
/* These notes are currently bugged /* These notes are currently bugged
@ -230,5 +230,4 @@
#define NOTE_AF8 NOTE_GS8 #define NOTE_AF8 NOTE_GS8
#define NOTE_BF8 NOTE_AS8 #define NOTE_BF8 NOTE_AS8
#endif #endif

View file

@ -26,25 +26,15 @@
* Author: Friedrich Schiller * Author: Friedrich Schiller
+ License: Public Domain + License: Public Domain
*/ */
#define ODE_TO_JOY \ #define ODE_TO_JOY Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \
Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \
Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
/* Rock-a-bye Baby /* Rock-a-bye Baby
* Author: Unknown * Author: Unknown
+ License: Public Domain + License: Public Domain
*/ */
#define ROCK_A_BYE_BABY \ #define ROCK_A_BYE_BABY QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), H__NOTE(_A5), Q__NOTE(_G5), QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), H__NOTE(_FS5),
QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
H__NOTE(_A5), Q__NOTE(_G5), \
QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
H__NOTE(_FS5),
#define CLUEBOARD_SOUND HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4)
#define CLUEBOARD_SOUND \
HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4)
/* /*
HD_NOTE(_G3), HD_NOTE(_E3), HD_NOTE(_C3), \ HD_NOTE(_G3), HD_NOTE(_E3), HD_NOTE(_C3), \
Q__NOTE(_E3), Q__NOTE(_C3), Q__NOTE(_G3), \ Q__NOTE(_E3), Q__NOTE(_C3), Q__NOTE(_G3), \
@ -56,258 +46,93 @@
Q__NOTE(_F3) Q__NOTE(_F3)
*/ */
#define STARTUP_SOUND \ #define STARTUP_SOUND E__NOTE(_E6), E__NOTE(_A6), ED_NOTE(_E7),
E__NOTE(_E6), \
E__NOTE(_A6), \
ED_NOTE(_E7),
#define GOODBYE_SOUND \ #define GOODBYE_SOUND E__NOTE(_E7), E__NOTE(_A6), ED_NOTE(_E6),
E__NOTE(_E7), \
E__NOTE(_A6), \
ED_NOTE(_E6),
#define PLANCK_SOUND \ #define PLANCK_SOUND ED_NOTE(_E7), E__NOTE(_CS7), E__NOTE(_E6), E__NOTE(_A6), M__NOTE(_CS7, 20),
ED_NOTE(_E7 ), \
E__NOTE(_CS7), \
E__NOTE(_E6 ), \
E__NOTE(_A6 ), \
M__NOTE(_CS7, 20),
#define PREONIC_SOUND \ #define PREONIC_SOUND M__NOTE(_B5, 20), E__NOTE(_B6), M__NOTE(_DS6, 20), E__NOTE(_B6),
M__NOTE(_B5, 20), \
E__NOTE(_B6), \
M__NOTE(_DS6, 20), \
E__NOTE(_B6),
#define QWERTY_SOUND \ #define QWERTY_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), Q__NOTE(_E7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
Q__NOTE(_E7 ),
#define COLEMAK_SOUND \ #define COLEMAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_GS7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ), \
S__NOTE(_REST), \
ED_NOTE(_GS7 ),
#define DVORAK_SOUND \ #define DVORAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_E7), S__NOTE(_REST), E__NOTE(_FS7), S__NOTE(_REST), E__NOTE(_E7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ), \
S__NOTE(_REST), \
E__NOTE(_FS7 ), \
S__NOTE(_REST), \
E__NOTE(_E7 ),
#define WORKMAN_SOUND \ #define WORKMAN_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_FS7), S__NOTE(_REST), ED_NOTE(_A7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_FS7 ), \
S__NOTE(_REST), \
ED_NOTE(_A7 ),
#define PLOVER_SOUND \ #define PLOVER_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_A7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ), \
S__NOTE(_REST), \
ED_NOTE(_A7 ),
#define PLOVER_GOODBYE_SOUND \ #define PLOVER_GOODBYE_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_A7), S__NOTE(_REST), ED_NOTE(_E7),
E__NOTE(_GS6 ), \
E__NOTE(_A6 ), \
S__NOTE(_REST), \
ED_NOTE(_A7 ), \
S__NOTE(_REST), \
ED_NOTE(_E7 ),
#define MUSIC_ON_SOUND \ #define MUSIC_ON_SOUND E__NOTE(_A5), E__NOTE(_B5), E__NOTE(_CS6), E__NOTE(_D6), E__NOTE(_E6), E__NOTE(_FS6), E__NOTE(_GS6), E__NOTE(_A6),
E__NOTE(_A5 ), \
E__NOTE(_B5 ), \
E__NOTE(_CS6), \
E__NOTE(_D6 ), \
E__NOTE(_E6 ), \
E__NOTE(_FS6), \
E__NOTE(_GS6), \
E__NOTE(_A6 ),
#define AUDIO_ON_SOUND \ #define AUDIO_ON_SOUND E__NOTE(_A5), E__NOTE(_A6),
E__NOTE(_A5 ), \
E__NOTE(_A6 ),
#define AUDIO_OFF_SOUND \ #define AUDIO_OFF_SOUND E__NOTE(_A6), E__NOTE(_A5),
E__NOTE(_A6 ), \
E__NOTE(_A5 ),
#define MUSIC_SCALE_SOUND MUSIC_ON_SOUND #define MUSIC_SCALE_SOUND MUSIC_ON_SOUND
#define MUSIC_OFF_SOUND \ #define MUSIC_OFF_SOUND E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_D6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_A5),
E__NOTE(_A6 ), \
E__NOTE(_GS6 ), \
E__NOTE(_FS6), \
E__NOTE(_E6 ), \
E__NOTE(_D6 ), \
E__NOTE(_CS6), \
E__NOTE(_B5), \
E__NOTE(_A5 ),
#define VOICE_CHANGE_SOUND \ #define VOICE_CHANGE_SOUND Q__NOTE(_A5), Q__NOTE(_CS6), Q__NOTE(_E6), Q__NOTE(_A6),
Q__NOTE(_A5 ), \
Q__NOTE(_CS6), \
Q__NOTE(_E6 ), \
Q__NOTE(_A6 ),
#define CHROMATIC_SOUND \ #define CHROMATIC_SOUND Q__NOTE(_A5), Q__NOTE(_AS5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_CS6),
Q__NOTE(_A5 ), \
Q__NOTE(_AS5 ), \
Q__NOTE(_B5), \
Q__NOTE(_C6 ), \
Q__NOTE(_CS6 ),
#define MAJOR_SOUND \ #define MAJOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_CS6), Q__NOTE(_D6), Q__NOTE(_E6),
Q__NOTE(_A5 ), \
Q__NOTE(_B5 ), \
Q__NOTE(_CS6), \
Q__NOTE(_D6 ), \
Q__NOTE(_E6 ),
#define MINOR_SOUND \ #define MINOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_D6), Q__NOTE(_E6),
Q__NOTE(_A5 ), \
Q__NOTE(_B5 ), \
Q__NOTE(_C6 ), \
Q__NOTE(_D6 ), \
Q__NOTE(_E6 ),
#define GUITAR_SOUND \ #define GUITAR_SOUND Q__NOTE(_E5), Q__NOTE(_A5), Q__NOTE(_D6), Q__NOTE(_G6),
Q__NOTE(_E5 ), \
Q__NOTE(_A5), \
Q__NOTE(_D6 ), \
Q__NOTE(_G6 ),
#define VIOLIN_SOUND \ #define VIOLIN_SOUND Q__NOTE(_G5), Q__NOTE(_D6), Q__NOTE(_A6), Q__NOTE(_E7),
Q__NOTE(_G5 ), \
Q__NOTE(_D6), \
Q__NOTE(_A6 ), \
Q__NOTE(_E7 ),
#define CAPS_LOCK_ON_SOUND \ #define CAPS_LOCK_ON_SOUND E__NOTE(_A3), E__NOTE(_B3),
E__NOTE(_A3), \
E__NOTE(_B3),
#define CAPS_LOCK_OFF_SOUND \ #define CAPS_LOCK_OFF_SOUND E__NOTE(_B3), E__NOTE(_A3),
E__NOTE(_B3), \
E__NOTE(_A3),
#define SCROLL_LOCK_ON_SOUND \ #define SCROLL_LOCK_ON_SOUND E__NOTE(_D4), E__NOTE(_E4),
E__NOTE(_D4), \
E__NOTE(_E4),
#define SCROLL_LOCK_OFF_SOUND \ #define SCROLL_LOCK_OFF_SOUND E__NOTE(_E4), E__NOTE(_D4),
E__NOTE(_E4), \
E__NOTE(_D4),
#define NUM_LOCK_ON_SOUND \ #define NUM_LOCK_ON_SOUND E__NOTE(_D5), E__NOTE(_E5),
E__NOTE(_D5), \
E__NOTE(_E5),
#define NUM_LOCK_OFF_SOUND \ #define NUM_LOCK_OFF_SOUND E__NOTE(_E5), E__NOTE(_D5),
E__NOTE(_E5), \
E__NOTE(_D5),
#define AG_NORM_SOUND \ #define AG_NORM_SOUND E__NOTE(_A5), E__NOTE(_A5),
E__NOTE(_A5), \
E__NOTE(_A5),
#define AG_SWAP_SOUND \ #define AG_SWAP_SOUND SD_NOTE(_B5), SD_NOTE(_A5), SD_NOTE(_B5), SD_NOTE(_A5),
SD_NOTE(_B5), \
SD_NOTE(_A5), \
SD_NOTE(_B5), \
SD_NOTE(_A5),
#define UNICODE_WINDOWS \ #define UNICODE_WINDOWS E__NOTE(_B5), S__NOTE(_E6),
E__NOTE(_B5), \
S__NOTE(_E6),
#define UNICODE_LINUX \ #define UNICODE_LINUX E__NOTE(_E6), S__NOTE(_B5),
E__NOTE(_E6), \
S__NOTE(_B5),
#define TERMINAL_SOUND \
E__NOTE(_C5 )
#define TERMINAL_SOUND E__NOTE(_C5)
/* Title: La Campanella /* Title: La Campanella
* Author/Composer: Frank Lizst * Author/Composer: Frank Lizst
+ License: Public Domain + License: Public Domain
*/ */
#define CAMPANELLA \ #define CAMPANELLA \
Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), \ Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), \
E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), \ E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5),
Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), \
E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), \
E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), \
Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), \
E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), \
E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), \
Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), \
E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), \
E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), \
Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), \
E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), \
E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), \
Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), \
E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5),
/* Title: Fantaisie-Impromptu /* Title: Fantaisie-Impromptu
* Author/Composer: Chopin * Author/Composer: Chopin
* License: Public Domain * License: Public Domain
*/ */
#define FANTASIE_IMPROMPTU \ #define FANTASIE_IMPROMPTU \
E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), \ E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), \
E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), \ E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5),
E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), \
E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), \
E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), \
E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), \
E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), \
E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), \
E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), \
E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), \
E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), \
E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), \
E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), \
E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5),
/* Title: Nocturne Op. 9 No. 1 in B flat minor /* Title: Nocturne Op. 9 No. 1 in B flat minor
* Author/Composer: Chopin * Author/Composer: Chopin
License: Public Domain License: Public Domain
*/ */
#define NOCTURNE_OP_9_NO_1 \ #define NOCTURNE_OP_9_NO_1 \
H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), \ H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), \
W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), \ W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_EF5), BD_NOTE(_F5),
Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), \
Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), \
Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), \
Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), \
B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), \
H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), \
H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), \
H__NOTE(_EF5), BD_NOTE(_F5),
/* Removed sounds /* Removed sounds
+ This list is here solely for compatibility, so that removed songs don't just break things + This list is here solely for compatibility, so that removed songs don't just break things

View file

@ -25,22 +25,15 @@ extern bool glissando;
voice_type voice = default_voice; voice_type voice = default_voice;
void set_voice(voice_type v) { void set_voice(voice_type v) { voice = v; }
voice = v;
}
void voice_iterate() { void voice_iterate() { voice = (voice + 1) % number_of_voices; }
voice = (voice + 1) % number_of_voices;
}
void voice_deiterate() { void voice_deiterate() { voice = (voice - 1 + number_of_voices) % number_of_voices; }
voice = (voice - 1 + number_of_voices) % number_of_voices;
}
float voice_envelope(float frequency) { float voice_envelope(float frequency) {
// envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
__attribute__ ((unused)) __attribute__((unused)) uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
switch (voice) { switch (voice) {
case default_voice: case default_voice:
@ -49,7 +42,7 @@ float voice_envelope(float frequency) {
polyphony_rate = 0; polyphony_rate = 0;
break; break;
#ifdef AUDIO_VOICES #ifdef AUDIO_VOICES
case something: case something:
glissando = false; glissando = false;
@ -90,9 +83,7 @@ float voice_envelope(float frequency) {
// frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8); // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
if (frequency < 80.0) { if (frequency < 80.0) {
} else if (frequency < 160.0) { } else if (frequency < 160.0) {
// Bass drum: 60 - 100 Hz // Bass drum: 60 - 100 Hz
frequency = (rand() % (int)(40)) + 60; frequency = (rand() % (int)(40)) + 60;
switch (envelope_index) { switch (envelope_index) {
@ -108,8 +99,6 @@ float voice_envelope(float frequency) {
} }
} else if (frequency < 320.0) { } else if (frequency < 320.0) {
// Snare drum: 1 - 2 KHz // Snare drum: 1 - 2 KHz
frequency = (rand() % (int)(1000)) + 1000; frequency = (rand() % (int)(1000)) + 1000;
switch (envelope_index) { switch (envelope_index) {
@ -125,7 +114,6 @@ float voice_envelope(float frequency) {
} }
} else if (frequency < 640.0) { } else if (frequency < 640.0) {
// Closed Hi-hat: 3 - 5 KHz // Closed Hi-hat: 3 - 5 KHz
frequency = (rand() % (int)(2000)) + 3000; frequency = (rand() % (int)(2000)) + 3000;
switch (envelope_index) { switch (envelope_index) {
@ -141,7 +129,6 @@ float voice_envelope(float frequency) {
} }
} else if (frequency < 1280.0) { } else if (frequency < 1280.0) {
// Open Hi-hat: 3 - 5 KHz // Open Hi-hat: 3 - 5 KHz
frequency = (rand() % (int)(2000)) + 3000; frequency = (rand() % (int)(2000)) + 3000;
switch (envelope_index) { switch (envelope_index) {
@ -155,7 +142,6 @@ float voice_envelope(float frequency) {
note_timbre = 0; note_timbre = 0;
break; break;
} }
} }
break; break;
case butts_fader: case butts_fader:
@ -173,7 +159,7 @@ float voice_envelope(float frequency) {
break; break;
case 20 ... 200: case 20 ... 200:
note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125; note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2) * .125;
break; break;
default: default:
@ -211,12 +197,12 @@ float voice_envelope(float frequency) {
polyphony_rate = 0; polyphony_rate = 0;
switch (compensated_index) { switch (compensated_index) {
default: default:
#define OCS_SPEED 10 # define OCS_SPEED 10
#define OCS_AMP .25 # define OCS_AMP .25
// sine wave is slow // sine wave is slow
// note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5; // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
// triangle wave is a bit faster // triangle wave is a bit faster
note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2; note_timbre = (float)abs((compensated_index * OCS_SPEED % 3000) - 1500) * (OCS_AMP / 1500) + (1 - OCS_AMP) / 2;
break; break;
} }
break; break;
@ -225,22 +211,20 @@ float voice_envelope(float frequency) {
glissando = true; glissando = true;
polyphony_rate = 0; polyphony_rate = 0;
note_timbre = (envelope_index % 2) * .125 + .375 * 2; note_timbre = (envelope_index % 2) * .125 + .375 * 2;
if ((envelope_index % 4) == 0) if ((envelope_index % 4) == 0) note_timbre = 0.5;
note_timbre = 0.5; if ((envelope_index % 8) == 0) note_timbre = 0;
if ((envelope_index % 8) == 0)
note_timbre = 0;
break; break;
case delayed_vibrato: case delayed_vibrato:
glissando = true; glissando = true;
polyphony_rate = 0; polyphony_rate = 0;
note_timbre = TIMBRE_50; note_timbre = TIMBRE_50;
#define VOICE_VIBRATO_DELAY 150 # define VOICE_VIBRATO_DELAY 150
#define VOICE_VIBRATO_SPEED 50 # define VOICE_VIBRATO_SPEED 50
switch (compensated_index) { switch (compensated_index) {
case 0 ... VOICE_VIBRATO_DELAY: case 0 ... VOICE_VIBRATO_DELAY:
break; break;
default: default:
frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1)) / 1000 * VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
break; break;
} }
break; break;
@ -286,7 +270,7 @@ float voice_envelope(float frequency) {
// note_timbre = 0.25; // note_timbre = 0.25;
// break; // break;
#endif #endif
default: default:
break; break;

View file

@ -16,19 +16,19 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/io.h> # include <avr/io.h>
#endif #endif
#include "wait.h" #include "wait.h"
#include "luts.h" #include "luts.h"
#ifndef VOICES_H #ifndef VOICES_H
#define VOICES_H # define VOICES_H
float voice_envelope(float frequency); float voice_envelope(float frequency);
typedef enum { typedef enum {
default_voice, default_voice,
#ifdef AUDIO_VOICES # ifdef AUDIO_VOICES
something, something,
drums, drums,
butts_fader, butts_fader,
@ -36,12 +36,12 @@ typedef enum {
duty_osc, duty_osc,
duty_octave_down, duty_octave_down,
delayed_vibrato, delayed_vibrato,
// delayed_vibrato_octave, // delayed_vibrato_octave,
// duty_fifth_down, // duty_fifth_down,
// duty_fourth_down, // duty_fourth_down,
// duty_third_down, // duty_third_down,
// duty_fifth_third_down, // duty_fifth_third_down,
#endif # endif
number_of_voices // important that this is last number_of_voices // important that this is last
} voice_type; } voice_type;

View file

@ -20,262 +20,17 @@
#define SINE_LENGTH 2048 #define SINE_LENGTH 2048
const uint8_t sinewave[] PROGMEM= //2048 values const uint8_t sinewave[] PROGMEM = // 2048 values
{ {0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x93, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x98, 0x98, 0x98, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xbb,
0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xcf, 0xcf, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8,
0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7,
0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4,
0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9d,
0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, 0x9d, 0x9d, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x94, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x85, 0x85, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, 0x76, 0x75, 0x75, 0x75, 0x74, 0x74, 0x73, 0x73, 0x73, 0x72, 0x72, 0x71, 0x71, 0x71, 0x70, 0x70, 0x70, 0x6f, 0x6f, 0x6e, 0x6e, 0x6e, 0x6d, 0x6d, 0x6c, 0x6c, 0x6c, 0x6b, 0x6b, 0x6a, 0x6a, 0x6a, 0x69, 0x69, 0x69, 0x68, 0x68, 0x67, 0x67, 0x67, 0x66, 0x66, 0x65, 0x65, 0x65, 0x64, 0x64, 0x64, 0x63, 0x63, 0x62, 0x62, 0x62, 0x61, 0x61, 0x61, 0x60,
0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, 0x60, 0x5f, 0x5f, 0x5f, 0x5e, 0x5e, 0x5d, 0x5d, 0x5d, 0x5c, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 0x5a, 0x5a, 0x59, 0x59, 0x59, 0x58, 0x58, 0x58, 0x57, 0x57, 0x56, 0x56, 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, 0x53, 0x52, 0x52, 0x52, 0x51, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, 0x2b, 0x2b, 0x2b, 0x2a, 0x2a,
0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, 0x2a, 0x2a, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x26, 0x25, 0x25, 0x25, 0x25, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0xe, 0xe, 0xe, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8,
0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, 0x8, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17,
0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46,
0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f};
0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7,
0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa,
0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad,
0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0,
0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3,
0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6,
0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8,
0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb,
0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,
0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1,
0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,
0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,
0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9,
0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb,
0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,
0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0,
0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2,
0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5,
0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,
0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,
0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,
0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde,
0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0,
0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,
0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,
0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6,
0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8,
0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,
0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,
0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed,
0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,
0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,
0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,
0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,
0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,
0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,
0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,
0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,
0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,
0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,
0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,
0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,
0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,
0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,
0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,
0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,
0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,
0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb,
0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,
0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,
0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,
0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,
0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2,
0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0,
0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde,
0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,
0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda,
0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,
0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5,
0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3,
0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1,
0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce,
0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc,
0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9,
0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7,
0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4,
0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1,
0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf,
0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc,
0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9,
0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6,
0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4,
0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,
0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae,
0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab,
0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8,
0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5,
0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2,
0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f,
0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,
0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,
0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96,
0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93,
0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f,
0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c,
0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89,
0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86,
0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83,
0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80,
0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d,
0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a,
0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77,
0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73,
0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70,
0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d,
0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a,
0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67,
0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64,
0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61,
0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e,
0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b,
0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58,
0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55,
0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52,
0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f,
0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c,
0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49,
0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47,
0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44,
0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41,
0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e,
0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c,
0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39,
0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36,
0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34,
0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31,
0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f,
0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,
0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a,
0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28,
0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26,
0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23,
0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21,
0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f,
0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d,
0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19,
0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17,
0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,
0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14,
0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12,
0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,
0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf,
0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe,
0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc,
0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb,
0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa,
0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9,
0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4,
0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3,
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1,
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4,
0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5,
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,
0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb,
0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc,
0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd,
0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf,
0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10,
0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,
0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14,
0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,
0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17,
0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19,
0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d,
0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f,
0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21,
0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23,
0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,
0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27,
0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,
0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,
0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,
0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31,
0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,
0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36,
0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,
0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,
0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,
0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,
0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49,
0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,
0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,
0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51,
0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,
0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,
0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a,
0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,
0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,
0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,
0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,
0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69,
0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c,
0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70,
0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73,
0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76,
0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79,
0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c,
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f
};

View file

@ -14,21 +14,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "color.h" #include "color.h"
#include "led_tables.h" #include "led_tables.h"
#include "progmem.h" #include "progmem.h"
RGB hsv_to_rgb( HSV hsv ) RGB hsv_to_rgb(HSV hsv) {
{
RGB rgb; RGB rgb;
uint8_t region, remainder, p, q, t; uint8_t region, remainder, p, q, t;
uint16_t h, s, v; uint16_t h, s, v;
if ( hsv.s == 0 ) if (hsv.s == 0) {
{
#ifdef USE_CIE1931_CURVE #ifdef USE_CIE1931_CURVE
rgb.r = rgb.g = rgb.b = pgm_read_byte( &CIE1931_CURVE[hsv.v] ); rgb.r = rgb.g = rgb.b = pgm_read_byte(&CIE1931_CURVE[hsv.v]);
#else #else
rgb.r = hsv.v; rgb.r = hsv.v;
rgb.g = hsv.v; rgb.g = hsv.v;
@ -48,8 +45,7 @@ RGB hsv_to_rgb( HSV hsv )
q = (v * (255 - ((s * remainder) >> 8))) >> 8; q = (v * (255 - ((s * remainder) >> 8))) >> 8;
t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
switch ( region ) switch (region) {
{
case 6: case 6:
case 0: case 0:
rgb.r = v; rgb.r = v;
@ -84,11 +80,10 @@ RGB hsv_to_rgb( HSV hsv )
} }
#ifdef USE_CIE1931_CURVE #ifdef USE_CIE1931_CURVE
rgb.r = pgm_read_byte( &CIE1931_CURVE[rgb.r] ); rgb.r = pgm_read_byte(&CIE1931_CURVE[rgb.r]);
rgb.g = pgm_read_byte( &CIE1931_CURVE[rgb.g] ); rgb.g = pgm_read_byte(&CIE1931_CURVE[rgb.g]);
rgb.b = pgm_read_byte( &CIE1931_CURVE[rgb.b] ); rgb.b = pgm_read_byte(&CIE1931_CURVE[rgb.b]);
#endif #endif
return rgb; return rgb;
} }

View file

@ -14,33 +14,30 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef COLOR_H #ifndef COLOR_H
#define COLOR_H #define COLOR_H
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#if defined(__GNUC__) #if defined(__GNUC__)
#define PACKED __attribute__ ((__packed__)) # define PACKED __attribute__((__packed__))
#else #else
#define PACKED # define PACKED
#endif #endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma pack( push, 1 ) # pragma pack(push, 1)
#endif #endif
#ifdef RGBW #ifdef RGBW
#define LED_TYPE cRGBW # define LED_TYPE cRGBW
#else #else
#define LED_TYPE RGB # define LED_TYPE RGB
#endif #endif
// WS2812 specific layout // WS2812 specific layout
typedef struct PACKED typedef struct PACKED {
{
uint8_t g; uint8_t g;
uint8_t r; uint8_t r;
uint8_t b; uint8_t b;
@ -49,23 +46,21 @@ typedef struct PACKED
typedef cRGB RGB; typedef cRGB RGB;
// WS2812 specific layout // WS2812 specific layout
typedef struct PACKED typedef struct PACKED {
{
uint8_t g; uint8_t g;
uint8_t r; uint8_t r;
uint8_t b; uint8_t b;
uint8_t w; uint8_t w;
} cRGBW; } cRGBW;
typedef struct PACKED typedef struct PACKED {
{
uint8_t h; uint8_t h;
uint8_t s; uint8_t s;
uint8_t v; uint8_t v;
} HSV; } HSV;
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma pack( pop ) # pragma pack(pop)
#endif #endif
RGB hsv_to_rgb(HSV hsv); RGB hsv_to_rgb(HSV hsv);

View file

@ -25,262 +25,262 @@
#define NO_PIN (~0) #define NO_PIN (~0)
#ifdef __AVR__ #ifdef __AVR__
#ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
#include <avr/io.h> # include <avr/io.h>
#endif # endif
#define PORT_SHIFTER 4 // this may be 4 for all AVR chips # define PORT_SHIFTER 4 // this may be 4 for all AVR chips
// If you want to add more to this list, reference the PINx definitions in these header // If you want to add more to this list, reference the PINx definitions in these header
// files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr // files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) # if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)
#define ADDRESS_BASE 0x00 # define ADDRESS_BASE 0x00
#define PINB_ADDRESS 0x3 # define PINB_ADDRESS 0x3
#define PINC_ADDRESS 0x6 # define PINC_ADDRESS 0x6
#define PIND_ADDRESS 0x9 # define PIND_ADDRESS 0x9
#define PINE_ADDRESS 0xC # define PINE_ADDRESS 0xC
#define PINF_ADDRESS 0xF # define PINF_ADDRESS 0xF
#elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) # elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__)
#define ADDRESS_BASE 0x00 # define ADDRESS_BASE 0x00
#define PINB_ADDRESS 0x3 # define PINB_ADDRESS 0x3
#define PINC_ADDRESS 0x6 # define PINC_ADDRESS 0x6
#define PIND_ADDRESS 0x9 # define PIND_ADDRESS 0x9
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) # elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)
#define ADDRESS_BASE 0x00 # define ADDRESS_BASE 0x00
#define PINA_ADDRESS 0x0 # define PINA_ADDRESS 0x0
#define PINB_ADDRESS 0x3 # define PINB_ADDRESS 0x3
#define PINC_ADDRESS 0x6 # define PINC_ADDRESS 0x6
#define PIND_ADDRESS 0x9 # define PIND_ADDRESS 0x9
#define PINE_ADDRESS 0xC # define PINE_ADDRESS 0xC
#define PINF_ADDRESS 0xF # define PINF_ADDRESS 0xF
#elif defined(__AVR_ATmega32A__) # elif defined(__AVR_ATmega32A__)
#define ADDRESS_BASE 0x10 # define ADDRESS_BASE 0x10
#define PIND_ADDRESS 0x0 # define PIND_ADDRESS 0x0
#define PINC_ADDRESS 0x3 # define PINC_ADDRESS 0x3
#define PINB_ADDRESS 0x6 # define PINB_ADDRESS 0x6
#define PINA_ADDRESS 0x9 # define PINA_ADDRESS 0x9
#elif defined(__AVR_ATmega328P__) # elif defined(__AVR_ATmega328P__)
#define ADDRESS_BASE 0x00 # define ADDRESS_BASE 0x00
#define PINB_ADDRESS 0x3 # define PINB_ADDRESS 0x3
#define PINC_ADDRESS 0x6 # define PINC_ADDRESS 0x6
#define PIND_ADDRESS 0x9 # define PIND_ADDRESS 0x9
#else # else
#error "Pins are not defined" # error "Pins are not defined"
#endif # endif
/* I/O pins */ /* I/O pins */
#define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin) # define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin)
#ifdef PORTA # ifdef PORTA
#define A0 PINDEF(A, 0) # define A0 PINDEF(A, 0)
#define A1 PINDEF(A, 1) # define A1 PINDEF(A, 1)
#define A2 PINDEF(A, 2) # define A2 PINDEF(A, 2)
#define A3 PINDEF(A, 3) # define A3 PINDEF(A, 3)
#define A4 PINDEF(A, 4) # define A4 PINDEF(A, 4)
#define A5 PINDEF(A, 5) # define A5 PINDEF(A, 5)
#define A6 PINDEF(A, 6) # define A6 PINDEF(A, 6)
#define A7 PINDEF(A, 7) # define A7 PINDEF(A, 7)
#endif # endif
#ifdef PORTB # ifdef PORTB
#define B0 PINDEF(B, 0) # define B0 PINDEF(B, 0)
#define B1 PINDEF(B, 1) # define B1 PINDEF(B, 1)
#define B2 PINDEF(B, 2) # define B2 PINDEF(B, 2)
#define B3 PINDEF(B, 3) # define B3 PINDEF(B, 3)
#define B4 PINDEF(B, 4) # define B4 PINDEF(B, 4)
#define B5 PINDEF(B, 5) # define B5 PINDEF(B, 5)
#define B6 PINDEF(B, 6) # define B6 PINDEF(B, 6)
#define B7 PINDEF(B, 7) # define B7 PINDEF(B, 7)
#endif # endif
#ifdef PORTC # ifdef PORTC
#define C0 PINDEF(C, 0) # define C0 PINDEF(C, 0)
#define C1 PINDEF(C, 1) # define C1 PINDEF(C, 1)
#define C2 PINDEF(C, 2) # define C2 PINDEF(C, 2)
#define C3 PINDEF(C, 3) # define C3 PINDEF(C, 3)
#define C4 PINDEF(C, 4) # define C4 PINDEF(C, 4)
#define C5 PINDEF(C, 5) # define C5 PINDEF(C, 5)
#define C6 PINDEF(C, 6) # define C6 PINDEF(C, 6)
#define C7 PINDEF(C, 7) # define C7 PINDEF(C, 7)
#endif # endif
#ifdef PORTD # ifdef PORTD
#define D0 PINDEF(D, 0) # define D0 PINDEF(D, 0)
#define D1 PINDEF(D, 1) # define D1 PINDEF(D, 1)
#define D2 PINDEF(D, 2) # define D2 PINDEF(D, 2)
#define D3 PINDEF(D, 3) # define D3 PINDEF(D, 3)
#define D4 PINDEF(D, 4) # define D4 PINDEF(D, 4)
#define D5 PINDEF(D, 5) # define D5 PINDEF(D, 5)
#define D6 PINDEF(D, 6) # define D6 PINDEF(D, 6)
#define D7 PINDEF(D, 7) # define D7 PINDEF(D, 7)
#endif # endif
#ifdef PORTE # ifdef PORTE
#define E0 PINDEF(E, 0) # define E0 PINDEF(E, 0)
#define E1 PINDEF(E, 1) # define E1 PINDEF(E, 1)
#define E2 PINDEF(E, 2) # define E2 PINDEF(E, 2)
#define E3 PINDEF(E, 3) # define E3 PINDEF(E, 3)
#define E4 PINDEF(E, 4) # define E4 PINDEF(E, 4)
#define E5 PINDEF(E, 5) # define E5 PINDEF(E, 5)
#define E6 PINDEF(E, 6) # define E6 PINDEF(E, 6)
#define E7 PINDEF(E, 7) # define E7 PINDEF(E, 7)
#endif # endif
#ifdef PORTF # ifdef PORTF
#define F0 PINDEF(F, 0) # define F0 PINDEF(F, 0)
#define F1 PINDEF(F, 1) # define F1 PINDEF(F, 1)
#define F2 PINDEF(F, 2) # define F2 PINDEF(F, 2)
#define F3 PINDEF(F, 3) # define F3 PINDEF(F, 3)
#define F4 PINDEF(F, 4) # define F4 PINDEF(F, 4)
#define F5 PINDEF(F, 5) # define F5 PINDEF(F, 5)
#define F6 PINDEF(F, 6) # define F6 PINDEF(F, 6)
#define F7 PINDEF(F, 7) # define F7 PINDEF(F, 7)
#endif # endif
#ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
#define _PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset) # define _PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset)
// Port X Input Pins Address // Port X Input Pins Address
#define PINx_ADDRESS(p) _PIN_ADDRESS(p, 0) # define PINx_ADDRESS(p) _PIN_ADDRESS(p, 0)
// Port X Data Direction Register, 0:input 1:output // Port X Data Direction Register, 0:input 1:output
#define DDRx_ADDRESS(p) _PIN_ADDRESS(p, 1) # define DDRx_ADDRESS(p) _PIN_ADDRESS(p, 1)
// Port X Data Register // Port X Data Register
#define PORTx_ADDRESS(p) _PIN_ADDRESS(p, 2) # define PORTx_ADDRESS(p) _PIN_ADDRESS(p, 2)
#endif # endif
#elif defined(PROTOCOL_CHIBIOS) #elif defined(PROTOCOL_CHIBIOS)
// Defines mapping for Proton C replacement // Defines mapping for Proton C replacement
#ifdef CONVERT_TO_PROTON_C # ifdef CONVERT_TO_PROTON_C
// Left side (front) // Left side (front)
#define D3 PAL_LINE(GPIOA, 9) # define D3 PAL_LINE(GPIOA, 9)
#define D2 PAL_LINE(GPIOA, 10) # define D2 PAL_LINE(GPIOA, 10)
// GND // GND
// GND // GND
#define D1 PAL_LINE(GPIOB, 7) # define D1 PAL_LINE(GPIOB, 7)
#define D0 PAL_LINE(GPIOB, 6) # define D0 PAL_LINE(GPIOB, 6)
#define D4 PAL_LINE(GPIOB, 5) # define D4 PAL_LINE(GPIOB, 5)
#define C6 PAL_LINE(GPIOB, 4) # define C6 PAL_LINE(GPIOB, 4)
#define D7 PAL_LINE(GPIOB, 3) # define D7 PAL_LINE(GPIOB, 3)
#define E6 PAL_LINE(GPIOB, 2) # define E6 PAL_LINE(GPIOB, 2)
#define B4 PAL_LINE(GPIOB, 1) # define B4 PAL_LINE(GPIOB, 1)
#define B5 PAL_LINE(GPIOB, 0) # define B5 PAL_LINE(GPIOB, 0)
// Right side (front) // Right side (front)
// RAW // RAW
// GND // GND
// RESET // RESET
// VCC // VCC
#define F4 PAL_LINE(GPIOA, 2) # define F4 PAL_LINE(GPIOA, 2)
#define F5 PAL_LINE(GPIOA, 1) # define F5 PAL_LINE(GPIOA, 1)
#define F6 PAL_LINE(GPIOA, 0) # define F6 PAL_LINE(GPIOA, 0)
#define F7 PAL_LINE(GPIOB, 8) # define F7 PAL_LINE(GPIOB, 8)
#define B1 PAL_LINE(GPIOB, 13) # define B1 PAL_LINE(GPIOB, 13)
#define B3 PAL_LINE(GPIOB, 14) # define B3 PAL_LINE(GPIOB, 14)
#define B2 PAL_LINE(GPIOB, 15) # define B2 PAL_LINE(GPIOB, 15)
#define B6 PAL_LINE(GPIOB, 9) # define B6 PAL_LINE(GPIOB, 9)
// LEDs (only D5/C13 uses an actual LED) // LEDs (only D5/C13 uses an actual LED)
#ifdef CONVERT_TO_PROTON_C_RXLED # ifdef CONVERT_TO_PROTON_C_RXLED
#define D5 PAL_LINE(GPIOC, 13) # define D5 PAL_LINE(GPIOC, 13)
#define B0 PAL_LINE(GPIOC, 13) # define B0 PAL_LINE(GPIOC, 13)
#else # else
#define D5 PAL_LINE(GPIOC, 13) # define D5 PAL_LINE(GPIOC, 13)
#define B0 PAL_LINE(GPIOC, 14) # define B0 PAL_LINE(GPIOC, 14)
#endif # endif
#else # else
#define A0 PAL_LINE(GPIOA, 0) # define A0 PAL_LINE(GPIOA, 0)
#define A1 PAL_LINE(GPIOA, 1) # define A1 PAL_LINE(GPIOA, 1)
#define A2 PAL_LINE(GPIOA, 2) # define A2 PAL_LINE(GPIOA, 2)
#define A3 PAL_LINE(GPIOA, 3) # define A3 PAL_LINE(GPIOA, 3)
#define A4 PAL_LINE(GPIOA, 4) # define A4 PAL_LINE(GPIOA, 4)
#define A5 PAL_LINE(GPIOA, 5) # define A5 PAL_LINE(GPIOA, 5)
#define A6 PAL_LINE(GPIOA, 6) # define A6 PAL_LINE(GPIOA, 6)
#define A7 PAL_LINE(GPIOA, 7) # define A7 PAL_LINE(GPIOA, 7)
#define A8 PAL_LINE(GPIOA, 8) # define A8 PAL_LINE(GPIOA, 8)
#define A9 PAL_LINE(GPIOA, 9) # define A9 PAL_LINE(GPIOA, 9)
#define A10 PAL_LINE(GPIOA, 10) # define A10 PAL_LINE(GPIOA, 10)
#define A11 PAL_LINE(GPIOA, 11) # define A11 PAL_LINE(GPIOA, 11)
#define A12 PAL_LINE(GPIOA, 12) # define A12 PAL_LINE(GPIOA, 12)
#define A13 PAL_LINE(GPIOA, 13) # define A13 PAL_LINE(GPIOA, 13)
#define A14 PAL_LINE(GPIOA, 14) # define A14 PAL_LINE(GPIOA, 14)
#define A15 PAL_LINE(GPIOA, 15) # define A15 PAL_LINE(GPIOA, 15)
#define B0 PAL_LINE(GPIOB, 0) # define B0 PAL_LINE(GPIOB, 0)
#define B1 PAL_LINE(GPIOB, 1) # define B1 PAL_LINE(GPIOB, 1)
#define B2 PAL_LINE(GPIOB, 2) # define B2 PAL_LINE(GPIOB, 2)
#define B3 PAL_LINE(GPIOB, 3) # define B3 PAL_LINE(GPIOB, 3)
#define B4 PAL_LINE(GPIOB, 4) # define B4 PAL_LINE(GPIOB, 4)
#define B5 PAL_LINE(GPIOB, 5) # define B5 PAL_LINE(GPIOB, 5)
#define B6 PAL_LINE(GPIOB, 6) # define B6 PAL_LINE(GPIOB, 6)
#define B7 PAL_LINE(GPIOB, 7) # define B7 PAL_LINE(GPIOB, 7)
#define B8 PAL_LINE(GPIOB, 8) # define B8 PAL_LINE(GPIOB, 8)
#define B9 PAL_LINE(GPIOB, 9) # define B9 PAL_LINE(GPIOB, 9)
#define B10 PAL_LINE(GPIOB, 10) # define B10 PAL_LINE(GPIOB, 10)
#define B11 PAL_LINE(GPIOB, 11) # define B11 PAL_LINE(GPIOB, 11)
#define B12 PAL_LINE(GPIOB, 12) # define B12 PAL_LINE(GPIOB, 12)
#define B13 PAL_LINE(GPIOB, 13) # define B13 PAL_LINE(GPIOB, 13)
#define B14 PAL_LINE(GPIOB, 14) # define B14 PAL_LINE(GPIOB, 14)
#define B15 PAL_LINE(GPIOB, 15) # define B15 PAL_LINE(GPIOB, 15)
#define B16 PAL_LINE(GPIOB, 16) # define B16 PAL_LINE(GPIOB, 16)
#define B17 PAL_LINE(GPIOB, 17) # define B17 PAL_LINE(GPIOB, 17)
#define C0 PAL_LINE(GPIOC, 0) # define C0 PAL_LINE(GPIOC, 0)
#define C1 PAL_LINE(GPIOC, 1) # define C1 PAL_LINE(GPIOC, 1)
#define C2 PAL_LINE(GPIOC, 2) # define C2 PAL_LINE(GPIOC, 2)
#define C3 PAL_LINE(GPIOC, 3) # define C3 PAL_LINE(GPIOC, 3)
#define C4 PAL_LINE(GPIOC, 4) # define C4 PAL_LINE(GPIOC, 4)
#define C5 PAL_LINE(GPIOC, 5) # define C5 PAL_LINE(GPIOC, 5)
#define C6 PAL_LINE(GPIOC, 6) # define C6 PAL_LINE(GPIOC, 6)
#define C7 PAL_LINE(GPIOC, 7) # define C7 PAL_LINE(GPIOC, 7)
#define C8 PAL_LINE(GPIOC, 8) # define C8 PAL_LINE(GPIOC, 8)
#define C9 PAL_LINE(GPIOC, 9) # define C9 PAL_LINE(GPIOC, 9)
#define C10 PAL_LINE(GPIOC, 10) # define C10 PAL_LINE(GPIOC, 10)
#define C11 PAL_LINE(GPIOC, 11) # define C11 PAL_LINE(GPIOC, 11)
#define C12 PAL_LINE(GPIOC, 12) # define C12 PAL_LINE(GPIOC, 12)
#define C13 PAL_LINE(GPIOC, 13) # define C13 PAL_LINE(GPIOC, 13)
#define C14 PAL_LINE(GPIOC, 14) # define C14 PAL_LINE(GPIOC, 14)
#define C15 PAL_LINE(GPIOC, 15) # define C15 PAL_LINE(GPIOC, 15)
#define D0 PAL_LINE(GPIOD, 0) # define D0 PAL_LINE(GPIOD, 0)
#define D1 PAL_LINE(GPIOD, 1) # define D1 PAL_LINE(GPIOD, 1)
#define D2 PAL_LINE(GPIOD, 2) # define D2 PAL_LINE(GPIOD, 2)
#define D3 PAL_LINE(GPIOD, 3) # define D3 PAL_LINE(GPIOD, 3)
#define D4 PAL_LINE(GPIOD, 4) # define D4 PAL_LINE(GPIOD, 4)
#define D5 PAL_LINE(GPIOD, 5) # define D5 PAL_LINE(GPIOD, 5)
#define D6 PAL_LINE(GPIOD, 6) # define D6 PAL_LINE(GPIOD, 6)
#define D7 PAL_LINE(GPIOD, 7) # define D7 PAL_LINE(GPIOD, 7)
#define D8 PAL_LINE(GPIOD, 8) # define D8 PAL_LINE(GPIOD, 8)
#define D9 PAL_LINE(GPIOD, 9) # define D9 PAL_LINE(GPIOD, 9)
#define D10 PAL_LINE(GPIOD, 10) # define D10 PAL_LINE(GPIOD, 10)
#define D11 PAL_LINE(GPIOD, 11) # define D11 PAL_LINE(GPIOD, 11)
#define D12 PAL_LINE(GPIOD, 12) # define D12 PAL_LINE(GPIOD, 12)
#define D13 PAL_LINE(GPIOD, 13) # define D13 PAL_LINE(GPIOD, 13)
#define D14 PAL_LINE(GPIOD, 14) # define D14 PAL_LINE(GPIOD, 14)
#define D15 PAL_LINE(GPIOD, 15) # define D15 PAL_LINE(GPIOD, 15)
#define E0 PAL_LINE(GPIOE, 0) # define E0 PAL_LINE(GPIOE, 0)
#define E1 PAL_LINE(GPIOE, 1) # define E1 PAL_LINE(GPIOE, 1)
#define E2 PAL_LINE(GPIOE, 2) # define E2 PAL_LINE(GPIOE, 2)
#define E3 PAL_LINE(GPIOE, 3) # define E3 PAL_LINE(GPIOE, 3)
#define E4 PAL_LINE(GPIOE, 4) # define E4 PAL_LINE(GPIOE, 4)
#define E5 PAL_LINE(GPIOE, 5) # define E5 PAL_LINE(GPIOE, 5)
#define E6 PAL_LINE(GPIOE, 6) # define E6 PAL_LINE(GPIOE, 6)
#define E7 PAL_LINE(GPIOE, 7) # define E7 PAL_LINE(GPIOE, 7)
#define E8 PAL_LINE(GPIOE, 8) # define E8 PAL_LINE(GPIOE, 8)
#define E9 PAL_LINE(GPIOE, 9) # define E9 PAL_LINE(GPIOE, 9)
#define E10 PAL_LINE(GPIOE, 10) # define E10 PAL_LINE(GPIOE, 10)
#define E11 PAL_LINE(GPIOE, 11) # define E11 PAL_LINE(GPIOE, 11)
#define E12 PAL_LINE(GPIOE, 12) # define E12 PAL_LINE(GPIOE, 12)
#define E13 PAL_LINE(GPIOE, 13) # define E13 PAL_LINE(GPIOE, 13)
#define E14 PAL_LINE(GPIOE, 14) # define E14 PAL_LINE(GPIOE, 14)
#define E15 PAL_LINE(GPIOE, 15) # define E15 PAL_LINE(GPIOE, 15)
#define F0 PAL_LINE(GPIOF, 0) # define F0 PAL_LINE(GPIOF, 0)
#define F1 PAL_LINE(GPIOF, 1) # define F1 PAL_LINE(GPIOF, 1)
#define F2 PAL_LINE(GPIOF, 2) # define F2 PAL_LINE(GPIOF, 2)
#define F3 PAL_LINE(GPIOF, 3) # define F3 PAL_LINE(GPIOF, 3)
#define F4 PAL_LINE(GPIOF, 4) # define F4 PAL_LINE(GPIOF, 4)
#define F5 PAL_LINE(GPIOF, 5) # define F5 PAL_LINE(GPIOF, 5)
#define F6 PAL_LINE(GPIOF, 6) # define F6 PAL_LINE(GPIOF, 6)
#define F7 PAL_LINE(GPIOF, 7) # define F7 PAL_LINE(GPIOF, 7)
#define F8 PAL_LINE(GPIOF, 8) # define F8 PAL_LINE(GPIOF, 8)
#define F9 PAL_LINE(GPIOF, 9) # define F9 PAL_LINE(GPIOF, 9)
#define F10 PAL_LINE(GPIOF, 10) # define F10 PAL_LINE(GPIOF, 10)
#define F11 PAL_LINE(GPIOF, 11) # define F11 PAL_LINE(GPIOF, 11)
#define F12 PAL_LINE(GPIOF, 12) # define F12 PAL_LINE(GPIOF, 12)
#define F13 PAL_LINE(GPIOF, 13) # define F13 PAL_LINE(GPIOF, 13)
#define F14 PAL_LINE(GPIOF, 14) # define F14 PAL_LINE(GPIOF, 14)
#define F15 PAL_LINE(GPIOF, 15) # define F15 PAL_LINE(GPIOF, 15)
#endif # endif
#endif #endif
/* USART configuration */ /* USART configuration */
@ -291,7 +291,8 @@
# define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1) # define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
# define SERIAL_UART_RXD_VECT USART1_RX_vect # define SERIAL_UART_RXD_VECT USART1_RX_vect
# define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1)) # define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
# define SERIAL_UART_INIT() do { \ # define SERIAL_UART_INIT() \
do { \
/* baud rate */ \ /* baud rate */ \
UBRR1L = SERIAL_UART_UBRR; \ UBRR1L = SERIAL_UART_UBRR; \
/* baud rate */ \ /* baud rate */ \
@ -301,7 +302,7 @@
/* 8-bit data */ \ /* 8-bit data */ \
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \ UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
sei(); \ sei(); \
} while(0) } while (0)
# else # else
# error "USART configuration is needed." # error "USART configuration is needed."
# endif # endif

View file

@ -20,7 +20,7 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state.
#include "timer.h" #include "timer.h"
#include "quantum.h" #include "quantum.h"
#ifndef DEBOUNCE #ifndef DEBOUNCE
#define DEBOUNCE 5 # define DEBOUNCE 5
#endif #endif
void debounce_init(uint8_t num_rows) {} void debounce_init(uint8_t num_rows) {}
@ -28,8 +28,7 @@ static bool debouncing = false;
#if DEBOUNCE > 0 #if DEBOUNCE > 0
static uint16_t debouncing_time; static uint16_t debouncing_time;
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
{
if (changed) { if (changed) {
debouncing = true; debouncing = true;
debouncing_time = timer_read(); debouncing_time = timer_read();
@ -42,16 +41,12 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
debouncing = false; debouncing = false;
} }
} }
#else //no debouncing. #else // no debouncing.
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
{
for (int i = 0; i < num_rows; i++) { for (int i = 0; i < num_rows; i++) {
cooked[i] = raw[i]; cooked[i] = raw[i];
} }
} }
#endif #endif
bool debounce_active(void) { bool debounce_active(void) { return debouncing; }
return debouncing;
}

View file

@ -23,40 +23,34 @@
#ifdef DYNAMIC_KEYMAP_ENABLE #ifdef DYNAMIC_KEYMAP_ENABLE
#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR # ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
#error DYNAMIC_KEYMAP_EEPROM_ADDR not defined # error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
#endif # endif
#ifndef DYNAMIC_KEYMAP_LAYER_COUNT # ifndef DYNAMIC_KEYMAP_LAYER_COUNT
#error DYNAMIC_KEYMAP_LAYER_COUNT not defined # error DYNAMIC_KEYMAP_LAYER_COUNT not defined
#endif # endif
#ifndef DYNAMIC_KEYMAP_MACRO_COUNT # ifndef DYNAMIC_KEYMAP_MACRO_COUNT
#error DYNAMIC_KEYMAP_MACRO_COUNT not defined # error DYNAMIC_KEYMAP_MACRO_COUNT not defined
#endif # endif
#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR # ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
#error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined # error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined
#endif # endif
#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE # ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
#error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined # error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined
#endif # endif
uint8_t dynamic_keymap_get_layer_count(void) uint8_t dynamic_keymap_get_layer_count(void) { return DYNAMIC_KEYMAP_LAYER_COUNT; }
{
return DYNAMIC_KEYMAP_LAYER_COUNT;
}
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) {
{
// TODO: optimize this with some left shifts // TODO: optimize this with some left shifts
return ((void*)DYNAMIC_KEYMAP_EEPROM_ADDR) + ( layer * MATRIX_ROWS * MATRIX_COLS * 2 ) + return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2);
( row * MATRIX_COLS * 2 ) + ( column * 2 );
} }
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) {
{
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
// Big endian, so we can read/write EEPROM directly from host if we want // Big endian, so we can read/write EEPROM directly from host if we want
uint16_t keycode = eeprom_read_byte(address) << 8; uint16_t keycode = eeprom_read_byte(address) << 8;
@ -64,35 +58,32 @@ uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column)
return keycode; return keycode;
} }
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) {
{
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
// Big endian, so we can read/write EEPROM directly from host if we want // Big endian, so we can read/write EEPROM directly from host if we want
eeprom_update_byte(address, (uint8_t)(keycode >> 8)); eeprom_update_byte(address, (uint8_t)(keycode >> 8));
eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF)); eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF));
} }
void dynamic_keymap_reset(void) void dynamic_keymap_reset(void) {
{
// Reset the keymaps in EEPROM to what is in flash. // Reset the keymaps in EEPROM to what is in flash.
// All keyboards using dynamic keymaps should define a layout // All keyboards using dynamic keymaps should define a layout
// for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT. // for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT.
for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) { for (int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
for ( int row = 0; row < MATRIX_ROWS; row++ ) { for (int row = 0; row < MATRIX_ROWS; row++) {
for ( int column = 0; column < MATRIX_COLS; column++ ) { for (int column = 0; column < MATRIX_COLS; column++) {
dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column])); dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
} }
} }
} }
} }
void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ) void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
{
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
void *source = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); void * source = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
uint8_t *target = data; uint8_t *target = data;
for ( uint16_t i = 0; i < size; i++ ) { for (uint16_t i = 0; i < size; i++) {
if ( offset + i < dynamic_keymap_eeprom_size ) { if (offset + i < dynamic_keymap_eeprom_size) {
*target = eeprom_read_byte(source); *target = eeprom_read_byte(source);
} else { } else {
*target = 0x00; *target = 0x00;
@ -102,13 +93,12 @@ void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
} }
} }
void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
{
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
void *target = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); void * target = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
uint8_t *source = data; uint8_t *source = data;
for ( uint16_t i = 0; i < size; i++ ) { for (uint16_t i = 0; i < size; i++) {
if ( offset + i < dynamic_keymap_eeprom_size ) { if (offset + i < dynamic_keymap_eeprom_size) {
eeprom_update_byte(target, *source); eeprom_update_byte(target, *source);
} }
source++; source++;
@ -117,35 +107,23 @@ void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
} }
// This overrides the one in quantum/keymap_common.c // This overrides the one in quantum/keymap_common.c
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
{ if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT &&
key.row < MATRIX_ROWS &&
key.col < MATRIX_COLS ) {
return dynamic_keymap_get_keycode(layer, key.row, key.col); return dynamic_keymap_get_keycode(layer, key.row, key.col);
} else { } else {
return KC_NO; return KC_NO;
} }
} }
uint8_t dynamic_keymap_macro_get_count(void) { return DYNAMIC_KEYMAP_MACRO_COUNT; }
uint16_t dynamic_keymap_macro_get_buffer_size(void) { return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; }
uint8_t dynamic_keymap_macro_get_count(void) void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
{ void * source = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
return DYNAMIC_KEYMAP_MACRO_COUNT;
}
uint16_t dynamic_keymap_macro_get_buffer_size(void)
{
return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE;
}
void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
{
void *source = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
uint8_t *target = data; uint8_t *target = data;
for ( uint16_t i = 0; i < size; i++ ) { for (uint16_t i = 0; i < size; i++) {
if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
*target = eeprom_read_byte(source); *target = eeprom_read_byte(source);
} else { } else {
*target = 0x00; *target = 0x00;
@ -155,12 +133,11 @@ void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *d
} }
} }
void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
{ void * target = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
void *target = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
uint8_t *source = data; uint8_t *source = data;
for ( uint16_t i = 0; i < size; i++ ) { for (uint16_t i = 0; i < size; i++) {
if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
eeprom_update_byte(target, *source); eeprom_update_byte(target, *source);
} }
source++; source++;
@ -168,19 +145,17 @@ void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *d
} }
} }
void dynamic_keymap_macro_reset(void) void dynamic_keymap_macro_reset(void) {
{ void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); while (p != end) {
while ( p != end ) {
eeprom_update_byte(p, 0); eeprom_update_byte(p, 0);
++p; ++p;
} }
} }
void dynamic_keymap_macro_send( uint8_t id ) void dynamic_keymap_macro_send(uint8_t id) {
{ if (id >= DYNAMIC_KEYMAP_MACRO_COUNT) {
if ( id >= DYNAMIC_KEYMAP_MACRO_COUNT ) {
return; return;
} }
@ -188,23 +163,23 @@ void dynamic_keymap_macro_send( uint8_t id )
// If it's not zero, then we are in the middle // If it's not zero, then we are in the middle
// of buffer writing, possibly an aborted buffer // of buffer writing, possibly an aborted buffer
// write. So do nothing. // write. So do nothing.
void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1); void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE - 1);
if ( eeprom_read_byte(p) != 0 ) { if (eeprom_read_byte(p) != 0) {
return; return;
} }
// Skip N null characters // Skip N null characters
// p will then point to the Nth macro // p will then point to the Nth macro
p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
while ( id > 0 ) { while (id > 0) {
// If we are past the end of the buffer, then the buffer // If we are past the end of the buffer, then the buffer
// contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT // contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT
// nulls in the buffer. // nulls in the buffer.
if ( p == end ) { if (p == end) {
return; return;
} }
if ( eeprom_read_byte(p) == 0 ) { if (eeprom_read_byte(p) == 0) {
--id; --id;
} }
++p; ++p;
@ -212,21 +187,21 @@ void dynamic_keymap_macro_send( uint8_t id )
// Send the macro string one or two chars at a time // Send the macro string one or two chars at a time
// by making temporary 1 or 2 char strings // by making temporary 1 or 2 char strings
char data[3] = { 0, 0, 0 }; char data[3] = {0, 0, 0};
// We already checked there was a null at the end of // We already checked there was a null at the end of
// the buffer, so this cannot go past the end // the buffer, so this cannot go past the end
while ( 1 ) { while (1) {
data[0] = eeprom_read_byte(p++); data[0] = eeprom_read_byte(p++);
data[1] = 0; data[1] = 0;
// Stop at the null terminator of this macro string // Stop at the null terminator of this macro string
if ( data[0] == 0 ) { if (data[0] == 0) {
break; break;
} }
// If the char is magic (tap, down, up), // If the char is magic (tap, down, up),
// add the next char (key to use) and send a 2 char string. // add the next char (key to use) and send a 2 char string.
if ( data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE ) { if (data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE) {
data[1] = eeprom_read_byte(p++); data[1] = eeprom_read_byte(p++);
if ( data[1] == 0 ) { if (data[1] == 0) {
break; break;
} }
} }
@ -235,4 +210,3 @@ void dynamic_keymap_macro_send( uint8_t id )
} }
#endif // DYNAMIC_KEYMAP_ENABLE #endif // DYNAMIC_KEYMAP_ENABLE

View file

@ -19,7 +19,7 @@
#include <stdbool.h> #include <stdbool.h>
uint8_t dynamic_keymap_get_layer_count(void); uint8_t dynamic_keymap_get_layer_count(void);
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); void * dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column);
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column);
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
void dynamic_keymap_reset(void); void dynamic_keymap_reset(void);
@ -31,14 +31,12 @@ void dynamic_keymap_reset(void);
// This is only really useful for host applications that want to get a whole keymap fast, // This is only really useful for host applications that want to get a whole keymap fast,
// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by // by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by
// a factor of 14. // a factor of 14.
void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data);
void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data);
// This overrides the one in quantum/keymap_common.c // This overrides the one in quantum/keymap_common.c
// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
// Note regarding dynamic_keymap_macro_set_buffer(): // Note regarding dynamic_keymap_macro_set_buffer():
// The last byte of the buffer is used as a valid flag, // The last byte of the buffer is used as a valid flag,
// so macro sending is disabled during writing a new buffer, // so macro sending is disabled during writing a new buffer,
@ -55,9 +53,8 @@ void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
uint8_t dynamic_keymap_macro_get_count(void); uint8_t dynamic_keymap_macro_get_count(void);
uint16_t dynamic_keymap_macro_get_buffer_size(void); uint16_t dynamic_keymap_macro_get_buffer_size(void);
void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data);
void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data);
void dynamic_keymap_macro_reset(void); void dynamic_keymap_macro_reset(void);
void dynamic_keymap_macro_send( uint8_t id ); void dynamic_keymap_macro_send(uint8_t id);

View file

@ -30,7 +30,7 @@
* there have been reports of it being too much in some users' cases, * there have been reports of it being too much in some users' cases,
* so 128 is considered a safe default. * so 128 is considered a safe default.
*/ */
#define DYNAMIC_MACRO_SIZE 128 # define DYNAMIC_MACRO_SIZE 128
#endif #endif
/* DYNAMIC_MACRO_RANGE must be set as the last element of user's /* DYNAMIC_MACRO_RANGE must be set as the last element of user's
@ -46,8 +46,7 @@ enum dynamic_macro_keycodes {
}; };
/* Blink the LEDs to notify the user about some event. */ /* Blink the LEDs to notify the user about some event. */
void dynamic_macro_led_blink(void) void dynamic_macro_led_blink(void) {
{
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
backlight_toggle(); backlight_toggle();
wait_ms(100); wait_ms(100);
@ -59,10 +58,8 @@ void dynamic_macro_led_blink(void)
* need a `direction` variable accessible at the call site. * need a `direction` variable accessible at the call site.
*/ */
#define DYNAMIC_MACRO_CURRENT_SLOT() (direction > 0 ? 1 : 2) #define DYNAMIC_MACRO_CURRENT_SLOT() (direction > 0 ? 1 : 2)
#define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) \ #define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) ((int)(direction * ((POINTER) - (BEGIN))))
((int)(direction * ((POINTER) - (BEGIN)))) #define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) ((int)(direction * ((END2) - (BEGIN)) + 1))
#define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) \
((int)(direction * ((END2) - (BEGIN)) + 1))
/** /**
* Start recording of the dynamic macro. * Start recording of the dynamic macro.
@ -70,9 +67,7 @@ void dynamic_macro_led_blink(void)
* @param[out] macro_pointer The new macro buffer iterator. * @param[out] macro_pointer The new macro buffer iterator.
* @param[in] macro_buffer The macro buffer used to initialize macro_pointer. * @param[in] macro_buffer The macro buffer used to initialize macro_pointer.
*/ */
void dynamic_macro_record_start( void dynamic_macro_record_start(keyrecord_t **macro_pointer, keyrecord_t *macro_buffer) {
keyrecord_t **macro_pointer, keyrecord_t *macro_buffer)
{
dprintln("dynamic macro recording: started"); dprintln("dynamic macro recording: started");
dynamic_macro_led_blink(); dynamic_macro_led_blink();
@ -89,9 +84,7 @@ void dynamic_macro_record_start(
* @param macro_end[in] The element after the last macro buffer element. * @param macro_end[in] The element after the last macro buffer element.
* @param direction[in] Either +1 or -1, which way to iterate the buffer. * @param direction[in] Either +1 or -1, which way to iterate the buffer.
*/ */
void dynamic_macro_play( void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction) {
keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction)
{
dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT()); dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT());
uint32_t saved_layer_state = layer_state; uint32_t saved_layer_state = layer_state;
@ -118,13 +111,7 @@ void dynamic_macro_play(
* @param direction[in] Either +1 or -1, which way to iterate the buffer. * @param direction[in] Either +1 or -1, which way to iterate the buffer.
* @param record[in] The current keypress. * @param record[in] The current keypress.
*/ */
void dynamic_macro_record_key( void dynamic_macro_record_key(keyrecord_t *macro_buffer, keyrecord_t **macro_pointer, keyrecord_t *macro2_end, int8_t direction, keyrecord_t *record) {
keyrecord_t *macro_buffer,
keyrecord_t **macro_pointer,
keyrecord_t *macro2_end,
int8_t direction,
keyrecord_t *record)
{
/* If we've just started recording, ignore all the key releases. */ /* If we've just started recording, ignore all the key releases. */
if (!record->event.pressed && *macro_pointer == macro_buffer) { if (!record->event.pressed && *macro_pointer == macro_buffer) {
dprintln("dynamic macro: ignoring a leading key-up event"); dprintln("dynamic macro: ignoring a leading key-up event");
@ -141,38 +128,25 @@ void dynamic_macro_record_key(
dynamic_macro_led_blink(); dynamic_macro_led_blink();
} }
dprintf( dprintf("dynamic macro: slot %d length: %d/%d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer), DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
"dynamic macro: slot %d length: %d/%d\n",
DYNAMIC_MACRO_CURRENT_SLOT(),
DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer),
DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
} }
/** /**
* End recording of the dynamic macro. Essentially just update the * End recording of the dynamic macro. Essentially just update the
* pointer to the end of the macro. * pointer to the end of the macro.
*/ */
void dynamic_macro_record_end( void dynamic_macro_record_end(keyrecord_t *macro_buffer, keyrecord_t *macro_pointer, int8_t direction, keyrecord_t **macro_end) {
keyrecord_t *macro_buffer,
keyrecord_t *macro_pointer,
int8_t direction,
keyrecord_t **macro_end)
{
dynamic_macro_led_blink(); dynamic_macro_led_blink();
/* Do not save the keys being held when stopping the recording, /* Do not save the keys being held when stopping the recording,
* i.e. the keys used to access the layer DYN_REC_STOP is on. * i.e. the keys used to access the layer DYN_REC_STOP is on.
*/ */
while (macro_pointer != macro_buffer && while (macro_pointer != macro_buffer && (macro_pointer - direction)->event.pressed) {
(macro_pointer - direction)->event.pressed) {
dprintln("dynamic macro: trimming a trailing key-down event"); dprintln("dynamic macro: trimming a trailing key-down event");
macro_pointer -= direction; macro_pointer -= direction;
} }
dprintf( dprintf("dynamic macro: slot %d saved, length: %d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, macro_pointer));
"dynamic macro: slot %d saved, length: %d\n",
DYNAMIC_MACRO_CURRENT_SLOT(),
DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, macro_pointer));
*macro_end = macro_pointer; *macro_end = macro_pointer;
} }
@ -187,8 +161,7 @@ void dynamic_macro_record_end(
* <...THE REST OF THE FUNCTION...> * <...THE REST OF THE FUNCTION...>
* } * }
*/ */
bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t *record) bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
{
/* Both macros use the same buffer but read/write on different /* Both macros use the same buffer but read/write on different
* ends of it. * ends of it.
* *

View file

@ -17,27 +17,25 @@
#include "encoder.h" #include "encoder.h"
#ifdef SPLIT_KEYBOARD #ifdef SPLIT_KEYBOARD
#include "split_util.h" # include "split_util.h"
#endif #endif
// for memcpy // for memcpy
#include <string.h> #include <string.h>
#ifndef ENCODER_RESOLUTION #ifndef ENCODER_RESOLUTION
#define ENCODER_RESOLUTION 4 # define ENCODER_RESOLUTION 4
#endif #endif
#if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B) #if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B)
#error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B" # error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B"
#endif #endif
#define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a) / sizeof(pin_t))
#define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a)/sizeof(pin_t))
static pin_t encoders_pad_a[] = ENCODERS_PAD_A; static pin_t encoders_pad_a[] = ENCODERS_PAD_A;
static pin_t encoders_pad_b[] = ENCODERS_PAD_B; static pin_t encoders_pad_b[] = ENCODERS_PAD_B;
static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; static int8_t encoder_LUT[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0};
@ -48,13 +46,9 @@ static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0};
static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
#endif #endif
__attribute__ ((weak)) __attribute__((weak)) void encoder_update_user(int8_t index, bool clockwise) {}
void encoder_update_user(int8_t index, bool clockwise) { }
__attribute__ ((weak)) __attribute__((weak)) void encoder_update_kb(int8_t index, bool clockwise) { encoder_update_user(index, clockwise); }
void encoder_update_kb(int8_t index, bool clockwise) {
encoder_update_user(index, clockwise);
}
void encoder_init(void) { void encoder_init(void) {
#if defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT) #if defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT)
@ -92,9 +86,7 @@ void encoder_read(void) {
} }
#ifdef SPLIT_KEYBOARD #ifdef SPLIT_KEYBOARD
void encoder_state_raw(uint8_t* slave_state) { void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, encoder_state, sizeof(encoder_state)); }
memcpy(slave_state, encoder_state, sizeof(encoder_state));
}
void encoder_update_raw(uint8_t* slave_state) { void encoder_update_raw(uint8_t* slave_state) {
for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {

View file

@ -25,8 +25,7 @@ uint16_t note_start = 0;
bool note_playing = false; bool note_playing = false;
uint16_t note_period = 0; uint16_t note_period = 0;
void fauxclicky_init() void fauxclicky_init() {
{
// Set port PC6 (OC3A and /OC4A) as output // Set port PC6 (OC3A and /OC4A) as output
DDRC |= _BV(PORTC6); DDRC |= _BV(PORTC6);
@ -35,8 +34,7 @@ void fauxclicky_init()
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
} }
void fauxclicky_stop() void fauxclicky_stop() {
{
FAUXCLICKY_DISABLE_OUTPUT; FAUXCLICKY_DISABLE_OUTPUT;
note_playing = false; note_playing = false;
} }

View file

@ -14,18 +14,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled" # error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled"
#endif #endif
#include "musical_notes.h" #include "musical_notes.h"
#include "stdbool.h" #include "stdbool.h"
__attribute__ ((weak)) __attribute__((weak)) float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_D4, 0.25);
float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_D4, 0.25); __attribute__((weak)) float fauxclicky_released_note[2] = MUSICAL_NOTE(_C4, 0.125);
__attribute__ ((weak)) __attribute__((weak)) float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C4, 0.25);
float fauxclicky_released_note[2] = MUSICAL_NOTE(_C4, 0.125);
__attribute__ ((weak))
float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C4, 0.25);
bool fauxclicky_enabled; bool fauxclicky_enabled;
@ -34,7 +31,7 @@ bool fauxclicky_enabled;
// //
#ifndef FAUXCLICKY_TEMPO #ifndef FAUXCLICKY_TEMPO
#define FAUXCLICKY_TEMPO TEMPO_DEFAULT # define FAUXCLICKY_TEMPO TEMPO_DEFAULT
#endif #endif
// beep on press // beep on press
@ -50,42 +47,44 @@ bool fauxclicky_enabled;
#define FAUXCLICKY_ON fauxclicky_enabled = true #define FAUXCLICKY_ON fauxclicky_enabled = true
// disable // disable
#define FAUXCLICKY_OFF do { \ #define FAUXCLICKY_OFF \
do { \
fauxclicky_enabled = false; \ fauxclicky_enabled = false; \
fauxclicky_stop(); \ fauxclicky_stop(); \
} while (0) } while (0)
// toggle // toggle
#define FAUXCLICKY_TOGGLE do { \ #define FAUXCLICKY_TOGGLE \
do { \
if (fauxclicky_enabled) { \ if (fauxclicky_enabled) { \
FAUXCLICKY_OFF; \ FAUXCLICKY_OFF; \
} else { \ } else { \
FAUXCLICKY_ON; \ FAUXCLICKY_ON; \
} \ } \
} while (0) } while (0)
// //
// pin configuration // pin configuration
// //
#ifndef FAUXCLICKY_CPU_PRESCALER #ifndef FAUXCLICKY_CPU_PRESCALER
#define FAUXCLICKY_CPU_PRESCALER 8 # define FAUXCLICKY_CPU_PRESCALER 8
#endif #endif
#ifndef FAUXCLICKY_ENABLE_OUTPUT #ifndef FAUXCLICKY_ENABLE_OUTPUT
#define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1) # define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1)
#endif #endif
#ifndef FAUXCLICKY_DISABLE_OUTPUT #ifndef FAUXCLICKY_DISABLE_OUTPUT
#define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)) # define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0))
#endif #endif
#ifndef FAUXCLICKY_TIMER_PERIOD #ifndef FAUXCLICKY_TIMER_PERIOD
#define FAUXCLICKY_TIMER_PERIOD ICR3 # define FAUXCLICKY_TIMER_PERIOD ICR3
#endif #endif
#ifndef FAUXCLICKY_DUTY_CYCLE #ifndef FAUXCLICKY_DUTY_CYCLE
#define FAUXCLICKY_DUTY_CYCLE OCR3A # define FAUXCLICKY_DUTY_CYCLE OCR3A
#endif #endif
// //
@ -96,4 +95,3 @@ void fauxclicky_init(void);
void fauxclicky_stop(void); void fauxclicky_stop(void);
void fauxclicky_play(float note[2]); void fauxclicky_play(float note[2]);
void fauxclicky_check(void); void fauxclicky_check(void);

View file

@ -24,7 +24,6 @@ extern keymap_config_t keymap_config;
* and will return the corrected keycode, when appropriate. * and will return the corrected keycode, when appropriate.
*/ */
uint16_t keycode_config(uint16_t keycode) { uint16_t keycode_config(uint16_t keycode) {
switch (keycode) { switch (keycode) {
case KC_CAPSLOCK: case KC_CAPSLOCK:
case KC_LOCKING_CAPS: case KC_LOCKING_CAPS:

View file

@ -19,7 +19,7 @@
#include "action_code.h" #include "action_code.h"
#ifndef KEYCODE_CONFIG_H #ifndef KEYCODE_CONFIG_H
#define KEYCODE_CONFIG_H # define KEYCODE_CONFIG_H
uint16_t keycode_config(uint16_t keycode); uint16_t keycode_config(uint16_t keycode);
uint8_t mod_config(uint8_t mod); uint8_t mod_config(uint8_t mod);
@ -28,16 +28,16 @@ uint8_t mod_config(uint8_t mod);
typedef union { typedef union {
uint16_t raw; uint16_t raw;
struct { struct {
bool swap_control_capslock:1; bool swap_control_capslock : 1;
bool capslock_to_control:1; bool capslock_to_control : 1;
bool swap_lalt_lgui:1; bool swap_lalt_lgui : 1;
bool swap_ralt_rgui:1; bool swap_ralt_rgui : 1;
bool no_gui:1; bool no_gui : 1;
bool swap_grave_esc:1; bool swap_grave_esc : 1;
bool swap_backslash_backspace:1; bool swap_backslash_backspace : 1;
bool nkro:1; bool nkro : 1;
bool swap_lctl_lgui:1; bool swap_lctl_lgui : 1;
bool swap_rctl_rgui:1; bool swap_rctl_rgui : 1;
}; };
} keymap_config_t; } keymap_config_t;

View file

@ -22,10 +22,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdbool.h> #include <stdbool.h>
#include "action.h" #include "action.h"
#if defined(__AVR__) #if defined(__AVR__)
#include <avr/pgmspace.h> # include <avr/pgmspace.h>
#elif defined PROTOCOL_CHIBIOS #elif defined PROTOCOL_CHIBIOS
//We need to ensure that chibios is include before redefining reset // We need to ensure that chibios is include before redefining reset
#include "ch.h" # include "ch.h"
#endif #endif
#include "keycode.h" #include "keycode.h"
#include "action_macro.h" #include "action_macro.h"
@ -38,7 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// ChibiOS uses RESET in its FlagStatus enumeration // ChibiOS uses RESET in its FlagStatus enumeration
// Therefore define it as QK_RESET here, to avoid name collision // Therefore define it as QK_RESET here, to avoid name collision
#if defined(PROTOCOL_CHIBIOS) #if defined(PROTOCOL_CHIBIOS)
#define RESET QK_RESET # define RESET QK_RESET
#endif #endif
#include "quantum_keycodes.h" #include "quantum_keycodes.h"
@ -47,10 +47,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
// translates function id to action // translates function id to action
uint16_t keymap_function_id_to_action( uint16_t function_id ); uint16_t keymap_function_id_to_action(uint16_t function_id);
extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
extern const uint16_t fn_actions[]; extern const uint16_t fn_actions[];
#endif #endif

View file

@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "keycode.h" #include "keycode.h"
#include "action_layer.h" #include "action_layer.h"
#if defined(__AVR__) #if defined(__AVR__)
#include <util/delay.h> # include <util/delay.h>
#include <stdio.h> # include <stdio.h>
#endif #endif
#include "action.h" #include "action.h"
#include "action_macro.h" #include "action_macro.h"
@ -30,7 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "quantum.h" #include "quantum.h"
#ifdef MIDI_ENABLE #ifdef MIDI_ENABLE
#include "process_midi.h" # include "process_midi.h"
#endif #endif
extern keymap_config_t keymap_config; extern keymap_config_t keymap_config;
@ -38,8 +38,7 @@ extern keymap_config_t keymap_config;
#include <inttypes.h> #include <inttypes.h>
/* converts key to action */ /* converts key to action */
action_t action_for_key(uint8_t layer, keypos_t key) action_t action_for_key(uint8_t layer, keypos_t key) {
{
// 16bit keycodes - important // 16bit keycodes - important
uint16_t keycode = keymap_key_to_keycode(layer, key); uint16_t keycode = keymap_key_to_keycode(layer, key);
@ -69,15 +68,15 @@ action_t action_for_key(uint8_t layer, keypos_t key)
case KC_TRNS: case KC_TRNS:
action.code = ACTION_TRANSPARENT; action.code = ACTION_TRANSPARENT;
break; break;
case QK_MODS ... QK_MODS_MAX: ; case QK_MODS ... QK_MODS_MAX:;
// Has a modifier // Has a modifier
// Split it up // Split it up
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
break; break;
case QK_FUNCTION ... QK_FUNCTION_MAX: ; case QK_FUNCTION ... QK_FUNCTION_MAX:;
// Is a shortcut for function action_layer, pull last 12bits // Is a shortcut for function action_layer, pull last 12bits
// This means we have 4,096 FN macros at our disposal // This means we have 4,096 FN macros at our disposal
action.code = keymap_function_id_to_action( (int)keycode & 0xFFF ); action.code = keymap_function_id_to_action((int)keycode & 0xFFF);
break; break;
case QK_MACRO ... QK_MACRO_MAX: case QK_MACRO ... QK_MACRO_MAX:
if (keycode & 0x800) // tap macros have upper bit set if (keycode & 0x800) // tap macros have upper bit set
@ -88,33 +87,33 @@ action_t action_for_key(uint8_t layer, keypos_t key)
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
break; break;
case QK_TO ... QK_TO_MAX: ; case QK_TO ... QK_TO_MAX:;
// Layer set "GOTO" // Layer set "GOTO"
when = (keycode >> 0x4) & 0x3; when = (keycode >> 0x4) & 0x3;
action_layer = keycode & 0xF; action_layer = keycode & 0xF;
action.code = ACTION_LAYER_SET(action_layer, when); action.code = ACTION_LAYER_SET(action_layer, when);
break; break;
case QK_MOMENTARY ... QK_MOMENTARY_MAX: ; case QK_MOMENTARY ... QK_MOMENTARY_MAX:;
// Momentary action_layer // Momentary action_layer
action_layer = keycode & 0xFF; action_layer = keycode & 0xFF;
action.code = ACTION_LAYER_MOMENTARY(action_layer); action.code = ACTION_LAYER_MOMENTARY(action_layer);
break; break;
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: ; case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:;
// Set default action_layer // Set default action_layer
action_layer = keycode & 0xFF; action_layer = keycode & 0xFF;
action.code = ACTION_DEFAULT_LAYER_SET(action_layer); action.code = ACTION_DEFAULT_LAYER_SET(action_layer);
break; break;
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: ; case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:;
// Set toggle // Set toggle
action_layer = keycode & 0xFF; action_layer = keycode & 0xFF;
action.code = ACTION_LAYER_TOGGLE(action_layer); action.code = ACTION_LAYER_TOGGLE(action_layer);
break; break;
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: ; case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:;
// OSL(action_layer) - One-shot action_layer // OSL(action_layer) - One-shot action_layer
action_layer = keycode & 0xFF; action_layer = keycode & 0xFF;
action.code = ACTION_LAYER_ONESHOT(action_layer); action.code = ACTION_LAYER_ONESHOT(action_layer);
break; break;
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: ; case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:;
// OSM(mod) - One-shot mod // OSM(mod) - One-shot mod
mod = mod_config(keycode & 0xFF); mod = mod_config(keycode & 0xFF);
action.code = ACTION_MODS_ONESHOT(mod); action.code = ACTION_MODS_ONESHOT(mod);
@ -131,7 +130,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
mod = mod_config((keycode >> 0x8) & 0x1F); mod = mod_config((keycode >> 0x8) & 0x1F);
action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF); action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF);
break; break;
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
case BL_ON: case BL_ON:
action.code = ACTION_BACKLIGHT_ON(); action.code = ACTION_BACKLIGHT_ON();
break; break;
@ -150,12 +149,12 @@ action_t action_for_key(uint8_t layer, keypos_t key)
case BL_STEP: case BL_STEP:
action.code = ACTION_BACKLIGHT_STEP(); action.code = ACTION_BACKLIGHT_STEP();
break; break;
#endif #endif
#ifdef SWAP_HANDS_ENABLE #ifdef SWAP_HANDS_ENABLE
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff); action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff);
break; break;
#endif #endif
default: default:
action.code = ACTION_NO; action.code = ACTION_NO;
@ -164,42 +163,30 @@ action_t action_for_key(uint8_t layer, keypos_t key)
return action; return action;
} }
__attribute__ ((weak)) __attribute__((weak)) const uint16_t PROGMEM fn_actions[] = {
const uint16_t PROGMEM fn_actions[] = {
}; };
/* Macro */ /* Macro */
__attribute__ ((weak)) __attribute__((weak)) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; }
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
return MACRO_NONE;
}
/* Function */ /* Function */
__attribute__ ((weak)) __attribute__((weak)) void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {}
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
}
// translates key to keycode // translates key to keycode
__attribute__ ((weak)) __attribute__((weak)) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
// Read entire word (16bits) // Read entire word (16bits)
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
} }
// translates function id to action // translates function id to action
__attribute__ ((weak)) __attribute__((weak)) uint16_t keymap_function_id_to_action(uint16_t function_id) {
uint16_t keymap_function_id_to_action( uint16_t function_id ) // The compiler sees the empty (weak) fn_actions and generates a warning
{ // This function should not be called in that case, so the warning is too strict
// The compiler sees the empty (weak) fn_actions and generates a warning // If this function is called however, the keymap should have overridden fn_actions, and then the compile
// This function should not be called in that case, so the warning is too strict // is comparing against the wrong array
// If this function is called however, the keymap should have overridden fn_actions, and then the compile #pragma GCC diagnostic push
// is comparing against the wrong array #pragma GCC diagnostic ignored "-Warray-bounds"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
return pgm_read_word(&fn_actions[function_id]); return pgm_read_word(&fn_actions[function_id]);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
} }

View file

@ -19,7 +19,7 @@
#include "keymap.h" #include "keymap.h"
#ifndef GR2A #ifndef GR2A
#define GR2A(kc) RCTL(kc) # define GR2A(kc) RCTL(kc)
#endif #endif
// Normal characters // Normal characters

View file

@ -31,7 +31,7 @@
#define CH_G KC_G #define CH_G KC_G
#ifdef CH_H #ifdef CH_H
// The ChibiOS ch.h file defines this... // The ChibiOS ch.h file defines this...
#undef CH_H # undef CH_H
#endif #endif
#define CH_H KC_H #define CH_H KC_H
#define CH_I KC_I #define CH_I KC_I

View file

@ -128,7 +128,7 @@
#define HU_HASH ALGR(HU_X) // # #define HU_HASH ALGR(HU_X) // #
#define HU_AMPR ALGR(HU_C) // & #define HU_AMPR ALGR(HU_C) // &
#define HU_AT ALGR(HU_V) // @ #define HU_AT ALGR(HU_V) // @
#define HU_LCBR ALGR(HU_B)// { #define HU_LCBR ALGR(HU_B) // {
#define HU_RCBR ALGR(HU_N) // } #define HU_RCBR ALGR(HU_N) // }
#define HU_SCLN ALGR(HU_COMM) // ; #define HU_SCLN ALGR(HU_COMM) // ;
#define HU_ASTR ALGR(HU_MINS) // * #define HU_ASTR ALGR(HU_MINS) // *

View file

@ -70,11 +70,8 @@
#define IT_APOS KC_MINS // ', ?, , #define IT_APOS KC_MINS // ', ?, ,
#define IT_BKSL KC_GRAVE // backslash \, | #define IT_BKSL KC_GRAVE // backslash \, |
#define IT_ACUT // accent acute ´ and grave ` #define IT_ACUT // accent acute ´ and grave `
#define IT_LESS KC_NUBS // < and > and | #define IT_LESS KC_NUBS // < and > and |

View file

@ -20,14 +20,11 @@
* note: This website is written in Japanese. * note: This website is written in Japanese.
*/ */
#ifndef KEYMAP_JP_H #ifndef KEYMAP_JP_H
#define KEYMAP_JP_H #define KEYMAP_JP_H
#include "keymap.h" #include "keymap.h"
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi #define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
#define JP_YEN KC_INT3 // yen, | #define JP_YEN KC_INT3 // yen, |
#define JP_CIRC KC_EQL // ^, ~ #define JP_CIRC KC_EQL // ^, ~
@ -40,11 +37,10 @@
#define JP_HENK KC_INT4 // henkan #define JP_HENK KC_INT4 // henkan
#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi #define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi
#define JP_MKANA KC_LANG1 //kana on MacOSX #define JP_MKANA KC_LANG1 // kana on MacOSX
#define JP_MEISU KC_LANG2 //eisu on MacOSX #define JP_MEISU KC_LANG2 // eisu on MacOSX
// Aliases for shifted symbols
//Aliases for shifted symbols
#define JP_DQT LSFT(KC_2) // " #define JP_DQT LSFT(KC_2) // "
#define JP_AMPR LSFT(KC_6) // & #define JP_AMPR LSFT(KC_6) // &
#define JP_QUOT LSFT(KC_7) // ' #define JP_QUOT LSFT(KC_7) // '
@ -60,7 +56,6 @@
#define JP_RCBR LSFT(JP_RBRC) // } #define JP_RCBR LSFT(JP_RBRC) // }
#define JP_UNDS LSFT(JP_BSLS) // _ #define JP_UNDS LSFT(JP_BSLS) // _
// These symbols are correspond to US101-layout. // These symbols are correspond to US101-layout.
#define JP_MINS KC_MINS // - #define JP_MINS KC_MINS // -
#define JP_SCLN KC_SCLN // ; #define JP_SCLN KC_SCLN // ;
@ -76,5 +71,4 @@
#define JP_GT KC_GT // > #define JP_GT KC_GT // >
#define JP_QUES KC_QUES // ? #define JP_QUES KC_QUES // ?
#endif #endif

View file

@ -51,4 +51,3 @@
#define NM_COMM KC_COMM #define NM_COMM KC_COMM
#define NM_DOT KC_DOT #define NM_DOT KC_DOT
#define NM_SLSH KC_SLSH #define NM_SLSH KC_SLSH

View file

@ -20,11 +20,11 @@
#include "keymap.h" #include "keymap.h"
//Swapped Z and Y // Swapped Z and Y
#define SI_Z KC_Y #define SI_Z KC_Y
#define SI_Y KC_Z #define SI_Y KC_Z
//Special characters // Special characters
#define SI_CV KC_SCLN #define SI_CV KC_SCLN
#define SI_SV KC_LBRC #define SI_SV KC_LBRC
#define SI_ZV KC_BSLS #define SI_ZV KC_BSLS

View file

@ -20,45 +20,13 @@
#include "keymap_belgian.h" #include "keymap_belgian.h"
const bool ascii_to_shift_lut[128] PROGMEM = { const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0, 0, 1, 1, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
const bool ascii_to_altgr_lut[128] PROGMEM = { const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = { const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// NUL SOH STX ETX EOT ENQ ACK BEL // NUL SOH STX ETX EOT ENQ ACK BEL
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
KC_P, BE_Q, KC_R, KC_S, KC_T, KC_U, KC_V, BE_W, KC_P, BE_Q, KC_R, KC_S, KC_T, KC_U, KC_V, BE_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
KC_X, KC_Y, BE_Z, BE_CCED, BE_AMP, BE_AGRV, BE_EQL, KC_DEL KC_X, KC_Y, BE_Z, BE_CCED, BE_AMP, BE_AGRV, BE_EQL, KC_DEL};
};

View file

@ -20,45 +20,13 @@
#include "keymap_bepo.h" #include "keymap_bepo.h"
const bool ascii_to_shift_lut[128] PROGMEM = { const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 0, 0, 1,
0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
const bool ascii_to_altgr_lut[128] PROGMEM = { const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = { const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// NUL SOH STX ETX EOT ENQ ACK BEL // NUL SOH STX ETX EOT ENQ ACK BEL
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
BP_P, BP_Q, BP_R, BP_S, BP_T, BP_U, BP_V, BP_W, BP_P, BP_Q, BP_R, BP_S, BP_T, BP_U, BP_V, BP_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
BP_X, BP_Y, BP_Z, BP_Y, BP_B, BP_X, BP_K, KC_DEL BP_X, BP_Y, BP_Z, BP_Y, BP_B, BP_X, BP_K, KC_DEL};
};

View file

@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W, CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
};

View file

@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W, DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL};
};

View file

@ -20,45 +20,13 @@
#include "keymap_french.h" #include "keymap_french.h"
const bool ascii_to_shift_lut[128] PROGMEM = { const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0, 0, 0, 1, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
const bool ascii_to_altgr_lut[128] PROGMEM = { const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = { const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// NUL SOH STX ETX EOT ENQ ACK BEL // NUL SOH STX ETX EOT ENQ ACK BEL
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
KC_P, FR_Q, KC_R, KC_S, KC_T, KC_U, KC_V, FR_W, KC_P, FR_Q, KC_R, KC_S, KC_T, KC_U, KC_V, FR_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
KC_X, KC_Y, FR_Z, FR_APOS, FR_MINS, FR_EQL, FR_EACU, KC_DEL KC_X, KC_Y, FR_Z, FR_APOS, FR_MINS, FR_EQL, FR_EACU, KC_DEL};
};

View file

@ -20,45 +20,13 @@
#include "keymap_german.h" #include "keymap_german.h"
const bool ascii_to_shift_lut[128] PROGMEM = { const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1, 1, 1, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 0, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
const bool ascii_to_altgr_lut[128] PROGMEM = { const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = { const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// NUL SOH STX ETX EOT ENQ ACK BEL // NUL SOH STX ETX EOT ENQ ACK BEL
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W, DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
DE_X, DE_Y, DE_Z, DE_7, DE_LESS, DE_0, DE_PLUS, KC_DEL DE_X, DE_Y, DE_Z, DE_7, DE_LESS, DE_0, DE_PLUS, KC_DEL};
};

View file

@ -20,25 +20,9 @@
#include "keymap_jp.h" #include "keymap_jp.h"
const bool ascii_to_shift_lut[128] PROGMEM = { const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 0
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = { const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// NUL SOH STX ETX EOT ENQ ACK BEL // NUL SOH STX ETX EOT ENQ ACK BEL
@ -73,5 +57,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
KC_X, KC_Y, KC_Z, JP_LBRC, JP_YEN, JP_RBRC, JP_CIRC, KC_DEL KC_X, KC_Y, KC_Z, JP_LBRC, JP_YEN, JP_RBRC, JP_CIRC, KC_DEL};
};

View file

@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w // p q r s t u v w
NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W, NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W,
// x y z { | } ~ DEL // x y z { | } ~ DEL
NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
};

Some files were not shown because too many files have changed in this diff Show more