Skip to content

Commit e4900b0

Browse files
committed
2.1beta3
1 parent 4c93bc8 commit e4900b0

33 files changed

+388
-318
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ With Rad Pro, you can:
3333

3434
## Acknowledgements
3535

36-
* Rad Pro's user interface is based on the [OpenBridge 5.0](https://www.openbridge.no/) design system.
36+
* Rad Pro's user interface is based on the industry-standard [OpenBridge 5.0](https://www.openbridge.no/) design system.
3737
* Thanks to `Alfred90`, `danielhahn76`, `felixsteghofer`, `DG0MG`, `murkle`, `cromagn`, `ivohar`,`mryndzionek`, `JantarX`, `mizsha`, `Tig3rch3n`, `Arparela`, `w01fdev`, `martin-machacek`, `dsl71`, `Davegsm82`, `alfmck`, `jonwhite227`, `dc1rdb`, `ihrapsa` and many others who helped with device testing and suggestions.
3838
* Thanks to `pixitha` for the FS2011/GD32F150 board photos with a J305 Geiger tube, `felixsteghofer` for the FS2011/GD32F103 board photos, `DG0MG` for the Bosean FS-600 board photos, `murkle` for the Bosean FS-1000 board photos, `ivohar` for the FNIRSCI GC-01 schematics and `oOblik` for the Bosean FS-5000 board photos.

RELEASES.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@
44

55
Updates:
66

7-
* Added the ability to dismiss alarms using the reset measurement key.
87
* Introduced an alarm enabled indicator.
9-
* Added options for higher rate and dose alarms.
8+
* Added configurable alarm options for audible, haptic and visual-only notifications.
9+
* Added the ability to dismiss alarms using the reset measurement key.
10+
* Added options for setting higher rate and dose alarms.
1011
* Extended the duration of alarm sounds.
1112
* Implemented a lock mode accesible from Settings.
12-
* Display of dose counts below 10000 now uses standard notation for clarity.
13-
* Enhanced the menu structure for improved navigation.
14-
* Updated the UI font to Open Sans to enhance readability.
13+
* Display of dose counts below 10000 now uses standard notation.
14+
* Enhanced the menu structure for more intuitive navigation.
15+
* Updated the UI font to Open Sans for enhanced readability.
1516
* Minor UI improvements.
1617

1718
Fixes:
1819

1920
* On color displays, fixed an issue causing an unsightly flash when waking from sleep mode.
20-
* On the FNIRSI GC-01, corrected random pixel issues during the splash screen.
21+
* On the FNIRSI GC-01, resolved random pixel issues during the splash screen.
2122
* Fixed alarms continuing to sound after device shutdown while connected to external power.
23+
* Corrected the display of secondary rate and count views after the average timer expired.
2224
* Resolved an issue where the device state wasn't reset after a quick power cycle.
2325
* Corrected a problem where 60-second instantaneous averaging at high radiation levels didn't average correctly over the full seconds.
2426

docs/manual.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@
33
## Features
44

55
* Measurement view with large digits, ideal for field application.
6+
* Configurable pulse indication with optional thresholding: audible (off, clicks, beeps), pulse LED (on supported devices), display flashes (on display sleep) and haptic (on supported devices).
7+
* Configurable alarm notifications: audible, haptic and visual-only.
8+
* Ability to dismiss alarms.
9+
* Tube fault alarm.
10+
* Multiple measurement units: Sievert, rem, cpm (counts per minute), cps (counts per second).
611
* Configurable instantaneous rate averaging (adaptive fast, adaptive precision, 60 seconds, 30 seconds and 10 seconds),
712
* Configurable averaging for performing surveys.
8-
* Multiple measurement units: Sievert, rem, cpm (counts per minute), cps (counts per second).
9-
* Offline and live data logging with data compression.
10-
* Compatibility with the [GeigerLog](https://github.com/Gissio/geigerlog-radpro) data logging software.
11-
* Configurable pulse indication with optional thresholding: pulse clicks (off, clicks, beeps), pulse LED (on supported devices), display flashes (on display sleep) and haptic pulses (on supported devices).
12-
* Dead-time measurement.
1313
* Customizable Geiger-Müller tube settings: conversion factor, dead-time compensation, background compensation, high voltage generator PWM frequency and duty cycle (on supported devices).
1414
* Preconfigured high voltage profiles (on supported devices).
15-
* Tube fault alarm.
15+
* Offline and live data logging with data compression.
16+
* Compatibility with the [GeigerLog](https://github.com/Gissio/geigerlog-radpro) data logging software.
1617
* Statistics for tracking device usage and state.
17-
* User interface based on the [OpenBridge 5.0](https://www.openbridge.no/) design system.
18+
* Geiger tube dead-time measurement.
19+
* Game: nuclear chess (on supported devices).
20+
* Lock mode.
21+
* User interface based on the industry-standard [OpenBridge 5.0](https://www.openbridge.no/) design system.
1822
* Anti-aliased text rendering on color screens.
1923
* `radpro-tool` for low-level access to the device from a computer.
2024
* Power-on self-test and safety watchdog.
21-
* Game: nuclear chess (on supported devices).
2225

2326
## Measurements
2427

platform.io/lib/mcu-renderer/mcu-renderer-ili9341.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* ILI9341 driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/

platform.io/lib/mcu-renderer/mcu-renderer-sdl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* SDL driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/

platform.io/lib/mcu-renderer/mcu-renderer-sdl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* SDL driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/

platform.io/lib/mcu-renderer/mcu-renderer-st7565.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* ST7565 driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/
@@ -82,28 +82,31 @@ void mr_st7565_set_display(mr_t *mr,
8282

8383
void mr_st7565_refresh_display(mr_t *mr)
8484
{
85+
mr_set_chipselect(mr, true);
86+
8587
for (int16_t pageIndex = 0;
8688
pageIndex < (mr->display_height / 8);
8789
pageIndex++)
8890
{
8991
// Send page address
90-
9192
mr_send_command(mr, MR_ST7565_PAGE_ADDRESS | pageIndex);
9293

9394
// Send column address
94-
9595
mr_send_command(mr, MR_ST7565_COLUMN_LSB | 0x00);
9696
mr_send_command(mr, MR_ST7565_COLUMN_MSB | 0x00);
9797

9898
// Send data
99-
10099
mr_set_command(mr, false);
101100
uint8_t *buffer = (uint8_t *)mr->buffer +
102101
mr->display_width * pageIndex;
103102

103+
mr_send_callback_t send = mr->send_callback;
104+
104105
for (int16_t i = 0;
105106
i < mr->display_width;
106107
i++)
107-
mr_send(mr, buffer[i]);
108+
send(buffer[i]);
108109
}
110+
111+
mr_set_chipselect(mr, false);
109112
}

platform.io/lib/mcu-renderer/mcu-renderer-st7565.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* ST7565 driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/

platform.io/lib/mcu-renderer/mcu-renderer-st7789.c

Lines changed: 68 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* ST7789 driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/
@@ -105,13 +105,13 @@ void mr_st7789_init(mr_t *mr,
105105
mr->send16_callback = send16_callback;
106106

107107
// Send initialization sequence
108-
109108
mr_send_sequence(mr, mr_st7789_init_sequence);
110109

111110
// Set rotation
112-
111+
mr_set_chipselect(mr, true);
113112
mr_send_command(mr, MR_ST7789_MADCTL);
114113
mr_send_data(mr, mr_st7789_madctl[rotation]);
114+
mr_set_chipselect(mr, false);
115115
}
116116

117117
void mr_st7789_set_display(mr_t *mr,
@@ -149,9 +149,14 @@ static void mr_st7789_send_addresses(mr_t *mr,
149149
mr_st7789_send_short(mr, end_address);
150150
}
151151

152-
static void mr_st7789_set_rectangle(mr_t *mr,
153-
const mr_rectangle_t *rectangle)
152+
static bool mr_st7789_setup_buffer(mr_t *mr,
153+
const mr_rectangle_t *rectangle)
154154
{
155+
if ((rectangle->width <= 0) || (rectangle->height <= 0))
156+
return false;
157+
158+
mr_set_chipselect(mr, true);
159+
155160
// Set column addresses
156161
mr_st7789_send_addresses(mr,
157162
MR_ST7789_CASET,
@@ -166,48 +171,59 @@ static void mr_st7789_set_rectangle(mr_t *mr,
166171

167172
// Write memory
168173
mr_send_command(mr, MR_ST7789_RAMWR);
174+
175+
// Prepare for data
169176
mr_set_command(mr, false);
177+
178+
return true;
170179
}
171180

172181
static void mr_st7789_draw_rectangle(mr_t *mr,
173182
const mr_rectangle_t *rectangle)
174183
{
175-
mr_st7789_set_rectangle(mr, rectangle);
184+
if (mr_st7789_setup_buffer(mr, rectangle))
185+
{
186+
mr_send_callback_t send16 = mr->send16_callback;
176187

177-
for (uint32_t i = 0;
178-
i < ((uint32_t)rectangle->width *
179-
(uint32_t)rectangle->height);
180-
i++)
181-
mr_send16(mr, mr->fill_color);
188+
for (uint32_t i = 0;
189+
i < ((uint32_t)rectangle->width *
190+
(uint32_t)rectangle->height);
191+
i++)
192+
send16(mr->fill_color);
193+
194+
mr_set_chipselect(mr, false);
195+
}
182196
}
183197

184198
#if defined(MCURENDERER_BITMAP_SUPPORT)
185199
static void mr_st7789_draw_bitmap(mr_t *mr,
186200
const mr_rectangle_t *rectangle,
187201
const uint8_t *bitmap)
188202
{
189-
mr_st7789_set_rectangle(mr, rectangle);
190-
191-
mr_point_t position;
192-
193-
for (position.y = rectangle->y;
194-
position.y < rectangle->y + rectangle->height;
195-
position.y++)
203+
if (mr_st7789_setup_buffer(mr, rectangle))
196204
{
197-
uint32_t source_index = 0;
205+
mr_send_callback_t send16 = mr->send16_callback;
198206

199-
for (position.x = rectangle->x;
200-
position.x < rectangle->x + rectangle->width;
201-
position.x++)
207+
mr_point_t position;
208+
for (position.y = rectangle->y;
209+
position.y < rectangle->y + rectangle->height;
210+
position.y++)
202211
{
203-
bool source_pixel = ((bitmap[source_index >> 3]) >> (source_index & 0b111)) & 0b1;
204-
source_index++;
205-
mr_color_t source_color = source_pixel ? mr->stroke_color : mr->fill_color;
206-
207-
mr_send16(mr, source_color);
212+
uint32_t source_index = 0;
213+
214+
for (position.x = rectangle->x;
215+
position.x < rectangle->x + rectangle->width;
216+
position.x++)
217+
{
218+
bool source_pixel = ((bitmap[source_index >> 3]) >> (source_index & 0b111)) & 0b1;
219+
source_index++;
220+
send16(source_pixel ? mr->stroke_color : mr->fill_color);
221+
}
222+
223+
bitmap += ((source_index + 7) >> 3);
208224
}
209225

210-
bitmap += ((source_index + 7) >> 3);
226+
mr_set_chipselect(mr, false);
211227
}
212228
}
213229
#endif
@@ -217,16 +233,17 @@ static void mr_st7789_draw_image(mr_t *mr,
217233
const mr_rectangle_t *rectangle,
218234
const mr_color_t *image)
219235
{
220-
mr_st7789_set_rectangle(mr, rectangle);
221-
222-
for (uint32_t i = 0;
223-
i < ((uint32_t)rectangle->width *
224-
(uint32_t)rectangle->height);
225-
i++)
236+
if (mr_st7789_setup_buffer(mr, rectangle))
226237
{
227-
mr_color_t source_color = *image++;
238+
mr_send_callback_t send16 = mr->send16_callback;
239+
240+
for (uint32_t i = 0;
241+
i < ((uint32_t)rectangle->width *
242+
(uint32_t)rectangle->height);
243+
i++)
244+
send16(*image++);
228245

229-
mr_send16(mr, source_color);
246+
mr_set_chipselect(mr, false);
230247
}
231248
}
232249
#endif
@@ -236,19 +253,23 @@ static void mr_st7789_draw_textbuffer(mr_t *mr,
236253
uint32_t buffer_pitch,
237254
mr_rectangle_t *rectangle)
238255
{
239-
mr_st7789_set_rectangle(mr, rectangle);
256+
if (mr_st7789_setup_buffer(mr, rectangle))
257+
{
258+
mr_send_callback_t send16 = mr->send16_callback;
240259

241-
mr_point_t position;
260+
mr_point_t position;
261+
for (position.y = 0;
262+
position.y < rectangle->height;
263+
position.y++)
264+
{
265+
for (position.x = 0;
266+
position.x < rectangle->width;
267+
position.x++)
268+
send16(mr->blend_table[buffer[position.x]]);
242269

243-
for (position.y = 0;
244-
position.y < rectangle->height;
245-
position.y++)
246-
{
247-
for (position.x = 0;
248-
position.x < rectangle->width;
249-
position.x++)
250-
mr_send16(mr, mr->blend_table[buffer[position.x]]);
270+
buffer += buffer_pitch;
271+
}
251272

252-
buffer += buffer_pitch;
273+
mr_set_chipselect(mr, false);
253274
}
254275
}

platform.io/lib/mcu-renderer/mcu-renderer-st7789.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* MCU renderer
33
* ST7789 driver
44
*
5-
* (C) 2023-2024 Gissio
5+
* (C) 2023-2025 Gissio
66
*
77
* License: MIT
88
*/

0 commit comments

Comments
 (0)