Added RAK4631 e-ink display support
This commit is contained in:
		
							parent
							
								
									f3558b66fc
								
							
						
					
					
						commit
						055083ffba
					
				
							
								
								
									
										17
									
								
								Bluetooth.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Bluetooth.h
									
									
									
									
									
								
							| @ -13,12 +13,6 @@ | |||||||
| // 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 <https://www.gnu.org/licenses/>.
 | // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||||
| 
 | 
 | ||||||
| #if MCU_VARIANT == MCU_ESP32 |  | ||||||
|    |  | ||||||
| 
 |  | ||||||
| #elif MCU_VARIANT == MCU_NRF52 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if MCU_VARIANT == MCU_ESP32 | #if MCU_VARIANT == MCU_ESP32 | ||||||
|   #if HAS_BLUETOOTH == true |   #if HAS_BLUETOOTH == true | ||||||
|     #include "BluetoothSerial.h" |     #include "BluetoothSerial.h" | ||||||
| @ -265,6 +259,8 @@ void bt_disable_pairing() { | |||||||
| 
 | 
 | ||||||
| void bt_pairing_complete(uint16_t conn_handle, uint8_t auth_status) { | void bt_pairing_complete(uint16_t conn_handle, uint8_t auth_status) { | ||||||
|     if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS) { |     if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS) { | ||||||
|  |       bt_state = BT_STATE_CONNECTED; | ||||||
|  |       cable_state = CABLE_STATE_DISCONNECTED; | ||||||
|       bt_disable_pairing(); |       bt_disable_pairing(); | ||||||
|     } else { |     } else { | ||||||
|       bt_ssp_pin = 0; |       bt_ssp_pin = 0; | ||||||
| @ -285,11 +281,6 @@ bool bt_passkey_callback(uint16_t conn_handle, uint8_t const passkey[6], bool ma | |||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void bt_connect_callback(uint16_t conn_handle) { |  | ||||||
|     bt_state = BT_STATE_CONNECTED; |  | ||||||
|     cable_state = CABLE_STATE_DISCONNECTED; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void bt_disconnect_callback(uint16_t conn_handle, uint8_t reason) { | void bt_disconnect_callback(uint16_t conn_handle, uint8_t reason) { | ||||||
|     bt_state = BT_STATE_ON; |     bt_state = BT_STATE_ON; | ||||||
| } | } | ||||||
| @ -308,10 +299,9 @@ bool bt_setup_hw() { | |||||||
|     Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); |     Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); | ||||||
|     Bluefruit.autoConnLed(false); |     Bluefruit.autoConnLed(false); | ||||||
|     if (Bluefruit.begin()) { |     if (Bluefruit.begin()) { | ||||||
|       Bluefruit.setTxPower(4);    // Check bluefruit.h for supported values
 |       Bluefruit.setTxPower(8);    // Check bluefruit.h for supported values
 | ||||||
|       Bluefruit.Security.setIOCaps(true, true, false); |       Bluefruit.Security.setIOCaps(true, true, false); | ||||||
|       Bluefruit.Security.setPairPasskeyCallback(bt_passkey_callback); |       Bluefruit.Security.setPairPasskeyCallback(bt_passkey_callback); | ||||||
|       Bluefruit.Periph.setConnectCallback(bt_connect_callback); |  | ||||||
|       Bluefruit.Periph.setDisconnectCallback(bt_disconnect_callback); |       Bluefruit.Periph.setDisconnectCallback(bt_disconnect_callback); | ||||||
|       Bluefruit.Security.setPairCompleteCallback(bt_pairing_complete); |       Bluefruit.Security.setPairCompleteCallback(bt_pairing_complete); | ||||||
|       const ble_gap_addr_t gap_addr = Bluefruit.getAddr(); |       const ble_gap_addr_t gap_addr = Bluefruit.getAddr(); | ||||||
| @ -348,7 +338,6 @@ void bt_start() { | |||||||
| 
 | 
 | ||||||
|     blebas.begin(); |     blebas.begin(); | ||||||
| 
 | 
 | ||||||
|     // non-connectable advertising
 |  | ||||||
|     Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); |     Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); | ||||||
|     Bluefruit.Advertising.addTxPower(); |     Bluefruit.Advertising.addTxPower(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								Boards.h
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Boards.h
									
									
									
									
									
								
							| @ -43,6 +43,10 @@ | |||||||
|   #define BOARD_GENERIC_NRF52 0x50 |   #define BOARD_GENERIC_NRF52 0x50 | ||||||
|   #define BOARD_RAK4631       0x51 |   #define BOARD_RAK4631       0x51 | ||||||
| 
 | 
 | ||||||
|  |   #define OLED 0x01 | ||||||
|  |   #define EINK_BW 0x02 | ||||||
|  |   #define EINK_3C 0x03 | ||||||
|  | 
 | ||||||
|   #if defined(__AVR_ATmega1284P__) |   #if defined(__AVR_ATmega1284P__) | ||||||
|     #define PLATFORM PLATFORM_AVR |     #define PLATFORM PLATFORM_AVR | ||||||
|     #define MCU_VARIANT MCU_1284P |     #define MCU_VARIANT MCU_1284P | ||||||
| @ -147,6 +151,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_TBEAM |     #elif BOARD_MODEL == BOARD_TBEAM | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_PMU true |       #define HAS_PMU true | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
| @ -184,6 +189,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_LORA32_V1_0 |     #elif BOARD_MODEL == BOARD_LORA32_V1_0 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
|       #define HAS_CONSOLE true |       #define HAS_CONSOLE true | ||||||
| @ -201,6 +207,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_LORA32_V2_0 |     #elif BOARD_MODEL == BOARD_LORA32_V2_0 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
|       #define HAS_CONSOLE true |       #define HAS_CONSOLE true | ||||||
| @ -218,6 +225,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_LORA32_V2_1 |     #elif BOARD_MODEL == BOARD_LORA32_V2_1 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
|       #define HAS_PMU true |       #define HAS_PMU true | ||||||
| @ -239,6 +247,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_HELTEC32_V2 |     #elif BOARD_MODEL == BOARD_HELTEC32_V2 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_CONSOLE true |       #define HAS_CONSOLE true | ||||||
|       #define HAS_EEPROM true |       #define HAS_EEPROM true | ||||||
| @ -292,6 +301,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_RNODE_NG_20 |     #elif BOARD_MODEL == BOARD_RNODE_NG_20 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_NP true |       #define HAS_NP true | ||||||
|       #define HAS_CONSOLE true |       #define HAS_CONSOLE true | ||||||
| @ -312,6 +322,7 @@ | |||||||
| 
 | 
 | ||||||
|     #elif BOARD_MODEL == BOARD_RNODE_NG_21 |     #elif BOARD_MODEL == BOARD_RNODE_NG_21 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_BLUETOOTH true |       #define HAS_BLUETOOTH true | ||||||
|       #define HAS_CONSOLE true |       #define HAS_CONSOLE true | ||||||
|       #define HAS_PMU true |       #define HAS_PMU true | ||||||
| @ -346,6 +357,7 @@ | |||||||
|       #define HAS_TCXO true |       #define HAS_TCXO true | ||||||
| 
 | 
 | ||||||
|       #define HAS_DISPLAY true |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY OLED | ||||||
|       #define HAS_CONSOLE false |       #define HAS_CONSOLE false | ||||||
|       #define HAS_BLUETOOTH false |       #define HAS_BLUETOOTH false | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
| @ -397,11 +409,12 @@ | |||||||
|   #elif MCU_VARIANT == MCU_NRF52 |   #elif MCU_VARIANT == MCU_NRF52 | ||||||
|     #if BOARD_MODEL == BOARD_RAK4631 |     #if BOARD_MODEL == BOARD_RAK4631 | ||||||
|       #define HAS_EEPROM false |       #define HAS_EEPROM false | ||||||
|       #define HAS_DISPLAY false |       #define HAS_DISPLAY true | ||||||
|  |       #define DISPLAY EINK_3C | ||||||
|       #define HAS_BLUETOOTH false |       #define HAS_BLUETOOTH false | ||||||
|       #define HAS_BLE true |       #define HAS_BLE true | ||||||
|       #define HAS_CONSOLE false |       #define HAS_CONSOLE false | ||||||
|       #define HAS_PMU false |       #define HAS_PMU true | ||||||
|       #define HAS_NP false |       #define HAS_NP false | ||||||
|       #define HAS_SD false |       #define HAS_SD false | ||||||
|       #define HAS_TCXO true |       #define HAS_TCXO true | ||||||
| @ -425,6 +438,13 @@ | |||||||
|       const int pin_miso = 45; |       const int pin_miso = 45; | ||||||
|       const int pin_busy = 46; |       const int pin_busy = 46; | ||||||
|       const int pin_dio = 47; |       const int pin_dio = 47; | ||||||
|  | 
 | ||||||
|  |       const int pin_disp_cs = SS; | ||||||
|  |       const int pin_disp_dc = WB_IO1; | ||||||
|  |       const int pin_disp_reset = -1; | ||||||
|  |       const int pin_disp_busy = WB_IO4; | ||||||
|  |       const int pin_disp_en = WB_IO2; | ||||||
|  | 
 | ||||||
|       const int pin_led_rx = LED_BLUE; |       const int pin_led_rx = LED_BLUE; | ||||||
|       const int pin_led_tx = LED_GREEN; |       const int pin_led_tx = LED_GREEN; | ||||||
|       const int pin_tcxo_enable = -1; |       const int pin_tcxo_enable = -1; | ||||||
|  | |||||||
							
								
								
									
										1674
									
								
								Graphics.h
									
									
									
									
									
								
							
							
						
						
									
										1674
									
								
								Graphics.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										95
									
								
								Power.h
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								Power.h
									
									
									
									
									
								
							| @ -44,6 +44,26 @@ | |||||||
|   int bat_charged_samples = 0; |   int bat_charged_samples = 0; | ||||||
|   bool bat_voltage_dropping = false; |   bool bat_voltage_dropping = false; | ||||||
|   float bat_delay_v = 0; |   float bat_delay_v = 0; | ||||||
|  | #elif BOARD_MODEL == BOARD_RAK4631 | ||||||
|  | #include "nrfx_power.h" | ||||||
|  | #define BAT_C_SAMPLES   7 | ||||||
|  | #define BAT_D_SAMPLES   2 | ||||||
|  | #define BAT_V_MIN       2.75 | ||||||
|  | #define BAT_V_MAX       4.2 | ||||||
|  | #define BAT_V_FLOAT     4.22 | ||||||
|  | #define BAT_SAMPLES     5 | ||||||
|  | #define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12 - bit ADC resolution = 3000mV / 4096
 | ||||||
|  | #define VBAT_DIVIDER_COMP (1.73)      // Compensation factor for the VBAT divider
 | ||||||
|  | #define VBAT_MV_PER_LSB_FIN (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) | ||||||
|  | #define PIN_VBAT WB_A0 | ||||||
|  | float bat_p_samples[BAT_SAMPLES]; | ||||||
|  | float bat_v_samples[BAT_SAMPLES]; | ||||||
|  | uint8_t bat_samples_count = 0; | ||||||
|  | int bat_discharging_samples = 0; | ||||||
|  | int bat_charging_samples = 0; | ||||||
|  | int bat_charged_samples = 0; | ||||||
|  | bool bat_voltage_dropping = false; | ||||||
|  | float bat_delay_v = 0; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| uint32_t last_pmu_update = 0; | uint32_t last_pmu_update = 0; | ||||||
| @ -193,6 +213,66 @@ void measure_battery() { | |||||||
|     else { |     else { | ||||||
|       battery_ready = false; |       battery_ready = false; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |   #elif BOARD_MODEL == BOARD_RAK4631 | ||||||
|  |     battery_installed = true; | ||||||
|  |     battery_indeterminate = false; | ||||||
|  | 
 | ||||||
|  |     bat_v_samples[bat_samples_count%BAT_SAMPLES] = (float)(analogRead(PIN_VBAT)) * VBAT_MV_PER_LSB_FIN; | ||||||
|  | 
 | ||||||
|  |     if (bat_v_samples[bat_samples_count%BAT_SAMPLES] < 3300) { | ||||||
|  |         bat_p_samples[bat_samples_count%BAT_SAMPLES] = 0; | ||||||
|  |     } | ||||||
|  |     else if (bat_v_samples[bat_samples_count%BAT_SAMPLES] < 3600) | ||||||
|  |     { | ||||||
|  |         bat_v_samples[bat_samples_count%BAT_SAMPLES] -= 3300; | ||||||
|  |         bat_p_samples[bat_samples_count%BAT_SAMPLES] = bat_v_samples[bat_samples_count%BAT_SAMPLES] / 30; | ||||||
|  |     } else { | ||||||
|  |         bat_v_samples[bat_samples_count%BAT_SAMPLES] -= 3600; | ||||||
|  |     } | ||||||
|  |     bat_p_samples[bat_samples_count%BAT_SAMPLES] = 10 + (bat_v_samples[bat_samples_count%BAT_SAMPLES] * 0.15F); | ||||||
|  | 
 | ||||||
|  |     bat_samples_count++; | ||||||
|  |     if (!battery_ready && bat_samples_count >= BAT_SAMPLES) { | ||||||
|  |       battery_ready = true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     battery_percent = 0; | ||||||
|  |     for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { | ||||||
|  |         battery_percent += bat_p_samples[bi]; | ||||||
|  |     } | ||||||
|  |     battery_percent = battery_percent/BAT_SAMPLES; | ||||||
|  | 
 | ||||||
|  |     battery_voltage = 0; | ||||||
|  |     for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { | ||||||
|  |         battery_voltage += bat_v_samples[bi]; | ||||||
|  |     } | ||||||
|  |     battery_voltage = battery_voltage/BAT_SAMPLES; | ||||||
|  | 
 | ||||||
|  |     if (bat_delay_v == 0) bat_delay_v = battery_voltage; | ||||||
|  |     if (battery_percent > 100.0) battery_percent = 100.0; | ||||||
|  |     if (battery_percent < 0.0) battery_percent = 0.0; | ||||||
|  | 
 | ||||||
|  |     if (bat_samples_count%BAT_SAMPLES == 0) { | ||||||
|  |         if (battery_voltage < bat_delay_v && battery_voltage < BAT_V_FLOAT) { | ||||||
|  |             bat_voltage_dropping = true; | ||||||
|  |         } else { | ||||||
|  |             bat_voltage_dropping = false; | ||||||
|  |         } | ||||||
|  |         bat_samples_count = 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     nrfx_power_usb_state_t usbstate = nrfx_power_usbstatus_get(); | ||||||
|  |     if (usbstate == NRFX_POWER_USB_STATE_CONNECTED || usbstate == NRFX_POWER_USB_STATE_READY) { | ||||||
|  |         // charging
 | ||||||
|  |         battery_state = BATTERY_STATE_CHARGING; | ||||||
|  |     } else { | ||||||
|  |         battery_state = BATTERY_STATE_DISCHARGING; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (battery_percent >= 98) { | ||||||
|  |         battery_state = BATTERY_STATE_CHARGED; | ||||||
|  |     } | ||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|   if (battery_ready) { |   if (battery_ready) { | ||||||
| @ -341,6 +421,21 @@ bool init_pmu() { | |||||||
|     PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); |     PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); | ||||||
| 
 | 
 | ||||||
|     return true;  |     return true;  | ||||||
|  |   #elif BOARD_MODEL == BOARD_RAK4631 | ||||||
|  |     // board doesn't have PMU but we can measure batt voltage
 | ||||||
|  | 
 | ||||||
|  |     // prep ADC for reading battery level
 | ||||||
|  |     analogReference(AR_INTERNAL_3_0); | ||||||
|  | 
 | ||||||
|  |     // Set the resolution to 12-bit (0..4095)
 | ||||||
|  |     analogReadResolution(12); | ||||||
|  | 
 | ||||||
|  |     // Let the ADC settle
 | ||||||
|  |     delay(1); | ||||||
|  | 
 | ||||||
|  |     // Get a single ADC sample and throw it away
 | ||||||
|  |     float raw = analogRead(PIN_VBAT); | ||||||
|  |     return true; | ||||||
|   #else |   #else | ||||||
|     return false; |     return false; | ||||||
|   #endif |   #endif | ||||||
|  | |||||||
| @ -166,6 +166,11 @@ void setup() { | |||||||
|       eeprom_update(eeprom_addr(ADDR_CONF_DSET), CONF_OK_BYTE); |       eeprom_update(eeprom_addr(ADDR_CONF_DSET), CONF_OK_BYTE); | ||||||
|       eeprom_update(eeprom_addr(ADDR_CONF_DINT), 0xFF); |       eeprom_update(eeprom_addr(ADDR_CONF_DINT), 0xFF); | ||||||
|     } |     } | ||||||
|  |     #if DISPLAY == EINK_BW || DISPLAY == EINK_3C | ||||||
|  |     // Poll and process incoming serial commands whilst e-ink display is
 | ||||||
|  |     // refreshing to make device still seem responsive
 | ||||||
|  |     display_add_callback(process_serial); | ||||||
|  |     #endif | ||||||
|     disp_ready = display_init(); |     disp_ready = display_init(); | ||||||
|     update_display(); |     update_display(); | ||||||
|   #endif |   #endif | ||||||
| @ -1310,6 +1315,11 @@ void loop() { | |||||||
|   #endif |   #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void process_serial() { | ||||||
|  |       buffer_serial(); | ||||||
|  |       if (!fifo_isempty(&serialFIFO)) serial_poll(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void sleep_now() { | void sleep_now() { | ||||||
|   #if HAS_SLEEP == true |   #if HAS_SLEEP == true | ||||||
|     #if BOARD_MODEL == BOARD_RNODE_NG_22 |     #if BOARD_MODEL == BOARD_RNODE_NG_22 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user