void TWITransmitData(void *const TXdata, uint8_t dataLen, uint8_t repStart, uint8_t blocking) { // Wait until ready while (!isTWIReady()) {_delay_us(1);} // Reset the I2C stuff TWCR = (1 << TWINT)|(1 << TWSTO); TWIInit(); // Set repeated start mode TWIInfo.repStart = repStart; // Copy transmit info to global variables TWITransmitBuffer = (uint8_t *)TXdata; TXBuffLen = dataLen; TXBuffIndex = 0; // If a repeated start has been sent, then devices are already listening for an address // and another start does not need to be sent. if (TWIInfo.mode == RepeatedStartSent) { TWIInfo.mode = Initializing; TWDR = TWITransmitBuffer[TXBuffIndex++]; // Load data to transmit buffer TWISendTransmit(); // Send the data } else // Otherwise, just send the normal start signal to begin transmission. { TWIInfo.mode = Initializing; TWISendStart(); } if(blocking){ // Wait until ready while (!isTWIReady()){_delay_us(1);} } }
void matrix_scan_kb(void) { #ifdef WATCHDOG_ENABLE wdt_reset(); #endif #ifdef ISSI_ENABLE // switch/underglow lighting update static uint32_t issi_device = 0; static uint32_t twi_last_ready = 0; if(twi_last_ready > 1000){ // Its been way too long since the last ISSI update, reset the I2C bus and start again xprintf("TWI failed to recover, TWI re-init\n"); twi_last_ready = 0; TWIInit(); force_issi_refresh(); } if(isTWIReady()){ twi_last_ready = 0; // If the i2c bus is available, kick off the issi update, alternate between devices update_issi(issi_device, issi_device); if(issi_device){ issi_device = 0; }else{ issi_device = 3; } }else{ twi_last_ready++; } #endif matrix_scan_user(); }
void matrix_scan_kb(void) { #ifdef WATCHDOG_ENABLE wdt_reset(); #endif #ifdef ISSI_ENABLE // switch/underglow lighting update static uint32_t issi_device = 0; static uint32_t twi_last_ready = 0; if(twi_last_ready > 1000){ // Its been way too long since the last ISSI update, reset the I2C bus and start again dprintf("TWI failed to recover, TWI re-init\n"); twi_last_ready = 0; TWIInit(); force_issi_refresh(); } if(isTWIReady()){ twi_last_ready = 0; // If the i2c bus is available, kick off the issi update, alternate between devices update_issi(issi_device, issi_device); if(issi_device){ issi_device = 0; }else{ issi_device = 3; } }else{ twi_last_ready++; } #endif // Update layer indicator LED // // Not sure how else to reliably do this... TMK has the 'hook_layer_change' // but can't find QMK equiv static uint32_t layer_indicator = -1; if(layer_indicator != layer_state){ for(uint32_t i=0;; i++){ // the layer_info list should end with layer 0xFFFFFFFF // it will break this out of the loop and define the unknown layer color if((layer_info[i].layer == (layer_state & layer_info[i].mask)) || (layer_info[i].layer == 0xFFFFFFFF)){ OCR1A = layer_info[i].color.red; OCR1B = layer_info[i].color.green; OCR1C = layer_info[i].color.blue; layer_indicator = layer_state; break; } } } matrix_scan_user(); }
uint8_t TWITransmitData(void *const TXdata, uint8_t dataLen, uint8_t repStart) { if (dataLen <= TXMAXBUFLEN) { // Wait until ready while (!isTWIReady()) {_delay_us(1);} // Set repeated start mode TWIInfo.repStart = repStart; // Copy data into the transmit buffer uint8_t *data = (uint8_t *)TXdata; for (int i = 0; i < dataLen; i++) { TWITransmitBuffer[i] = data[i]; } // Copy transmit info to global variables TXBuffLen = dataLen; TXBuffIndex = 0; // If a repeated start has been sent, then devices are already listening for an address // and another start does not need to be sent. if (TWIInfo.mode == RepeatedStartSent) { TWIInfo.mode = Initializing; TWDR = TWITransmitBuffer[TXBuffIndex++]; // Load data to transmit buffer TWISendTransmit(); // Send the data } else // Otherwise, just send the normal start signal to begin transmission. { TWIInfo.mode = Initializing; TWISendStart(); } } else { return 1; // return an error if data length is longer than buffer } return 0; }