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
 | ||||
| // 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 HAS_BLUETOOTH == true | ||||
|     #include "BluetoothSerial.h" | ||||
| @ -265,6 +259,8 @@ void bt_disable_pairing() { | ||||
| 
 | ||||
| void bt_pairing_complete(uint16_t conn_handle, uint8_t auth_status) { | ||||
|     if (auth_status == BLE_GAP_SEC_STATUS_SUCCESS) { | ||||
|       bt_state = BT_STATE_CONNECTED; | ||||
|       cable_state = CABLE_STATE_DISCONNECTED; | ||||
|       bt_disable_pairing(); | ||||
|     } else { | ||||
|       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; | ||||
| } | ||||
| 
 | ||||
| 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) { | ||||
|     bt_state = BT_STATE_ON; | ||||
| } | ||||
| @ -308,10 +299,9 @@ bool bt_setup_hw() { | ||||
|     Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); | ||||
|     Bluefruit.autoConnLed(false); | ||||
|     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.setPairPasskeyCallback(bt_passkey_callback); | ||||
|       Bluefruit.Periph.setConnectCallback(bt_connect_callback); | ||||
|       Bluefruit.Periph.setDisconnectCallback(bt_disconnect_callback); | ||||
|       Bluefruit.Security.setPairCompleteCallback(bt_pairing_complete); | ||||
|       const ble_gap_addr_t gap_addr = Bluefruit.getAddr(); | ||||
| @ -348,7 +338,6 @@ void bt_start() { | ||||
| 
 | ||||
|     blebas.begin(); | ||||
| 
 | ||||
|     // non-connectable advertising
 | ||||
|     Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); | ||||
|     Bluefruit.Advertising.addTxPower(); | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										24
									
								
								Boards.h
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Boards.h
									
									
									
									
									
								
							| @ -43,6 +43,10 @@ | ||||
|   #define BOARD_GENERIC_NRF52 0x50 | ||||
|   #define BOARD_RAK4631       0x51 | ||||
| 
 | ||||
|   #define OLED 0x01 | ||||
|   #define EINK_BW 0x02 | ||||
|   #define EINK_3C 0x03 | ||||
| 
 | ||||
|   #if defined(__AVR_ATmega1284P__) | ||||
|     #define PLATFORM PLATFORM_AVR | ||||
|     #define MCU_VARIANT MCU_1284P | ||||
| @ -147,6 +151,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_TBEAM | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_PMU true | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_BLE true | ||||
| @ -184,6 +189,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_LORA32_V1_0 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_BLE true | ||||
|       #define HAS_CONSOLE true | ||||
| @ -201,6 +207,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_LORA32_V2_0 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_BLE true | ||||
|       #define HAS_CONSOLE true | ||||
| @ -218,6 +225,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_LORA32_V2_1 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_BLE true | ||||
|       #define HAS_PMU true | ||||
| @ -239,6 +247,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_HELTEC32_V2 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_CONSOLE true | ||||
|       #define HAS_EEPROM true | ||||
| @ -292,6 +301,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_RNODE_NG_20 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_NP true | ||||
|       #define HAS_CONSOLE true | ||||
| @ -312,6 +322,7 @@ | ||||
| 
 | ||||
|     #elif BOARD_MODEL == BOARD_RNODE_NG_21 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_BLUETOOTH true | ||||
|       #define HAS_CONSOLE true | ||||
|       #define HAS_PMU true | ||||
| @ -346,6 +357,7 @@ | ||||
|       #define HAS_TCXO true | ||||
| 
 | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY OLED | ||||
|       #define HAS_CONSOLE false | ||||
|       #define HAS_BLUETOOTH false | ||||
|       #define HAS_BLE true | ||||
| @ -397,11 +409,12 @@ | ||||
|   #elif MCU_VARIANT == MCU_NRF52 | ||||
|     #if BOARD_MODEL == BOARD_RAK4631 | ||||
|       #define HAS_EEPROM false | ||||
|       #define HAS_DISPLAY false | ||||
|       #define HAS_DISPLAY true | ||||
|       #define DISPLAY EINK_3C | ||||
|       #define HAS_BLUETOOTH false | ||||
|       #define HAS_BLE true | ||||
|       #define HAS_CONSOLE false | ||||
|       #define HAS_PMU false | ||||
|       #define HAS_PMU true | ||||
|       #define HAS_NP false | ||||
|       #define HAS_SD false | ||||
|       #define HAS_TCXO true | ||||
| @ -425,6 +438,13 @@ | ||||
|       const int pin_miso = 45; | ||||
|       const int pin_busy = 46; | ||||
|       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_tx = LED_GREEN; | ||||
|       const int pin_tcxo_enable = -1; | ||||
|  | ||||
							
								
								
									
										1676
									
								
								Graphics.h
									
									
									
									
									
								
							
							
						
						
									
										1676
									
								
								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; | ||||
|   bool bat_voltage_dropping = false; | ||||
|   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 | ||||
| 
 | ||||
| uint32_t last_pmu_update = 0; | ||||
| @ -193,6 +213,66 @@ void measure_battery() { | ||||
|     else { | ||||
|       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 | ||||
| 
 | ||||
|   if (battery_ready) { | ||||
| @ -340,6 +420,21 @@ bool init_pmu() { | ||||
|     // Set the time of pressing the button to turn off
 | ||||
|     PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); | ||||
| 
 | ||||
|     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 | ||||
|     return false; | ||||
|  | ||||
| @ -166,6 +166,11 @@ void setup() { | ||||
|       eeprom_update(eeprom_addr(ADDR_CONF_DSET), CONF_OK_BYTE); | ||||
|       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(); | ||||
|     update_display(); | ||||
|   #endif | ||||
| @ -1310,6 +1315,11 @@ void loop() { | ||||
|   #endif | ||||
| } | ||||
| 
 | ||||
| void process_serial() { | ||||
|       buffer_serial(); | ||||
|       if (!fifo_isempty(&serialFIFO)) serial_poll(); | ||||
| } | ||||
| 
 | ||||
| void sleep_now() { | ||||
|   #if HAS_SLEEP == true | ||||
|     #if BOARD_MODEL == BOARD_RNODE_NG_22 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user