// CC0 1.0 Universal (CC0 1.0) // Public Domain Dedication // https://github.com/nmrr #include #include #include #include #include #include #include #include #define SCREEN_SIZE_X 128 #define SCREEN_SIZE_Y 64 // FOR J305 GEIGER TUBE #define CONVERSION_FACTOR 0.0081 typedef enum { EventTypeInput, ClockEventTypeTick, EventGPIO, } EventType; typedef struct { EventType type; InputEvent input; } EventApp; typedef struct { uint32_t cps, cpm; uint32_t line[SCREEN_SIZE_X/2]; float coef; uint8_t data; } mutexStruct; static void draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); mutexStruct displayStruct; mutexStruct* geigerMutex = (mutexStruct*)acquire_mutex_block((ValueMutex*)ctx); memcpy(&displayStruct, geigerMutex, sizeof(mutexStruct)); release_mutex((ValueMutex*)ctx, geigerMutex); char buffer[32]; if (displayStruct.data == 0) snprintf(buffer, sizeof(buffer), "%ld cps - %ld cpm", displayStruct.cps, displayStruct.cpm); else if (displayStruct.data == 1) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f uSv/h", displayStruct.cps, ((double)displayStruct.cpm*(double)CONVERSION_FACTOR)); else snprintf(buffer, sizeof(buffer), "%ld cps - %.2f mSv/y", displayStruct.cps, (((double)displayStruct.cpm*(double)CONVERSION_FACTOR))*(double)8.76); for (int i=0;icps = 0; geigerMutex->cpm = 0; for (int i=0;iline[i] = 0; screenRefresh = 1; release_mutex(&state_mutex, geigerMutex); } else if((event.input.key == InputKeyLeft && event.input.type == InputTypeShort)) { mutexStruct* geigerMutex = (mutexStruct*)acquire_mutex_block(&state_mutex); if (geigerMutex->data != 0) geigerMutex->data--; else geigerMutex->data = 2; screenRefresh = 1; release_mutex(&state_mutex, geigerMutex); } else if((event.input.key == InputKeyRight && event.input.type == InputTypeShort)) { mutexStruct* geigerMutex = (mutexStruct*)acquire_mutex_block(&state_mutex); if (geigerMutex->data != 2) geigerMutex->data++; else geigerMutex->data = 0; screenRefresh = 1; release_mutex(&state_mutex, geigerMutex); } } else if (event.type == ClockEventTypeTick) { mutexStruct* geigerMutex = (mutexStruct*)acquire_mutex_block(&state_mutex); for (int i=0;iline[SCREEN_SIZE_X/2-1-i] = geigerMutex->line[SCREEN_SIZE_X/2-2-i]; geigerMutex->line[0] = counter; geigerMutex->cps = counter; counter = 0; geigerMutex->cpm = geigerMutex->line[0]; uint32_t max = geigerMutex->line[0]; for (int i=1;icpm += geigerMutex->line[i]; if (geigerMutex->line[i] > max) max = geigerMutex->line[i]; } if (max > 0) geigerMutex->coef = ((float)(SCREEN_SIZE_Y-15))/((float)max); else geigerMutex->coef = 1; screenRefresh = 1; release_mutex(&state_mutex, geigerMutex); } else if (event.type == EventGPIO) { counter++; } } if (screenRefresh == 1) view_port_update(view_port); } furi_hal_power_disable_otg(); furi_hal_gpio_disable_int_callback(&gpio_ext_pa7); furi_hal_gpio_remove_int_callback(&gpio_ext_pa7); furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4); furi_message_queue_free(event_queue); delete_mutex(&state_mutex); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_timer_free(timer); furi_record_close(RECORD_GUI); return 0; }