#include "i2cmaster.h"
bool i2c_initialized = 0;
+uint8_t mcp23018_status = 0x20;
bool ergodox_left_led_1 = 0; // left top
bool ergodox_left_led_2 = 0; // left middle
PORTC |= (1<<7);
PORTD |= (1<<7 | 1<<5 | 1<<4);
PORTE |= (1<<6);
+}
- // blink leds
+void ergodox_blink_all_leds(void)
+{
ergodox_led_all_off();
ergodox_led_all_set(LED_BRIGHTNESS_HI);
ergodox_led_all_on();
}
uint8_t init_mcp23018(void) {
- uint8_t err = 0x20;
+ mcp23018_status = 0x20;
// I2C subsystem
if (i2c_initialized == 0) {
// - unused : input : 1
// - input : input : 1
// - driving : output : 0
- err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
- err = i2c_write(IODIRA); if (err) goto out;
- err = i2c_write(0b00000000); if (err) goto out;
- err = i2c_write(0b00111111); if (err) goto out;
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
i2c_stop();
// set pull-up
// - unused : on : 1
// - input : on : 1
// - driving : off : 0
- err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
- err = i2c_write(GPPUA); if (err) goto out;
- err = i2c_write(0b00000000); if (err) goto out;
- err = i2c_write(0b00111111); if (err) goto out;
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
out:
i2c_stop();
- if (!err) err = ergodox_left_leds_update();
+ if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
- return err;
+ return mcp23018_status;
}
uint8_t ergodox_left_leds_update(void) {
- uint8_t err = 0x20;
+ if (mcp23018_status) { // if there was an error
+ return mcp23018_status;
+ }
// set logical value (doesn't matter on inputs)
// - unused : hi-Z : 1
// - input : hi-Z : 1
// - driving : hi-Z : 1
- err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
- err = i2c_write(OLATA); if (err) goto out;
- err = i2c_write(0b11111111
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(OLATA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
- ); if (err) goto out;
- err = i2c_write(0b11111111
+ ); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
- ); if (err) goto out;
+ ); if (mcp23018_status) goto out;
out:
i2c_stop();
- return err;
+ return mcp23018_status;
}