nmrr 2 лет назад
Родитель
Сommit
a4f9d84090
5 измененных файлов с 106 добавлено и 52 удалено
  1. 18 5
      README.md
  2. BIN
      flipper_geiger.fap
  3. 88 47
      flipper_geiger/flipper_geiger.c
  4. BIN
      img/dice.jpeg
  5. BIN
      img/version.png

+ 18 - 5
README.md

@@ -21,7 +21,7 @@ You also need jumper wires to connect the board on the **Flipper Zero**.
 - iodine-131 (beta & gamma)
 
 **Not really usable** radioactive sources: 
-- americium-241 (alpha & low gamma, some strong beta/gamma rays are emitted during radioactive cascade or due to the presence of radioisotope impurity)
+- americium-241 (alpha & low gamma, some strong beta/gamma rays are emitted during radioactive cascade or due to the presence of radioisotope impurities)
 - high purity metallic uranium/thorium (same as am241)
 
 
@@ -65,6 +65,7 @@ button  | function
 **Left/Right** *[short press]* | Choose right unit (cpm, μSv/h, mSv/y, Rad/h, mRad/h, uRad/h), **cps** on the left is always displayed
 **Up** *[long press]*  | Enable/disable recording, led of **Flipper Zero** is colored in red when recording
 **Up/Down** *[short press]*  | Zoom/unzoom 
+**Down** *[long press]*  | Display version of the application
 **Back** *[long press]*  | Exit
 
 If you don't want to build this application, just simply copy **flipper_geiger.fap** on your **Flipper Zero** 
@@ -99,7 +100,7 @@ Measure of uranium orange pottery:
 
 <img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/flipper10.png" width=25% height=25%>
 
-Measure of americium-241 button from a smoke detector (descendants of americium or radioisotope impurity are detected, not americium itself):
+Measure of americium-241 button from a smoke detector (descendants of americium or radioisotope impurities are detected, not americium itself):
 
 <img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/flipper11.png" width=25% height=25%>
 
@@ -111,6 +112,10 @@ 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%>
 
+Version of the application (press down button during 1 sec to display version):
+
+<img src="https://github.com/nmrr/flipperzero-geigercounter/blob/main/img/version.png" width=25% height=25%>
+
 ## Recording function
 
 Output **CSV** files are stored at the root of SD card. Date & time are set in the name file (example: **geiger-2023-07-03--23-48-15.csv**)
@@ -126,7 +131,7 @@ epoch  | cps
 4  | 9
 
 
-## User gallery
+## User gallery & video
 
 [BRD8 [Reddit]](https://www.reddit.com/user/BRD8/) - https://www.reddit.com/r/flipperzero/comments/110062z/am_i_a_hacker_now_mom/: 
 
@@ -140,17 +145,25 @@ epoch  | cps
 
 [![Watch the video](https://img.youtube.com/vi/JQB2jvY1oZ0/maxresdefault.jpg)](https://youtu.be/JQB2jvY1oZ0)
 
+[Boboso5676 [YouTube]](https://www.youtube.com/@boboso5676): 
+
+[![Watch the video](https://img.youtube.com/vi/jYQlC2NJScQ/maxresdefault.jpg)](https://youtu.be/jYQlC2NJScQ)
+
 ## What's next ?
 
 Here are some nice ideas to improve this app:
 
-* ~~Save output data in XML / JSON file~~ **DONE !** Output data are stored in CSV (lighter than XML / JSON and easy to parse)
-* Use the geiger board as random number generator
+* ~~Save output data in XML / JSON file~~ **DONE !** Output data are stored in CSV (lighter than XML / JSON and easier to parse)
+* ~~Use the geiger board as random number generator~~ **DONE !** A separate project uses the same geiger board to roll dice: https://github.com/nmrr/flipperzero-atomicdiceroller
 * Send data on the air in real time to monitor remotly
 * Buzz when it gets dangerous like a dosimeter
 
 ## Changelog
 
+* 2023-08-06
+  * Code optimization (shift operation on CPS array has been removed)
+  * Version section has been added
+
 * 2023-07-03
   * Data recording function has been added
 

BIN
flipper_geiger.fap


+ 88 - 47
flipper_geiger/flipper_geiger.c

@@ -33,15 +33,15 @@ typedef struct {
     InputEvent input;
 } EventApp;
 
-#define lineArraySize 128
-
 typedef struct {
     FuriMutex* mutex;
     uint32_t cps, cpm;
-    uint32_t line[lineArraySize];
+    uint32_t line[SCREEN_SIZE_X];
     float coef;
     uint8_t data;
     uint8_t zoom;
+    uint8_t newLinePosition;
+    uint8_t version;
 } mutexStruct;
 
 static void draw_callback(Canvas* canvas, void* ctx) 
@@ -54,50 +54,73 @@ static void draw_callback(Canvas* canvas, void* ctx)
     memcpy(&mutexDraw, mutexVal, sizeof(mutexStruct));
     furi_mutex_release(mutexVal->mutex);
 
-    char buffer[32];
-    if (mutexDraw.data == 0) snprintf(buffer, sizeof(buffer), "%ld cps - %ld cpm", mutexDraw.cps, mutexDraw.cpm);
-    else if (mutexDraw.data == 1) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f uSv/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR));
-    else if (mutexDraw.data == 2) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f mSv/y", mutexDraw.cps, (((double)mutexDraw.cpm*(double)CONVERSION_FACTOR))*(double)8.76);
-    else if (mutexDraw.data == 3) snprintf(buffer, sizeof(buffer), "%ld cps - %.4f Rad/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR)/(double)10000);
-    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);
-
-    if (mutexDraw.zoom == 0)
+    if (mutexDraw.version == 0)
     {
-        for (int i=0;i<SCREEN_SIZE_X;i+=8)
+        char buffer[32];
+        if (mutexDraw.data == 0) snprintf(buffer, sizeof(buffer), "%ld cps - %ld cpm", mutexDraw.cps, mutexDraw.cpm);
+        else if (mutexDraw.data == 1) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f uSv/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR));
+        else if (mutexDraw.data == 2) snprintf(buffer, sizeof(buffer), "%ld cps - %.2f mSv/y", mutexDraw.cps, (((double)mutexDraw.cpm*(double)CONVERSION_FACTOR))*(double)8.76);
+        else if (mutexDraw.data == 3) snprintf(buffer, sizeof(buffer), "%ld cps - %.4f Rad/h", mutexDraw.cps, ((double)mutexDraw.cpm*(double)CONVERSION_FACTOR)/(double)10000);
+        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);
+
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignBottom, buffer);
+
+        uint8_t linePosition = mutexDraw.newLinePosition;
+
+        if (mutexDraw.zoom == 0)
         {
-            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);
+            for (int i=0;i<SCREEN_SIZE_X;i+=8)
+            {
+                if (linePosition != 0) linePosition--;
+                else linePosition = SCREEN_SIZE_X - 1;
+
+                float Y = SCREEN_SIZE_Y-(mutexDraw.line[linePosition]*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)
+        else if (mutexDraw.zoom == 1)
         {
-            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);
+            for (int i=0;i<SCREEN_SIZE_X;i+=4)
+            {
+                if (linePosition != 0) linePosition--;
+                else linePosition = SCREEN_SIZE_X - 1;
+
+                float Y = SCREEN_SIZE_Y-(mutexDraw.line[linePosition]*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)
+        else if (mutexDraw.zoom == 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);
+            for (int i=0;i<SCREEN_SIZE_X;i+=2)
+            {
+                if (linePosition != 0) linePosition--;
+                else linePosition = SCREEN_SIZE_X - 1;
+
+                float Y = SCREEN_SIZE_Y-(mutexDraw.line[linePosition]*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++)
+        else if (mutexDraw.zoom == 3)
         {
-            float Y = SCREEN_SIZE_Y-(mutexDraw.line[i]*mutexDraw.coef);
+            for (int i=0;i<SCREEN_SIZE_X;i++)
+            {
+                if (linePosition != 0) linePosition--;
+                else linePosition = SCREEN_SIZE_X - 1;
 
-            canvas_draw_line(canvas, i, Y, i, SCREEN_SIZE_Y);
+                float Y = SCREEN_SIZE_Y-(mutexDraw.line[linePosition]*mutexDraw.coef);
+                canvas_draw_line(canvas, i, Y, i, SCREEN_SIZE_Y);
+            }
         }
     }
-
-    canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignBottom, buffer);
+    else
+    {
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignBottom, "Geiger Counter");
+        canvas_draw_str_aligned(canvas, 64, 20, AlignCenter, AlignBottom, "Version 20230806");
+        canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignBottom, "github.com/nmrr");
+    }
 }
 
 static void input_callback(InputEvent* input_event, void* ctx) 
@@ -140,10 +163,12 @@ int32_t flipper_geiger_app()
     mutexStruct mutexVal;
     mutexVal.cps = 0;
     mutexVal.cpm = 0;
-    for (int i=0;i<lineArraySize;i++) mutexVal.line[i] = 0;
+    for (int i=0;i<SCREEN_SIZE_X;i++) mutexVal.line[i] = 0;
     mutexVal.coef = 1;
     mutexVal.data = 0;
     mutexVal.zoom = 2;
+    mutexVal.newLinePosition = 0;
+    mutexVal.version = 0;
 
     uint32_t counter = 0;
 
@@ -197,7 +222,8 @@ int32_t flipper_geiger_app()
 
                     mutexVal.cps = 0;
                     mutexVal.cpm = 0;
-                    for (int i=0;i<lineArraySize;i++) mutexVal.line[i] = 0;
+                    for (uint8_t i=0;i<SCREEN_SIZE_X;i++) mutexVal.line[i] = 0;
+                    mutexVal.newLinePosition = 0;
 
                     screenRefresh = 1;
                     furi_mutex_release(mutexVal.mutex);
@@ -261,37 +287,52 @@ int32_t flipper_geiger_app()
                     furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
                     if (mutexVal.zoom != 3) mutexVal.zoom++;
 
+                    screenRefresh = 1;
+                    furi_mutex_release(mutexVal.mutex);
+                }
+                else if((event.input.key == InputKeyDown && event.input.type == InputTypeLong))
+                {
+                    furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
+                    if (mutexVal.version == 0) mutexVal.version = 1;
+                    else mutexVal.version = 0;
+
                     screenRefresh = 1;
                     furi_mutex_release(mutexVal.mutex);
                 }
             }
             else if (event.type == ClockEventTypeTick)
             {
-                furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
-
                 if (recordData == 1)
                 {
                     furi_string_printf(dataString, "%lu,%lu\n", epoch++, counter);
                     stream_write_string(file_stream, dataString);
                 }
 
-                for (int i=0;i<lineArraySize-1;i++) mutexVal.line[lineArraySize-1-i] = mutexVal.line[lineArraySize-2-i]; 
+                furi_mutex_acquire(mutexVal.mutex, FuriWaitForever);
 
-                mutexVal.line[0] = counter;
+                mutexVal.line[mutexVal.newLinePosition] = counter;
                 mutexVal.cps = counter;
                 counter = 0;
 
-                mutexVal.cpm = mutexVal.line[0];
-                uint32_t max = mutexVal.line[0];
-                for (int i=1;i<lineArraySize;i++)
+                mutexVal.cpm = mutexVal.line[mutexVal.newLinePosition];
+                uint32_t max = mutexVal.line[mutexVal.newLinePosition];
+                uint8_t linePosition = mutexVal.newLinePosition;
+
+                for (int i=1;i<SCREEN_SIZE_X;i++)
                 {
-                    if (i < 60) mutexVal.cpm += mutexVal.line[i];
-                    if (mutexVal.line[i] > max) max = mutexVal.line[i];
+                    if (linePosition != 0) linePosition--;
+                    else linePosition = SCREEN_SIZE_X - 1;
+
+                    if (i < 60) mutexVal.cpm += mutexVal.line[linePosition];
+                    if (mutexVal.line[linePosition] > max) max = mutexVal.line[linePosition];
                 }
 
                 if (max > 0) mutexVal.coef = ((float)(SCREEN_SIZE_Y-15))/((float)max);
                 else mutexVal.coef = 1;
 
+                if (mutexVal.newLinePosition != SCREEN_SIZE_X - 1) mutexVal.newLinePosition++;
+                else mutexVal.newLinePosition = 0;
+
                 screenRefresh = 1;
                 furi_mutex_release(mutexVal.mutex);
             }


BIN
img/version.png