diff --git a/ReadMe.md b/ReadMe.md
index 2d3ac2563..49a5aca84 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -25,6 +25,7 @@ Thank you to all the supporters!
- Updated: [Intravelometer (By theageoflove)](https://github.com/theageoflove/flipperzero-zeitraffer)
- Added: [IR Remote (By Hong5489)](https://github.com/Hong5489/ir_remote)
- Removed: [POCSAG (By Shmuma)](https://github.com/Shmuma/flipper-zero-pocsag)
+- Updated: [Lightmeter (By oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) `Req: BH1750`
## Install from Release
FLASH STOCK FIRST BEFORE UPDATING TO CUSTOM FIRMWARE!
diff --git a/applications/plugins/lightmeter/.clang-format b/applications/plugins/lightmeter/.clang-format
new file mode 100644
index 000000000..4b76f7fa4
--- /dev/null
+++ b/applications/plugins/lightmeter/.clang-format
@@ -0,0 +1,191 @@
+---
+Language: Cpp
+AccessModifierOffset: -4
+AlignAfterOpenBracket: AlwaysBreak
+AlignArrayOfStructures: None
+AlignConsecutiveMacros: None
+AlignConsecutiveAssignments: None
+AlignConsecutiveBitFields: None
+AlignConsecutiveDeclarations: None
+AlignEscapedNewlines: Left
+AlignOperands: Align
+AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortEnumsOnASingleLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: WithoutElse
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: Yes
+AttributeMacros:
+ - __capability
+BinPackArguments: false
+BinPackParameters: false
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: Never
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: true
+ SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeConceptDeclarations: true
+BreakBeforeBraces: Attach
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: false
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeComma
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: false
+ColumnLimit: 99
+CommentPragmas: '^ IWYU pragma:'
+QualifierAlignment: Leave
+CompactNamespaces: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat: false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
+ExperimentalAutoDetectBinPacking: false
+PackConstructorInitializers: BinPack
+BasedOnStyle: ''
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+AllowAllConstructorInitializersOnNextLine: true
+FixNamespaceComments: false
+ForEachMacros:
+ - foreach
+ - Q_FOREACH
+ - BOOST_FOREACH
+IfMacros:
+ - KJ_IF_MAYBE
+IncludeBlocks: Preserve
+IncludeCategories:
+ - Regex: '.*'
+ Priority: 1
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: '^(<|"(gtest|gmock|isl|json)/)'
+ Priority: 3
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: '.*'
+ Priority: 1
+ SortPriority: 0
+ CaseSensitive: false
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentAccessModifiers: false
+IndentCaseLabels: false
+IndentCaseBlocks: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentExternBlock: AfterExternBlock
+IndentRequires: false
+IndentWidth: 4
+IndentWrappedFunctionNames: true
+InsertTrailingCommas: None
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: Signature
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 4
+ObjCBreakBeforeNestedBlockParam: true
+ObjCSpaceAfterProperty: true
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 10
+PenaltyBreakBeforeFirstCallParameter: 30
+PenaltyBreakComment: 10
+PenaltyBreakFirstLessLess: 0
+PenaltyBreakOpenParenthesis: 0
+PenaltyBreakString: 10
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 100
+PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+PointerAlignment: Left
+PPIndentWidth: -1
+ReferenceAlignment: Pointer
+ReflowComments: false
+RemoveBracesLLVM: false
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SortIncludes: Never
+SortJavaStaticImport: Before
+SortUsingDeclarations: false
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: Never
+SpaceBeforeParensOptions:
+ AfterControlStatements: false
+ AfterForeachMacros: false
+ AfterFunctionDefinitionName: false
+ AfterFunctionDeclarationName: false
+ AfterIfMacros: false
+ AfterOverloadedOperator: false
+ BeforeNonEmptyParentheses: false
+SpaceAroundPointerQualifiers: Default
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: Never
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: false
+SpacesInCStyleCastParentheses: false
+SpacesInLineCommentPrefix:
+ Minimum: 1
+ Maximum: -1
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+BitFieldColonSpacing: Both
+Standard: c++03
+StatementAttributeLikeMacros:
+ - Q_EMIT
+StatementMacros:
+ - Q_UNUSED
+ - QT_REQUIRE_VERSION
+TabWidth: 4
+UseCRLF: false
+UseTab: Never
+WhitespaceSensitiveMacros:
+ - STRINGIZE
+ - PP_STRINGIZE
+ - BOOST_PP_STRINGIZE
+ - NS_SWIFT_NAME
+ - CF_SWIFT_NAME
+...
+
diff --git a/applications/plugins/lightmeter/README.md b/applications/plugins/lightmeter/README.md
index d9c071e67..dc6c6ffd5 100644
--- a/applications/plugins/lightmeter/README.md
+++ b/applications/plugins/lightmeter/README.md
@@ -1,9 +1,10 @@
-# flipperzero-lightmeter
+# flipperzero-lightmeter
-[Original link](https://github.com/oleksiikutuzov/flipperzero-lightmeter)
+[](https://github.com/oleksiikutuzov/flipperzero-lightmeter/actions/workflows/build.yml)
+
-
+
## Wiring
@@ -14,6 +15,19 @@ SCL -> C0
SDA -> C1
```
+## Sensor module
+
+
+
+### If you want to build this module, you'll need (it's quite over-engineered, sorry :D)
+1. [Module PCB](https://github.com/oleksiikutuzov/flipperzero-lightmeter/blob/main/module/module_v2_gerber.zip)
+2. [Enclosure](https://github.com/oleksiikutuzov/flipperzero-lightmeter/blob/main/module/module_v2_enclosure.stl)
+3. 4-pin female header
+4. 10-pin male header
+5. 2x M3 threaded inserts (max diameter 5.3 mm, max height 4 mm)
+6. 2x M3x5 screws
+
+
## TODO
- [ ] Save settings to sd card
diff --git a/applications/plugins/lightmeter/application.fam b/applications/plugins/lightmeter/application.fam
index b1ae6c6b2..820467bde 100644
--- a/applications/plugins/lightmeter/application.fam
+++ b/applications/plugins/lightmeter/application.fam
@@ -21,4 +21,7 @@ App(
),
],
fap_icon_assets="icons",
+ fap_description="Lightmeter app for photography based on BH1750 sensor",
+ fap_author="Oleksii Kutuzov",
+ fap_weburl="https://github.com/oleksiikutuzov/flipperzero-lightmeter",
)
diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c
index 42952562b..3d6bd5803 100644
--- a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c
+++ b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c
@@ -1,5 +1,7 @@
#include "../../lightmeter.h"
+#define TAG "Scene Config"
+
static const char* iso_numbers[] = {
[ISO_6] = "6",
[ISO_12] = "12",
@@ -39,10 +41,24 @@ static const char* diffusion_dome[] = {
[WITH_DOME] = "Yes",
};
+static const char* backlight[] = {
+ [BACKLIGHT_AUTO] = "Auto",
+ [BACKLIGHT_ON] = "On",
+};
+
+static const char* lux_only[] = {
+ [LUX_ONLY_OFF] = "Off",
+ [LUX_ONLY_ON] = "On",
+};
+
enum LightMeterSubmenuIndex {
LightMeterSubmenuIndexISO,
LightMeterSubmenuIndexND,
LightMeterSubmenuIndexDome,
+ LightMeterSubmenuIndexBacklight,
+ LightMeterSubmenuIndexLuxMeter,
+ LightMeterSubmenuIndexHelp,
+ LightMeterSubmenuIndexAbout,
};
static void iso_numbers_cb(VariableItem* item) {
@@ -78,14 +94,47 @@ static void dome_presence_cb(VariableItem* item) {
lightmeter_app_set_config(app, config);
}
+static void backlight_cb(VariableItem* item) {
+ LightMeterApp* app = variable_item_get_context(item);
+ uint8_t index = variable_item_get_current_value_index(item);
+
+ variable_item_set_current_value_text(item, backlight[index]);
+
+ LightMeterConfig* config = app->config;
+ if(index != config->backlight) {
+ if(index == BACKLIGHT_ON) {
+ notification_message(
+ app->notifications,
+ &sequence_display_backlight_enforce_on); // force on backlight
+ } else {
+ notification_message(
+ app->notifications,
+ &sequence_display_backlight_enforce_auto); // force auto backlight
+ }
+ }
+ config->backlight = index;
+ lightmeter_app_set_config(app, config);
+}
+
+static void lux_only_cb(VariableItem* item) {
+ LightMeterApp* app = variable_item_get_context(item);
+ uint8_t index = variable_item_get_current_value_index(item);
+
+ variable_item_set_current_value_text(item, lux_only[index]);
+
+ LightMeterConfig* config = app->config;
+ config->lux_only = index;
+ lightmeter_app_set_config(app, config);
+}
+
static void ok_cb(void* context, uint32_t index) {
LightMeterApp* app = context;
UNUSED(app);
switch(index) {
- case 3:
+ case LightMeterSubmenuIndexHelp:
view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp);
break;
- case 4:
+ case LightMeterSubmenuIndexAbout:
view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout);
break;
default:
@@ -114,6 +163,16 @@ void lightmeter_scene_config_on_enter(void* context) {
variable_item_set_current_value_index(item, config->dome);
variable_item_set_current_value_text(item, diffusion_dome[config->dome]);
+ item =
+ variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app);
+ variable_item_set_current_value_index(item, config->backlight);
+ variable_item_set_current_value_text(item, backlight[config->backlight]);
+
+ item = variable_item_list_add(
+ var_item_list, "Lux meter only", COUNT_OF(lux_only), lux_only_cb, app);
+ variable_item_set_current_value_index(item, config->lux_only);
+ variable_item_set_current_value_text(item, lux_only[config->lux_only]);
+
item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL);
item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL);
@@ -153,4 +212,5 @@ void lightmeter_scene_config_on_exit(void* context) {
main_view_set_iso(app->main_view, app->config->iso);
main_view_set_nd(app->main_view, app->config->nd);
main_view_set_dome(app->main_view, app->config->dome);
+ main_view_set_lux_only(app->main_view, app->config->lux_only);
}
diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c
index 7b6d45864..0441f0925 100644
--- a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c
+++ b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c
@@ -10,6 +10,8 @@ void lightmeter_scene_help_on_enter(void* context) {
furi_string_cat(temp_str, "\e#Pinout:\r\n");
furi_string_cat(
temp_str,
+ " VCC: 3.3V\r\n"
+ " GND: GND\r\n"
" SDA: 15 [C1]\r\n"
" SCL: 16 [C0]\r\n");
diff --git a/applications/plugins/lightmeter/gui/views/main_view.c b/applications/plugins/lightmeter/gui/views/main_view.c
index 756346fa4..fcbafbff4 100644
--- a/applications/plugins/lightmeter/gui/views/main_view.c
+++ b/applications/plugins/lightmeter/gui/views/main_view.c
@@ -41,7 +41,7 @@ static const int nd_numbers[] = {
[ND_4096] = 4096,
};
-static const float aperture_numbers[] = {
+const float aperture_numbers[] = {
[AP_1] = 1.0,
[AP_1_4] = 1.4,
[AP_2] = 2.0,
@@ -59,7 +59,7 @@ static const float aperture_numbers[] = {
[AP_128] = 128,
};
-static const float speed_numbers[] = {
+const float speed_numbers[] = {
[SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000,
[SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250,
[SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30,
@@ -94,37 +94,39 @@ static void main_view_draw_callback(Canvas* canvas, void* context) {
furi_assert(context);
MainViewModel* model = context;
- // FURI_LOG_D("MAIN VIEW", "Drawing");
-
canvas_clear(canvas);
- // top row
- draw_top_row(canvas, model);
-
- // add f, T values
- canvas_set_font(canvas, FontBigNumbers);
-
- // draw f icon and number
- canvas_draw_icon(canvas, 15, 17, &I_f_10x14);
- draw_aperture(canvas, model);
-
- // draw T icon and number
- canvas_draw_icon(canvas, 15, 34, &I_T_10x14);
- draw_speed(canvas, model);
-
// draw button
canvas_set_font(canvas, FontSecondary);
elements_button_left(canvas, "Config");
- // draw ND number
- draw_nd_number(canvas, model);
+ if(!model->lux_only) {
+ // top row
+ draw_top_row(canvas, model);
- // draw EV number
- canvas_set_font(canvas, FontSecondary);
- draw_EV_number(canvas, model);
+ // add f, T values
+ canvas_set_font(canvas, FontBigNumbers);
- // draw mode indicator
- draw_mode_indicator(canvas, model);
+ // draw f icon and number
+ canvas_draw_icon(canvas, 15, 17, &I_f_10x14);
+ draw_aperture(canvas, model);
+
+ // draw T icon and number
+ canvas_draw_icon(canvas, 15, 34, &I_T_10x14);
+ draw_speed(canvas, model);
+
+ // draw ND number
+ draw_nd_number(canvas, model);
+
+ // draw EV number
+ canvas_set_font(canvas, FontSecondary);
+ draw_EV_number(canvas, model);
+
+ // draw mode indicator
+ draw_mode_indicator(canvas, model);
+ } else {
+ draw_lux_only_mode(canvas, model);
+ }
}
static void main_view_process(MainView* main_view, InputEvent* event) {
@@ -267,6 +269,12 @@ void main_view_set_dome(MainView* main_view, bool dome) {
main_view->view, MainViewModel * model, { model->dome = dome; }, true);
}
+void main_view_set_lux_only(MainView* main_view, bool lux_only) {
+ furi_assert(main_view);
+ with_view_model(
+ main_view->view, MainViewModel * model, { model->lux_only = lux_only; }, true);
+}
+
bool main_view_get_dome(MainView* main_view) {
furi_assert(main_view);
bool val = false;
@@ -307,7 +315,7 @@ void draw_top_row(Canvas* canvas, MainViewModel* context) {
canvas_set_font(canvas, FontPrimary);
// metering mode A – ambient, F – flash
- canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, "A");
+ // canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, "A");
snprintf(str, sizeof(str), "ISO: %d", iso_numbers[model->iso]);
canvas_draw_str_aligned(canvas, 19, 1, AlignLeft, AlignTop, str);
@@ -412,6 +420,8 @@ void draw_nd_number(Canvas* canvas, MainViewModel* context) {
char str[9];
+ canvas_set_font(canvas, FontSecondary);
+
if(model->response) {
snprintf(str, sizeof(str), "ND: %d", nd_numbers[model->nd]);
} else {
@@ -432,3 +442,29 @@ void draw_EV_number(Canvas* canvas, MainViewModel* context) {
canvas_draw_str_aligned(canvas, 87, 29, AlignLeft, AlignBottom, "EV: --");
}
}
+
+void draw_lux_only_mode(Canvas* canvas, MainViewModel* context) {
+ MainViewModel* model = context;
+
+ if(!model->response) {
+ canvas_draw_box(canvas, 0, 0, 128, 12);
+ canvas_set_color(canvas, ColorWhite);
+ canvas_set_font(canvas, FontPrimary);
+ canvas_draw_str(canvas, 24, 10, "No sensor found");
+ canvas_set_color(canvas, ColorBlack);
+ } else {
+ char str[12];
+
+ canvas_set_font(canvas, FontPrimary);
+
+ canvas_draw_line(canvas, 0, 10, 128, 10);
+ canvas_draw_str_aligned(canvas, 64, 1, AlignCenter, AlignTop, "Lux meter mode");
+
+ canvas_set_font(canvas, FontBigNumbers);
+ snprintf(str, sizeof(str), "%.0f", (double)model->lux);
+ canvas_draw_str_aligned(canvas, 80, 32, AlignRight, AlignCenter, str);
+
+ canvas_set_font(canvas, FontSecondary);
+ canvas_draw_str_aligned(canvas, 85, 39, AlignLeft, AlignBottom, "Lux");
+ }
+}
diff --git a/applications/plugins/lightmeter/gui/views/main_view.h b/applications/plugins/lightmeter/gui/views/main_view.h
index 099f91674..42d2d1877 100644
--- a/applications/plugins/lightmeter/gui/views/main_view.h
+++ b/applications/plugins/lightmeter/gui/views/main_view.h
@@ -27,6 +27,7 @@ typedef struct {
int aperture;
int speed;
bool dome;
+ bool lux_only;
} MainViewModel;
typedef void (*LightMeterMainViewButtonCallback)(void* context);
@@ -58,6 +59,8 @@ void main_view_set_speed(MainView* main_view, int val);
void main_view_set_dome(MainView* main_view, bool val);
+void main_view_set_lux_only(MainView* main_view, bool val);
+
bool main_view_get_dome(MainView* main_view);
void draw_top_row(Canvas* canvas, MainViewModel* context);
@@ -71,3 +74,5 @@ void draw_mode_indicator(Canvas* canvas, MainViewModel* context);
void draw_nd_number(Canvas* canvas, MainViewModel* context);
void draw_EV_number(Canvas* canvas, MainViewModel* context);
+
+void draw_lux_only_mode(Canvas* canvas, MainViewModel* context);
diff --git a/applications/plugins/lightmeter/images/framed_gui.gif b/applications/plugins/lightmeter/images/framed_gui.gif
deleted file mode 100644
index 86c4d79a5..000000000
Binary files a/applications/plugins/lightmeter/images/framed_gui.gif and /dev/null differ
diff --git a/applications/plugins/lightmeter/images/framed_gui_config.png b/applications/plugins/lightmeter/images/framed_gui_config.png
index 3d0f0c88a..b87c3bd5c 100644
Binary files a/applications/plugins/lightmeter/images/framed_gui_config.png and b/applications/plugins/lightmeter/images/framed_gui_config.png differ
diff --git a/applications/plugins/lightmeter/images/framed_gui_lux_meter.png b/applications/plugins/lightmeter/images/framed_gui_lux_meter.png
new file mode 100644
index 000000000..6ab0cf191
Binary files /dev/null and b/applications/plugins/lightmeter/images/framed_gui_lux_meter.png differ
diff --git a/applications/plugins/lightmeter/images/framed_gui_main.png b/applications/plugins/lightmeter/images/framed_gui_main.png
index 89aa1a11f..23dc4a2cc 100644
Binary files a/applications/plugins/lightmeter/images/framed_gui_main.png and b/applications/plugins/lightmeter/images/framed_gui_main.png differ
diff --git a/applications/plugins/lightmeter/images/gui_config.png b/applications/plugins/lightmeter/images/gui_config.png
index ac7de4517..95fdcb167 100644
Binary files a/applications/plugins/lightmeter/images/gui_config.png and b/applications/plugins/lightmeter/images/gui_config.png differ
diff --git a/applications/plugins/lightmeter/images/gui_lux_meter.png b/applications/plugins/lightmeter/images/gui_lux_meter.png
new file mode 100644
index 000000000..f7159e671
Binary files /dev/null and b/applications/plugins/lightmeter/images/gui_lux_meter.png differ
diff --git a/applications/plugins/lightmeter/images/gui_main.png b/applications/plugins/lightmeter/images/gui_main.png
index ae523aa2f..ba4c3f75f 100644
Binary files a/applications/plugins/lightmeter/images/gui_main.png and b/applications/plugins/lightmeter/images/gui_main.png differ
diff --git a/applications/plugins/lightmeter/lib/BH1750/BH1750.c b/applications/plugins/lightmeter/lib/BH1750/BH1750.c
deleted file mode 100644
index 28616e040..000000000
--- a/applications/plugins/lightmeter/lib/BH1750/BH1750.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * @file BH1750.h
- * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com)
- * @brief
- * @version 0.1
- * @date 2022-11-06
- *
- * @copyright Copyright (c) 2022
- *
- * Ported from:
- * https://github.com/lamik/Light_Sensors_STM32
- */
-
-#include "BH1750.h"
-
-BH1750_mode bh1750_mode = BH1750_DEFAULT_MODE; // Current sensor mode
-uint8_t bh1750_mt_reg = BH1750_DEFAULT_MTREG; // Current MT register value
-
-BH1750_STATUS bh1750_init() {
- if(BH1750_OK == bh1750_reset()) {
- if(BH1750_OK == bh1750_set_mt_reg(BH1750_DEFAULT_MTREG)) {
- return BH1750_OK;
- }
- }
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_reset() {
- uint8_t command = 0x07;
- bool status;
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_tx(I2C_BUS, BH1750_ADDRESS, &command, 1, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
-
- if(status) {
- return BH1750_OK;
- }
-
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn) {
- PowerOn = (PowerOn ? 1 : 0);
- bool status;
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_tx(I2C_BUS, BH1750_ADDRESS, &PowerOn, 1, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
-
- if(status) {
- return BH1750_OK;
- }
-
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_set_mode(BH1750_mode mode) {
- if(!((mode >> 4) || (mode >> 5))) {
- return BH1750_ERROR;
- }
-
- if((mode & 0x0F) > 3) {
- return BH1750_ERROR;
- }
-
- bool status;
-
- bh1750_mode = mode;
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_tx(I2C_BUS, BH1750_ADDRESS, &mode, 1, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
-
- if(status) {
- return BH1750_OK;
- }
-
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_set_mt_reg(uint8_t mt_reg) {
- if(mt_reg < 31 || mt_reg > 254) {
- return BH1750_ERROR;
- }
-
- bh1750_mt_reg = mt_reg;
-
- uint8_t tmp[2];
- bool status;
-
- tmp[0] = (0x40 | (mt_reg >> 5));
- tmp[1] = (0x60 | (mt_reg & 0x1F));
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_tx(I2C_BUS, BH1750_ADDRESS, &tmp[0], 1, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
- if(!status) {
- return BH1750_ERROR;
- }
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_tx(I2C_BUS, BH1750_ADDRESS, &tmp[1], 1, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
- if(status) {
- return BH1750_OK;
- }
-
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_trigger_manual_conversion() {
- if(BH1750_OK == bh1750_set_mode(bh1750_mode)) {
- return BH1750_OK;
- }
- return BH1750_ERROR;
-}
-
-BH1750_STATUS bh1750_read_light(float* result) {
- float result_tmp;
- uint8_t rcv[2];
- bool status;
-
- furi_hal_i2c_acquire(I2C_BUS);
- status = furi_hal_i2c_rx(I2C_BUS, BH1750_ADDRESS, rcv, 2, I2C_TIMEOUT);
- furi_hal_i2c_release(I2C_BUS);
-
- if(status) {
- result_tmp = (rcv[0] << 8) | (rcv[1]);
-
- if(bh1750_mt_reg != BH1750_DEFAULT_MTREG) {
- result_tmp *= (float)((uint8_t)BH1750_DEFAULT_MTREG / (float)bh1750_mt_reg);
- }
-
- if(bh1750_mode == ONETIME_HIGH_RES_MODE_2 || bh1750_mode == CONTINUOUS_HIGH_RES_MODE_2) {
- result_tmp /= 2.0;
- }
-
- *result = result_tmp / BH1750_CONVERSION_FACTOR;
-
- return BH1750_OK;
- }
- return BH1750_ERROR;
-}
diff --git a/applications/plugins/lightmeter/lib/BH1750/BH1750.h b/applications/plugins/lightmeter/lib/BH1750/BH1750.h
deleted file mode 100644
index 991350f7f..000000000
--- a/applications/plugins/lightmeter/lib/BH1750/BH1750.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * @file BH1750.h
- * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com)
- * @brief
- * @version 0.1
- * @date 2022-11-06
- *
- * @copyright Copyright (c) 2022
- *
- * Ported from:
- * https://github.com/lamik/Light_Sensors_STM32
- */
-
-#include
-#include
-
-#ifndef BH1750_H_
-#define BH1750_H_
-
-// I2C BUS
-#define I2C_BUS &furi_hal_i2c_handle_external
-#define I2C_TIMEOUT 10
-
-#define BH1750_ADDRESS (0x23 << 1)
-
-#define BH1750_POWER_DOWN 0x00
-#define BH1750_POWER_ON 0x01
-#define BH1750_RESET 0x07
-#define BH1750_DEFAULT_MTREG 69
-#define BH1750_DEFAULT_MODE ONETIME_HIGH_RES_MODE
-
-#define BH1750_CONVERSION_FACTOR 1.2
-
-typedef enum { BH1750_OK = 0, BH1750_ERROR = 1 } BH1750_STATUS;
-
-typedef enum {
- CONTINUOUS_HIGH_RES_MODE = 0x10,
- CONTINUOUS_HIGH_RES_MODE_2 = 0x11,
- CONTINUOUS_LOW_RES_MODE = 0x13,
- ONETIME_HIGH_RES_MODE = 0x20,
- ONETIME_HIGH_RES_MODE_2 = 0x21,
- ONETIME_LOW_RES_MODE = 0x23
-} BH1750_mode;
-
-/**
- * @brief Initialize the sensor. Sends the reset command and sets the measurement register to the default value.
- *
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_init();
-
-/**
- * @brief Reset all registers to the default value.
- *
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_reset();
-
-/**
- * @brief Sets the power state. 1 - running; 0 - sleep, low power.
- *
- * @param PowerOn sensor state.
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn);
-
-/**
- * @brief Set the Measurement Time register. It allows to increase or decrease the sensitivity.
- *
- * @param MTreg value from 31 to 254, defaults to 69.
- *
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_set_mt_reg(uint8_t MTreg);
-
-/**
- * @brief Set the mode of converting. Look into the bh1750_mode enum.
- *
- * @param Mode mode enumerator
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_set_mode(BH1750_mode Mode);
-
-/**
- * @brief Trigger the conversion in manual modes.
- *
- * @details a low-resolution mode, the conversion time is typically 16 ms, and for a high-resolution
- * mode is 120 ms. You need to wait until reading the measurement value. There is no need
- * to exit low-power mode for manual conversion. It makes automatically.
- *
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_trigger_manual_conversion();
-
-/**
- * @brief Read the converted value and calculate the result.
- *
- * @param Result stores received value to this variable.
- * @return BH1750_STATUS
- */
-BH1750_STATUS bh1750_read_light(float* Result);
-
-#endif /* BH1750_H_ */
diff --git a/applications/plugins/lightmeter/lib/BH1750/LICENSE b/applications/plugins/lightmeter/lib/BH1750/LICENSE
deleted file mode 100644
index cb2f65db5..000000000
--- a/applications/plugins/lightmeter/lib/BH1750/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Oleksii Kutuzov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/applications/plugins/lightmeter/lib/BH1750/README.md b/applications/plugins/lightmeter/lib/BH1750/README.md
deleted file mode 100644
index b1338d4ab..000000000
--- a/applications/plugins/lightmeter/lib/BH1750/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# flipperzero-BH1750
-BH1750 light sensor library for Flipper Zero
diff --git a/applications/plugins/lightmeter/lib/BH1750/docs/BH1750.pdf b/applications/plugins/lightmeter/lib/BH1750/docs/BH1750.pdf
deleted file mode 100644
index 267efddc6..000000000
Binary files a/applications/plugins/lightmeter/lib/BH1750/docs/BH1750.pdf and /dev/null differ
diff --git a/applications/plugins/lightmeter/lightmeter.c b/applications/plugins/lightmeter/lightmeter.c
index 6034a9ee9..07661d2d4 100644
--- a/applications/plugins/lightmeter/lightmeter.c
+++ b/applications/plugins/lightmeter/lightmeter.c
@@ -1,7 +1,7 @@
#include "lightmeter.h"
#include "lightmeter_helper.h"
-#define WORKER_TAG "MAIN APP"
+#define TAG "MAIN APP"
static bool lightmeter_custom_event_callback(void* context, uint32_t event) {
furi_assert(context);
@@ -31,7 +31,6 @@ LightMeterApp* lightmeter_app_alloc(uint32_t first_scene) {
bh1750_set_power_state(1);
bh1750_init();
bh1750_set_mode(ONETIME_HIGH_RES_MODE);
- bh1750_set_mt_reg(100);
// Set default values to config
app->config = malloc(sizeof(LightMeterConfig));
@@ -39,12 +38,11 @@ LightMeterApp* lightmeter_app_alloc(uint32_t first_scene) {
app->config->nd = DEFAULT_ND;
app->config->aperture = DEFAULT_APERTURE;
app->config->dome = DEFAULT_DOME;
+ app->config->backlight = DEFAULT_BACKLIGHT;
// Records
app->gui = furi_record_open(RECORD_GUI);
app->notifications = furi_record_open(RECORD_NOTIFICATION);
- notification_message(
- app->notifications, &sequence_display_backlight_enforce_on); // force on backlight
// View dispatcher
app->view_dispatcher = view_dispatcher_alloc();
@@ -112,9 +110,11 @@ void lightmeter_app_free(LightMeterApp* app) {
// Records
furi_record_close(RECORD_GUI);
- notification_message(
- app->notifications,
- &sequence_display_backlight_enforce_auto); // set backlight back to auto
+ if(app->config->backlight != BACKLIGHT_AUTO) {
+ notification_message(
+ app->notifications,
+ &sequence_display_backlight_enforce_auto); // set backlight back to auto
+ }
furi_record_close(RECORD_NOTIFICATION);
bh1750_set_power_state(0);
diff --git a/applications/plugins/lightmeter/lightmeter.h b/applications/plugins/lightmeter/lightmeter.h
index 679b32d15..2558be3c5 100644
--- a/applications/plugins/lightmeter/lightmeter.h
+++ b/applications/plugins/lightmeter/lightmeter.h
@@ -24,6 +24,8 @@ typedef struct {
int nd;
int aperture;
int dome;
+ int backlight;
+ int lux_only;
} LightMeterConfig;
typedef struct {
diff --git a/applications/plugins/lightmeter/lightmeter_config.h b/applications/plugins/lightmeter/lightmeter_config.h
index 023235cff..4f7e11e0d 100644
--- a/applications/plugins/lightmeter/lightmeter_config.h
+++ b/applications/plugins/lightmeter/lightmeter_config.h
@@ -1,6 +1,6 @@
#pragma once
-#define LM_VERSION_APP "0.5"
+#define LM_VERSION_APP "0.7"
#define LM_DEVELOPED "Oleksii Kutuzov"
#define LM_GITHUB "https://github.com/oleksiikutuzov/flipperzero-lightmeter"
@@ -10,6 +10,7 @@
#define DEFAULT_APERTURE AP_2_8
#define DEFAULT_SPEED SPEED_125
#define DEFAULT_DOME WITHOUT_DOME
+#define DEFAULT_BACKLIGHT BACKLIGHT_AUTO
typedef enum {
ISO_6,
@@ -97,3 +98,10 @@ typedef enum {
WITHOUT_DOME,
WITH_DOME,
} LightMeterDomePresence;
+
+typedef enum {
+ LUX_ONLY_OFF,
+ LUX_ONLY_ON,
+} LightMeterLuxOnlyMode;
+
+typedef enum { BACKLIGHT_AUTO, BACKLIGHT_ON } LightMeterBacklight;
diff --git a/applications/plugins/lightmeter/lightmeter_helper.c b/applications/plugins/lightmeter/lightmeter_helper.c
index 1cdddfca9..465ccbce1 100644
--- a/applications/plugins/lightmeter/lightmeter_helper.c
+++ b/applications/plugins/lightmeter/lightmeter_helper.c
@@ -1,33 +1,8 @@
#include "lightmeter_helper.h"
#include "lightmeter_config.h"
-static const float aperture_numbers[] = {
- [AP_1] = 1.0,
- [AP_1_4] = 1.4,
- [AP_2] = 2.0,
- [AP_2_8] = 2.8,
- [AP_4] = 4.0,
- [AP_5_6] = 5.6,
- [AP_8] = 8,
- [AP_11] = 11,
- [AP_16] = 16,
- [AP_22] = 22,
- [AP_32] = 32,
- [AP_45] = 45,
- [AP_64] = 64,
- [AP_90] = 90,
- [AP_128] = 128,
-};
-
-static const float time_numbers[] = {
- [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000,
- [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250,
- [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30,
- [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, [SPEED_4] = 1.0 / 4,
- [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, [SPEED_2S] = 2.0,
- [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, [SPEED_15S] = 15.0,
- [SPEED_30S] = 30.0,
-};
+extern const float aperture_numbers[];
+extern const float speed_numbers[];
float lux2ev(float lux) {
return log2(lux / 2.5);
@@ -41,7 +16,6 @@ float getMinDistance(float x, float v1, float v2) {
return v1;
}
-// Convert calculated aperture value to photography style aperture value.
float normalizeAperture(float a) {
for(int i = 0; i < AP_NUM; i++) {
float a1 = aperture_numbers[i];
@@ -57,8 +31,8 @@ float normalizeAperture(float a) {
float normalizeTime(float a) {
for(int i = 0; i < SPEED_NUM; i++) {
- float a1 = time_numbers[i];
- float a2 = time_numbers[i + 1];
+ float a1 = speed_numbers[i];
+ float a2 = speed_numbers[i + 1];
if(a1 < a && a2 >= a) {
return getMinDistance(a, a1, a2);
diff --git a/applications/plugins/lightmeter/module/back.jpg b/applications/plugins/lightmeter/module/back.jpg
new file mode 100644
index 000000000..366d7a852
Binary files /dev/null and b/applications/plugins/lightmeter/module/back.jpg differ
diff --git a/applications/plugins/lightmeter/module/front.jpg b/applications/plugins/lightmeter/module/front.jpg
new file mode 100644
index 000000000..b38fd4150
Binary files /dev/null and b/applications/plugins/lightmeter/module/front.jpg differ
diff --git a/applications/plugins/lightmeter/module/module.jpg b/applications/plugins/lightmeter/module/module.jpg
new file mode 100644
index 000000000..53f481338
Binary files /dev/null and b/applications/plugins/lightmeter/module/module.jpg differ
diff --git a/applications/plugins/lightmeter/module/module_v2_enclosure.stl b/applications/plugins/lightmeter/module/module_v2_enclosure.stl
new file mode 100644
index 000000000..ee2be93fd
Binary files /dev/null and b/applications/plugins/lightmeter/module/module_v2_enclosure.stl differ
diff --git a/applications/plugins/lightmeter/module/module_v2_gerber.zip b/applications/plugins/lightmeter/module/module_v2_gerber.zip
new file mode 100644
index 000000000..02887f4bf
Binary files /dev/null and b/applications/plugins/lightmeter/module/module_v2_gerber.zip differ