nmrr 2 лет назад
Родитель
Сommit
82a8f157b5

+ 28 - 3
README.md

@@ -55,12 +55,16 @@ The program will automatically be launched after compilation
 
 **A4** GPIO can be connected on **A7** GPIO to test this application without using a geiger tube. **A4** GPIO is generating a signal whose frequency changes every second.
 
-Press **Ok** button to clear the graph, press **Left/Right** to choose unit (cpm, μSv/h, mSv/y, Rad/h, mRad/h, uRad/h), press **Back** button to quit
+Button assignments : 
 
+**Ok** [long press] : clear the graph
+**Left/Right** [short press] : choose right unit (cpm, μSv/h, mSv/y, Rad/h, mRad/h, uRad/h), **cps** is always displayed
+**Up/Down** [short press] : zoom / unzoom 
+**Back** [long press] : exit
 
-If you don't want to build this application, just simply copy **flipper_geiger.fap** on your **Flipper Zero** 
 
-**API Mismatch** error may appear. If you are using Unleashed firmware you can bypass and ignore the error
+If you don't want to build this application, just simply copy **flipper_geiger.fap** on your **Flipper Zero** 
+Build has been made with official toolchain, **API Mismatch** error may appear if you are using custom firmware. You can bypass this error.
 
 ## Use cases
 
@@ -98,6 +102,23 @@ Measure of americium-241 button from a smoke detector :
 
 <img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/flipper7.png" width=25% height=25%>
 
+Zoom levels (the third picture is the default zoom) :
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/zoom0.png" width=25% height=25%>
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/zoom1.png" width=25% height=25%>
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/zoom2.png" width=25% height=25%>
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/zoom3.png" width=25% height=25%>
+
+## User gallery
+
+[BRD8 [Reddit]](https://www.reddit.com/user/BRD8/) https://www.reddit.com/r/flipperzero/comments/110062z/am_i_a_hacker_now_mom/ : 
+
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/user/abQXuEz.jpg" width=25% height=25%>
+
+[Funbob235 [Reddit]](https://www.reddit.com/user/Funbob235/) https://www.reddit.com/r/flipperzero/comments/13m1qly/testing_of_the_geiger_counter/ : 
+
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/user/abQXuEz.jpg" width=25% height=25%>
+
+
 ## What's next ?
 
 Here are some nice ideas to improve this app :
@@ -109,6 +130,10 @@ Here are some nice ideas to improve this app :
 
 ## Changelog
 
+* 2023-06-25
+  * Add zoom levels
+  * User gallery has been added
+
 * 2023-06-08
   * Bug fixing
 

BIN
flipper_geiger.fap


+ 1 - 1
flipper_geiger/application.fam

@@ -7,7 +7,7 @@ App(
     requires=[
         "gui",
     ],
-    stack_size=1 * 1024,
+    stack_size=2 * 1024,
     fap_icon="geiger.png",
     fap_category="Tools",
 )

+ 59 - 11
flipper_geiger/flipper_geiger.c

@@ -28,12 +28,15 @@ typedef struct {
     InputEvent input;
 } EventApp;
 
+#define lineArraySize 128
+
 typedef struct {
     FuriMutex* mutex;
     uint32_t cps, cpm;
-    uint32_t line[SCREEN_SIZE_X/2];
+    uint32_t line[lineArraySize];
     float coef;
     uint8_t data;
+    uint8_t zoom;
 } mutexStruct;
 
 static void draw_callback(Canvas* canvas, void* ctx) 
@@ -54,12 +57,39 @@ static void draw_callback(Canvas* canvas, void* ctx)
     else if (mutexDraw.data == 4) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f mR/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR)/(double)10);
     else snprintf(buffer, sizeof(buffer), "%ld cps - %.2f uR/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR)*(double)100);
 
-    for (int i=0;i<SCREEN_SIZE_X;i+=2)
+
+    if (mutexDraw.zoom == 0)
     {
-        float Y = SCREEN_SIZE_Y-(mutexDraw.line[i/2]*mutexDraw.coef);
+        for (int i=0;i<SCREEN_SIZE_X;i+=8)
+        {
+            float Y = SCREEN_SIZE_Y-(mutexDraw.line[i/8]*mutexDraw.coef);
+            for (int j=0;j<8;j++)canvas_draw_line(canvas, i+j, Y, i+j, SCREEN_SIZE_Y);
+        }
+    }
+    else if (mutexDraw.zoom == 1)
+    {
+        for (int i=0;i<SCREEN_SIZE_X;i+=4)
+        {
+            float Y = SCREEN_SIZE_Y-(mutexDraw.line[i/4]*mutexDraw.coef);
+            for (int j=0;j<4;j++)canvas_draw_line(canvas, i+j, Y, i+j, SCREEN_SIZE_Y);
+        }
+    }
+    else if (mutexDraw.zoom == 2)
+    {
+        for (int i=0;i<SCREEN_SIZE_X;i+=2)
+        {
+            float Y = SCREEN_SIZE_Y-(mutexDraw.line[i/2]*mutexDraw.coef);
+            for (int j=0;j<2;j++)canvas_draw_line(canvas, i+j, Y, i+j, SCREEN_SIZE_Y);
+        }
+    }
+    else if (mutexDraw.zoom == 3)
+    {
+        for (int i=0;i<SCREEN_SIZE_X;i++)
+        {
+            float Y = SCREEN_SIZE_Y-(mutexDraw.line[i]*mutexDraw.coef);
 
-        canvas_draw_line(canvas, i, Y, i, SCREEN_SIZE_Y);
-        canvas_draw_line(canvas, i+1, Y, i+1, SCREEN_SIZE_Y);
+            canvas_draw_line(canvas, i, Y, i, SCREEN_SIZE_Y);
+        }
     }
 
     canvas_set_font(canvas, FontPrimary);
@@ -106,9 +136,10 @@ int32_t flipper_geiger_app()
     mutexStruct mutexVal;
     mutexVal.cps = 0;
     mutexVal.cpm = 0;
-    for (int i=0;i<SCREEN_SIZE_X/2;i++) mutexVal.line[i] = 0;
+    for (int i=0;i<lineArraySize;i++) mutexVal.line[i] = 0;
     mutexVal.coef = 1;
     mutexVal.data = 0;
+    mutexVal.zoom = 2;
 
     uint32_t counter = 0;
 
@@ -143,18 +174,18 @@ int32_t flipper_geiger_app()
         {   
             if(event.type == EventTypeInput) 
             {
-                if(event.input.key == InputKeyBack) 
+                if(event.input.key == InputKeyBack && event.input.type == InputTypeLong) 
                 {
                     break;
                 }
-                else if(event.input.key == InputKeyOk && event.input.type == InputTypeShort)
+                else if(event.input.key == InputKeyOk && event.input.type == InputTypeLong)
                 {
                     counter = 0;
                     furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
 
                     mutexVal.cps = 0;
                     mutexVal.cpm = 0;
-                    for (int i=0;i<SCREEN_SIZE_X/2;i++) mutexVal.line[i] = 0;
+                    for (int i=0;i<lineArraySize;i++) mutexVal.line[i] = 0;
 
                     screenRefresh = 1;
                     furi_mutex_release(mutexVal.mutex);
@@ -176,6 +207,23 @@ int32_t flipper_geiger_app()
                     if (mutexVal.data != 5) mutexVal.data++;
                     else mutexVal.data = 0;
 
+                    screenRefresh = 1;
+                    furi_mutex_release(mutexVal.mutex);
+                }
+                else if((event.input.key == InputKeyUp && event.input.type == InputTypeShort))
+                {
+                    furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
+                    if (mutexVal.zoom != 0) mutexVal.zoom--;
+
+                    screenRefresh = 1;
+                    furi_mutex_release(mutexVal.mutex);
+
+                }
+                else if((event.input.key == InputKeyDown && event.input.type == InputTypeShort))
+                {
+                    furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
+                    if (mutexVal.zoom != 3) mutexVal.zoom++;
+
                     screenRefresh = 1;
                     furi_mutex_release(mutexVal.mutex);
                 }
@@ -184,7 +232,7 @@ int32_t flipper_geiger_app()
             {
                 furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
 
-                for (int i=0;i<SCREEN_SIZE_X/2-1;i++) mutexVal.line[SCREEN_SIZE_X/2-1-i] = mutexVal.line[SCREEN_SIZE_X/2-2-i]; 
+                for (int i=0;i<lineArraySize-1;i++) mutexVal.line[lineArraySize-1-i] = mutexVal.line[lineArraySize-2-i]; 
 
                 mutexVal.line[0] = counter;
                 mutexVal.cps = counter;
@@ -192,7 +240,7 @@ int32_t flipper_geiger_app()
 
                 mutexVal.cpm = mutexVal.line[0];
                 uint32_t max = mutexVal.line[0];
-                for (int i=1;i<SCREEN_SIZE_X/2;i++)
+                for (int i=1;i<lineArraySize;i++)
                 {
                     if (i < 60) mutexVal.cpm += mutexVal.line[i];
                     if (mutexVal.line[i] > max) max = mutexVal.line[i];

BIN
img/user/abQXuEz.jpg


BIN
img/user/testing-of-the-geiger-counter-v0-3zv9gdq4nt0b1.jpg