From f925563fe0e97b2d4ff5eb21a1a6fec854d816a2 Mon Sep 17 00:00:00 2001 From: Aleksandr Kutuzov Date: Sat, 20 Apr 2024 07:55:35 +0900 Subject: [PATCH 1/3] AirMouse: various improvements --- air_mouse/air_mouse_app.c | 2 +- air_mouse/assets/Wheel_mouse_icon_9x9.png | Bin 0 -> 2075 bytes air_mouse/imu_mouse.c | 29 ++++-- air_mouse/imu_mouse.h | 1 + air_mouse/views/air_mouse_view.c | 103 +++++++++++++++------- 5 files changed, 94 insertions(+), 41 deletions(-) create mode 100644 air_mouse/assets/Wheel_mouse_icon_9x9.png diff --git a/air_mouse/air_mouse_app.c b/air_mouse/air_mouse_app.c index 8c41e774..ad6e747f 100644 --- a/air_mouse/air_mouse_app.c +++ b/air_mouse/air_mouse_app.c @@ -96,7 +96,7 @@ static const ImuHidApi hid_api_ble = { .mouse_key_press = ble_hid_mouse_key_press, .mouse_key_release = ble_hid_mouse_key_release, .mouse_scroll = ble_hid_mouse_scroll, - .report_rate_max = 30, + .report_rate_max = 200, }; static void ble_hid_remove_pairing(void) { diff --git a/air_mouse/assets/Wheel_mouse_icon_9x9.png b/air_mouse/assets/Wheel_mouse_icon_9x9.png new file mode 100644 index 0000000000000000000000000000000000000000..339d1635193326843fce6c4b20d546b5ba10c4db GIT binary patch literal 2075 zcma)7eQXnD7{3uw*ceep20~&k2U|8sdmruA_R@}Qy|NW{v+KGs5QSUsZFgCFcidgq zZULhN6%-j`4A?+G&?qVh5@YzvToBDfMZyROD2X7bd@4r1hWK8)twT2AANTP-zvp@0 z-}CW4?=nwWaeC^6R0KiN-6f0{en;xhh+*(8-DoaGkm0ukU$s`vmePJHY~*;U1{h;u z8R7_HpB9rje;v@!8W0pj2X<{=2Zjo~1Dln{60Gb5wL(dw0xBBIeE!Bdzm3PH6{Ol@ zG;|OK8i&ThAyK7c4lM4MhX1-4$I!TnR_DN~Sr6)z6oBR#^Na*mkc!$BK0te!>Al8q z<-lq+O{Q@?8jTvGCZnVTanfe9;RJL;FUgw$+NO~95-tb`}a2>%(BY_W8hhg<|c|beH$%84g?4#Ag;RoESnyVfX z>+bmSq9a;>CEYOORxSp9I)P|pkP4s$_J z3dEpR>%eUB{gd)p0{rg2QFhDA4QJusbn1#a0Bs6e1P=t@L&}J)5nx_&r znjn(euupkT8T*`x$wGr=2#^?98`XNn*O0Bwb7)DvyPyG2#wL_g>=7n0_dN1E$}r9DCngsK?<5>R2D`>K+}W)F@zrI4glz(Wp` zlE{63&FMG>vj!nkoM;kqJDnay3J4*Hsovru)a`QSleYYP17#%RClIy69OzjAick;u z>53HYJ$Jg4A39h0j|>)`Tisq5I$3!`+T;3U=;Ku)sIY|^;-bX3r~nHRtHd%S#QCCV z{8ZAMU+-TBCMyyj@dG}d5a=#}s!~9UatbI6!Uljn83+il(;E_PiIPT=Fj^n9h}Ht= zZRkEskVWmdKDqj++3`g91IQ;728=owLqY~eD4fN3|1gG&{&5aOIKveUrziEFIlFu>+P> zq1G#7v+`dw+)6t+rS9FOt3TSlEWPnNQ-!H(!|6R2)sCARj~%$UIIq1@+56)Ydlr_z zv1HiQ+poBy=hEs={W>2BmL5I+ha79)`}cyTL(4yVVRzL%_5Pfh*tV(jg)z@m__pWR zbL|JJeC$t8iLpV5(a@h%a|EsOb*JP|& zd#vT~jw!8o*Wn8$-%xjt*>`B)_sgEdURs}uu!%JQ~*v8T7ptLpB$dGEpz&&s*3 zKx@QYRnqeI(&FyQZ5vmw8{^2Gba?L%_d6CHuQ=%Z<@Xhc**@{h=Ww%lFxo{FG>tlU zcYNqsx$WZ%<3@Ampa08SdC7*H$lfro^3z+!xuL>~TPGZ==~%^{X`j(~Dc3q~^OeWj z*M9Bz@Ur?Ray0$+2X!Y;zgA$oHs_xd|DxdeJKv^mg17ESxn#DAAZZ!;lY+Ew7_VQ& zZl=&TqHR&ruJq4|Q3v1exohid->mouse_key_release(imu->hid_inst, HID_MOUSE_BTN_RIGHT); } + if(events & ImuMouseWheelPress) { + imu->hid->mouse_key_press(imu->hid_inst, HID_MOUSE_BTN_WHEEL); + } + if(events & ImuMouseWheelRelease) { + imu->hid->mouse_key_release(imu->hid_inst, HID_MOUSE_BTN_WHEEL); + } if(events & ImuMouseLeftPress) { imu->hid->mouse_key_press(imu->hid_inst, HID_MOUSE_BTN_LEFT); } @@ -237,7 +246,7 @@ static int32_t imu_thread(void* context) { float mouse_y = CLAMP(diff_y, 127.f, -127.f); imu->hid->mouse_move( - imu->hid_inst, mouse_exp_rate(mouse_x), mouse_exp_rate(mouse_y)); + imu->hid_inst, mouse_exp_rate(mouse_x), -mouse_exp_rate(mouse_y)); diff_x -= (float)(int8_t)mouse_x; diff_y -= (float)(int8_t)mouse_y; @@ -259,8 +268,12 @@ void imu_mouse_key_press(ImuThread* imu, ImuMouseKey key, bool state) { uint32_t flag = 0; if(key == ImuMouseKeyRight) { flag = (state) ? (ImuMouseRightPress) : (ImuMouseRightRelease); + } else if(key == ImuMouseKeyWheel) { + flag = (state) ? (ImuMouseWheelPress) : (ImuMouseWheelRelease); } else if(key == ImuMouseKeyLeft) { flag = (state) ? (ImuMouseLeftPress) : (ImuMouseLeftRelease); + } else { + furi_crash(); } furi_thread_flags_set(furi_thread_get_id(imu->thread), flag); diff --git a/air_mouse/imu_mouse.h b/air_mouse/imu_mouse.h index 76bde31f..e6f1299d 100644 --- a/air_mouse/imu_mouse.h +++ b/air_mouse/imu_mouse.h @@ -12,6 +12,7 @@ typedef struct { typedef enum { ImuMouseKeyRight, + ImuMouseKeyWheel, ImuMouseKeyLeft, } ImuMouseKey; diff --git a/air_mouse/views/air_mouse_view.c b/air_mouse/views/air_mouse_view.c index cd52d45d..b0fd85e5 100644 --- a/air_mouse/views/air_mouse_view.c +++ b/air_mouse/views/air_mouse_view.c @@ -14,60 +14,78 @@ struct AirMouseView { }; typedef struct { - bool left_pressed; - bool up_pressed; - bool ok_pressed; + bool mouse_left_pressed; + bool mouse_wheel_pressed; + bool mouse_right_pressed; + bool mouse_scroll_pressed; bool connected; bool show_ble_icon; } AirMouseModel; -static void air_mouse_view_draw_callback(Canvas* canvas, void* context) { - furi_assert(context); - AirMouseModel* model = context; +#define CONTROLS_X ((64 - 47) / 2) +#define CONTROLS_Y (32u) - canvas_set_color(canvas, ColorBlack); +static void air_mouse_view_draw_controls(Canvas* canvas, AirMouseModel* model) { + canvas_draw_icon(canvas, CONTROLS_X, CONTROLS_Y, &I_Circles_47x47); - if(model->show_ble_icon) { - if(model->connected) { - canvas_draw_icon(canvas, 0, 0, &I_Ble_connected_15x15); - } else { - canvas_draw_icon(canvas, 0, 0, &I_Ble_disconnected_15x15); - } + if(model->mouse_left_pressed) { + canvas_set_bitmap_mode(canvas, 1); + canvas_draw_icon(canvas, CONTROLS_X + 1, CONTROLS_Y + 17, &I_Pressed_Button_13x13); + canvas_set_bitmap_mode(canvas, 0); + canvas_set_color(canvas, ColorWhite); } + canvas_draw_icon(canvas, CONTROLS_X + 3, CONTROLS_Y + 19, &I_Left_mouse_icon_9x9); + canvas_set_color(canvas, ColorBlack); - canvas_draw_icon(canvas, 78, 8, &I_Circles_47x47); - - if(model->ok_pressed) { + if(model->mouse_wheel_pressed) { canvas_set_bitmap_mode(canvas, 1); - canvas_draw_icon(canvas, 95, 25, &I_Pressed_Button_13x13); + canvas_draw_icon(canvas, CONTROLS_X + 17, CONTROLS_Y + 17, &I_Pressed_Button_13x13); canvas_set_bitmap_mode(canvas, 0); canvas_set_color(canvas, ColorWhite); } - canvas_draw_icon(canvas, 97, 27, &I_Left_mouse_icon_9x9); + canvas_draw_icon(canvas, CONTROLS_X + 19, CONTROLS_Y + 19, &I_Wheel_mouse_icon_9x9); canvas_set_color(canvas, ColorBlack); - if(model->up_pressed) { + if(model->mouse_right_pressed) { canvas_set_bitmap_mode(canvas, 1); - canvas_draw_icon(canvas, 95, 9, &I_Pressed_Button_13x13); + canvas_draw_icon(canvas, CONTROLS_X + 33, CONTROLS_Y + 17, &I_Pressed_Button_13x13); canvas_set_bitmap_mode(canvas, 0); canvas_set_color(canvas, ColorWhite); } - canvas_draw_icon(canvas, 97, 11, &I_Right_mouse_icon_9x9); + canvas_draw_icon(canvas, CONTROLS_X + 35, CONTROLS_Y + 19, &I_Right_mouse_icon_9x9); canvas_set_color(canvas, ColorBlack); - if(model->left_pressed) { + if(model->mouse_scroll_pressed) { canvas_set_bitmap_mode(canvas, 1); - canvas_draw_icon(canvas, 79, 25, &I_Pressed_Button_13x13); + canvas_draw_icon(canvas, CONTROLS_X + 17, CONTROLS_Y + 1, &I_Pressed_Button_13x13); canvas_set_bitmap_mode(canvas, 0); canvas_set_color(canvas, ColorWhite); } - canvas_draw_icon(canvas, 81, 27, &I_Scroll_icon_9x9); + canvas_draw_icon(canvas, CONTROLS_X + 19, CONTROLS_Y + 3, &I_Scroll_icon_9x9); canvas_set_color(canvas, ColorBlack); +} + +static void air_mouse_view_draw_callback(Canvas* canvas, void* context) { + furi_assert(context); + AirMouseModel* model = context; + + canvas_set_color(canvas, ColorBlack); + + if(model->show_ble_icon) { + if(model->connected) { + canvas_draw_icon(canvas, 64 / 2 - 15 / 2, 90, &I_Ble_connected_15x15); + } else { + canvas_draw_icon(canvas, 64 / 2 - 15 / 2, 90, &I_Ble_disconnected_15x15); + } + } canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 17, 12, "Air Mouse"); + canvas_draw_str_aligned(canvas, 32, 12, AlignCenter, AlignBottom, "Air Mouse"); + + air_mouse_view_draw_controls(canvas, model); + canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 0, 56, "Press Back to exit"); + canvas_draw_str_aligned(canvas, 32, 127, AlignCenter, AlignBottom, "Back to exit"); } static bool air_mouse_view_input_callback(InputEvent* event, void* context) { @@ -75,28 +93,48 @@ static bool air_mouse_view_input_callback(InputEvent* event, void* context) { AirMouseView* air_mouse = context; bool consumed = false; - if(event->key == InputKeyOk) { + if(event->key == InputKeyLeft) { if((event->type == InputTypePress) || (event->type == InputTypeRelease)) { bool state = (event->type == InputTypePress); imu_mouse_key_press(air_mouse->imu, ImuMouseKeyLeft, state); with_view_model( - air_mouse->view, AirMouseModel * model, { model->ok_pressed = state; }, true); + air_mouse->view, + AirMouseModel * model, + { model->mouse_left_pressed = state; }, + true); } consumed = true; - } else if(event->key == InputKeyUp) { + } else if(event->key == InputKeyOk) { + if((event->type == InputTypePress) || (event->type == InputTypeRelease)) { + bool state = (event->type == InputTypePress); + imu_mouse_key_press(air_mouse->imu, ImuMouseKeyWheel, state); + with_view_model( + air_mouse->view, + AirMouseModel * model, + { model->mouse_wheel_pressed = state; }, + true); + } + consumed = true; + } else if(event->key == InputKeyRight) { if((event->type == InputTypePress) || (event->type == InputTypeRelease)) { bool state = (event->type == InputTypePress); imu_mouse_key_press(air_mouse->imu, ImuMouseKeyRight, state); with_view_model( - air_mouse->view, AirMouseModel * model, { model->up_pressed = state; }, true); + air_mouse->view, + AirMouseModel * model, + { model->mouse_right_pressed = state; }, + true); } consumed = true; - } else if(event->key == InputKeyLeft) { + } else if(event->key == InputKeyUp) { if((event->type == InputTypePress) || (event->type == InputTypeRelease)) { bool state = (event->type == InputTypePress); imu_mouse_scroll_mode(air_mouse->imu, state); with_view_model( - air_mouse->view, AirMouseModel * model, { model->left_pressed = state; }, true); + air_mouse->view, + AirMouseModel * model, + { model->mouse_scroll_pressed = state; }, + true); } consumed = true; } @@ -132,6 +170,7 @@ AirMouseView* air_mouse_view_alloc(AirMouseViewExit exit_callback, void* context view_set_input_callback(air_mouse->view, air_mouse_view_input_callback); view_set_enter_callback(air_mouse->view, air_mouse_view_enter); view_set_exit_callback(air_mouse->view, air_mouse_view_exit); + view_set_orientation(air_mouse->view, ViewOrientationVerticalFlip); with_view_model( air_mouse->view, AirMouseModel * model, { model->connected = true; }, true); From 4dc8a30704210b1afcd7aea17ea22e928407aedc Mon Sep 17 00:00:00 2001 From: Aleksandr Kutuzov Date: Sat, 10 Aug 2024 17:18:45 +0900 Subject: [PATCH 2/3] AirMouse: bump version, update changelog and description --- air_mouse/.catalog/CHANGELOG.md | 2 ++ air_mouse/.catalog/README.md | 7 ++++--- air_mouse/.catalog/screenshots/1.png | Bin 2010 -> 2856 bytes air_mouse/application.fam | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/air_mouse/.catalog/CHANGELOG.md b/air_mouse/.catalog/CHANGELOG.md index eb7ac4c1..8d6c424e 100644 --- a/air_mouse/.catalog/CHANGELOG.md +++ b/air_mouse/.catalog/CHANGELOG.md @@ -1,3 +1,5 @@ +## 1.3 + - Vertical layout, faster refresh rate ## 1.2 - Migration to new BLE profile ## 1.1 diff --git a/air_mouse/.catalog/README.md b/air_mouse/.catalog/README.md index e60b7522..d80a2f47 100644 --- a/air_mouse/.catalog/README.md +++ b/air_mouse/.catalog/README.md @@ -4,6 +4,7 @@ The Air Mouse app turns Flipper Zero with the module into a computer mouse. Cont ## Controls -- Left-click: press the OK button. -- Right-click: press the UP button. -- Scrolling: press and hold the LEFT button and tilt your Flipper Zero. +- Left-click: press the Left button. +- Middle-click: press the OK button. +- Right-click: press the Right button. +- Scrolling: press and hold the UP button and tilt your Flipper Zero. diff --git a/air_mouse/.catalog/screenshots/1.png b/air_mouse/.catalog/screenshots/1.png index f89a30653cfe233f7b37a62372c6d496d12042b2..8be6efafa10d9f163c6fdd7ea03cee69c1dc9372 100644 GIT binary patch literal 2856 zcmdT`e^8qD8Gnh%QLW1LY}(a};^8$W=>*i63iv{|nrJS?rqPPVq>2ibqCx-zf{5|9 z+?GqES+=CH3T8T+>;Xx1tg&a&vIRZf_&*K*8g)N@H>DAY-dISZW%xqCM{T*^4 zuN2QL;uWy)l2X3s9)gl-5qZnPNehSW_`#>lL}ZF z()7$iDYuYRgriY|k|ku1gHo1=86_z#DHD<TRBY z6}1mf#1nDUpr~X)5u1D@<$%xFbAoXnibQ-efgl!(@!|wLPf$#VBaui1Vmu)}KGvfV zE37CJF(t8O!f3CHCq7bG!a@OuFXHgZqP#wt1-x<*jKg{EqkPUq9QIT1WkO&29wG?d z8$ukONO-L7J(1rPa9ExwUVkty2}kf^CHTO4vL^V`_8k1gvC2Gb2|Tm}pP!raP#VZj z%Mn7*i(%d$3aYFBl}A=`Fy%Lyl6sqo{-?V)!`~WXY#m|Be_gYDEpj^KlU+6Yb{$e& z?zaR}f^x4rzqzzK=Y8xzRizV~DX&R_{f9yc4>!^{qN6EezuPhw#3U zqMjddsNEZvVMk1_w7wZB?VPSqOJg_KTb|h6Z;@5Ek6x!vw$3Q$nVsrDpQlR*YNg&X z=^9ln|MaM^e;v`dY@@Zu4!tHf*Cx-Z6tbb2v+<}WF-yO-LXGxg4y7GFfE8MAQs@5A zUR!+H$nwQFT7YRQAF7jxS`>!KsogTeBTZG6l41@E^TEfD2h8UTo^y@vG3&>Vo{-Z% z(usd}fHq8_ae+!%U+Ce^ypuXOuvs?O^FAZ_5SlH@L2kp8 z2KDLpc0R|;eURAwa_d0UzJ7gPqWRJQL)H`Dym6bzKeRZ;5 zF{?9f^^Jjfn^aq3or(wj64?_`PYTo z)QPnQm$*-nf7*=&5QGu=+6=CNp-UVLmzD#A@qmrNQR}?kO*Q&S^YZ>i>lGWCI_v}V zw-E=FYG_QgYZ{m~>#D;&n&Er}fNSarZ7Vi)72A@!o07R9-4@9QBrd&j$Vpu9&gy!_ z-@h-*s+$$+S-tf=rF(t``-~iN?Uja{(#82|^UNxkoFi+4EhEZGMDdpyMGQbqzkyB? zxUFx9Te%T#HG7iriEn%C8;YDd;}j#k82zG~GwZCr0n-1}JGO?tHnEHPJ*-Ta`|GkJ zcvukwlE9k-cI4!0zOJntT6CL&jX{1py9WV#)!EUQMY=T(;;=Cbm;?mPrl_`G_Jw9+ zi1|A4Lye2l!=N$FfdXTda*UI%W9BW&i00+Z%RiI@gITinTXwebYyXx~9!KA+vrP~! zb!$tB&vVh#8QPY(L@Hd#eJI=u+PE9m8unPzs&W^Xzyf=QzNY@rwvK7iY>l4wD#-NW zctA-@zx|kr(&q+z#&)6a{rILxlOf^JeZ!Yqg<1HH($L(WVUvTQv6VWY+}|&aH}=L1 zfGjTF3+O$PjehlmnU{dKuN;u3_vo7g0*fqZ=~~N8(ABc)u(Pcr%7u!C5x)q!1BiZp z;r~KA%(?y(D$~1h?z&fuN?uH4pnu5a*?B7K&7+Dx>+DH@uX$8D-$1G|2HA_j=)u~U zhVp*5-pQl!F+gtu!~c9txbZ+uvaUl4zpfPuXkERfQ+2q`Z&vFZ{v{@inA)i^Y-&0~ zpSqYwMJ{|q%Qq=#z^O;lW})UgPsyHk9{&RD2q+oHObq&2tVT6*7u)R*%drdPfX{Yx z=j{e-m4Al!%BtV(F6gr(H6|S}RA8ry#Hstfkk_s4sx_U4gy?mHyvv=3l5# zKi?56%X2ZSKW)h*$wlAXB>TQd8CrTJJSIJ864yg_amxA;^O8ALZG8chqRbRf-*FOq9Gkbec_Es6 z7v@fnS-PiJk=~sN>#F)8z^Qp#xTICQsk(Dswy(7lf5N|FE^gp&Z(q5JsL2d@$JmV8 z7XEkt$iyxk{|vUM9LcjemKJ0JGf}aT8Y$clfXZJsR4kkUHF2Xqj)B`!ZZyq%KX4E3 MPfuz6ZGO$a0Y}Yv+W-In literal 2010 zcmb_ddsLEV7=O|7mX}WFbkS4dW}cQECgpT364Yu+t<1uEB95hbDQ_tPBAm`@ZQ4Ag zcnh&+Tc#u`p%NjU+2%BrGL`ZIYi6XF7%3>IOpl(^hx>PbeCPeX^Sr<3^7}o{^Zj`8 zgrAL-gB1Y42J3(L6aXemuP|V-d>mDWA(sxzWdE=<05)A*eqgc~cqRbmx!A)#xJ=f& zVV|FeJU6a?n!C5HeJ=GXOQNu>FTQ4d$aCydmm3CA*|iJ&@OXVi)z0w|G2O7J44~;1 zdbqezEdaeVD%Bih{s4f53jn^fhDUE}q!?m0!4phbZwB6fI-FqaC_YftSSz1t6J7PpKE`JTd3IbU_uh1+!~f+S?sfZ z#pkA_yXYGFw)C>>V_Y%G5gAXrjoPDaj+G!OjixN_kr*x6_W27jgC`LRD6`L}l{0w*<%RF=kd?EzH)$1` z`|3wZCe(MEl~kWcaYOb;7#t(s9AYY>I~$%Dh!B72DAT6Wl>5p_spNNT@T@j8EGKa^ z){c{$sH%ii^*r2Lq$J=PEDsWk68cDAj^L{Up+p(4rOPrP??@8&|33fo{2I)J6k_dzl*&;tVTE?zI;+C=P$d)y6b;j2BH3J0|; zdx^@!d9DQFL|_Lz(|Y&@l4xNB9GQ4JtsfLRb*UE@r6;eKAj#c zli05@eA|{y893+->FrKHFm=~G6LRvR$mpqf`PnNSL%v3KC;wv@(RA)hAKp)e3yEX2 z5Y4VvYycUqeWr}opqdJLy*Bct1Z7E^w_0Nyo)MD5He7|y-SW6DkJjoKcF;geU<_yX zMb|aZ8O`I6Q0GeZybKj%ia8DYh;j$}hlbNqsB+X`u0l((o#H}TuD~9wiz_k5QAR6t zvrNGs!xRcvk)82nbex3Tzq(Zcp4MqDt)g4yPr228*y zqfGt|uOtPYYMFh*Iu+^99e z+op_r!LmwHvV%Sn^k2S`owVy%(Hb(&D3kpxatoe)FbdMg%PVtrEfg#@?;?L804IJB3Elg<^0k@75@pTBw9=S1(Fn|6SywCl}S6_ih|MA(n=XE ziJtYR&Yd~(oQjtX7%5&qH(Kb^%vu z6nDy+(Gl*Akc-aVtZ0_ze_-s=itCTF72CZ6pd3sOgMH9uU0o> Date: Sat, 10 Aug 2024 17:29:12 +0900 Subject: [PATCH 3/3] AirMouse: format sources and remove obsolete view_dispatcher_enable_queue --- air_mouse/air_mouse_app.c | 1 - air_mouse/imu_mouse.c | 8 +- air_mouse/sensors/ICM42688P.h | 2 +- air_mouse/sensors/ICM42688P_regs.h | 288 ++++++++++++++--------------- air_mouse/views/air_mouse_view.c | 3 +- 5 files changed, 150 insertions(+), 152 deletions(-) diff --git a/air_mouse/air_mouse_app.c b/air_mouse/air_mouse_app.c index ad6e747f..656d9088 100644 --- a/air_mouse/air_mouse_app.c +++ b/air_mouse/air_mouse_app.c @@ -206,7 +206,6 @@ static AirMouseApp* air_mouse_alloc(void) { app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); app->air_mouse_view = air_mouse_view_alloc(air_mouse_hid_deinit, app); diff --git a/air_mouse/imu_mouse.c b/air_mouse/imu_mouse.c index 271e2448..eda9618b 100644 --- a/air_mouse/imu_mouse.c +++ b/air_mouse/imu_mouse.c @@ -8,12 +8,12 @@ #define ACCEL_GYRO_RATE DataRate1kHz #define FILTER_SAMPLE_FREQ 1000.f -#define FILTER_BETA 0.08f +#define FILTER_BETA 0.08f -#define SCROLL_RATE_DIV 50 +#define SCROLL_RATE_DIV 50 #define SCROLL_SENSITIVITY_K 0.25f -#define MOUSE_SENSITIVITY_K 30.f -#define EXP_RATE 1.1f +#define MOUSE_SENSITIVITY_K 30.f +#define EXP_RATE 1.1f #define IMU_CALI_AVG 64 diff --git a/air_mouse/sensors/ICM42688P.h b/air_mouse/sensors/ICM42688P.h index b04fb980..c060e84b 100644 --- a/air_mouse/sensors/ICM42688P.h +++ b/air_mouse/sensors/ICM42688P.h @@ -124,4 +124,4 @@ bool icm42688_fifo_read(ICM42688P* icm42688p, ICM42688PFifoPacket* data); #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/air_mouse/sensors/ICM42688P_regs.h b/air_mouse/sensors/ICM42688P_regs.h index 1967534d..cad14542 100644 --- a/air_mouse/sensors/ICM42688P_regs.h +++ b/air_mouse/sensors/ICM42688P_regs.h @@ -3,174 +3,174 @@ #define ICM42688_WHOAMI 0x47 // Bank 0 -#define ICM42688_DEVICE_CONFIG 0x11 -#define ICM42688_DRIVE_CONFIG 0x13 -#define ICM42688_INT_CONFIG 0x14 -#define ICM42688_FIFO_CONFIG 0x16 -#define ICM42688_TEMP_DATA1 0x1D -#define ICM42688_TEMP_DATA0 0x1E -#define ICM42688_ACCEL_DATA_X1 0x1F -#define ICM42688_ACCEL_DATA_X0 0x20 -#define ICM42688_ACCEL_DATA_Y1 0x21 -#define ICM42688_ACCEL_DATA_Y0 0x22 -#define ICM42688_ACCEL_DATA_Z1 0x23 -#define ICM42688_ACCEL_DATA_Z0 0x24 -#define ICM42688_GYRO_DATA_X1 0x25 -#define ICM42688_GYRO_DATA_X0 0x26 -#define ICM42688_GYRO_DATA_Y1 0x27 -#define ICM42688_GYRO_DATA_Y0 0x28 -#define ICM42688_GYRO_DATA_Z1 0x29 -#define ICM42688_GYRO_DATA_Z0 0x2A -#define ICM42688_TMST_FSYNCH 0x2B -#define ICM42688_TMST_FSYNCL 0x2C -#define ICM42688_INT_STATUS 0x2D -#define ICM42688_FIFO_COUNTH 0x2E -#define ICM42688_FIFO_COUNTL 0x2F -#define ICM42688_FIFO_DATA 0x30 -#define ICM42688_APEX_DATA0 0x31 -#define ICM42688_APEX_DATA1 0x32 -#define ICM42688_APEX_DATA2 0x33 -#define ICM42688_APEX_DATA3 0x34 -#define ICM42688_APEX_DATA4 0x35 -#define ICM42688_APEX_DATA5 0x36 -#define ICM42688_INT_STATUS2 0x37 -#define ICM42688_INT_STATUS3 0x38 -#define ICM42688_SIGNAL_PATH_RESET 0x4B -#define ICM42688_INTF_CONFIG0 0x4C -#define ICM42688_INTF_CONFIG1 0x4D -#define ICM42688_PWR_MGMT0 0x4E -#define ICM42688_GYRO_CONFIG0 0x4F -#define ICM42688_ACCEL_CONFIG0 0x50 -#define ICM42688_GYRO_CONFIG1 0x51 +#define ICM42688_DEVICE_CONFIG 0x11 +#define ICM42688_DRIVE_CONFIG 0x13 +#define ICM42688_INT_CONFIG 0x14 +#define ICM42688_FIFO_CONFIG 0x16 +#define ICM42688_TEMP_DATA1 0x1D +#define ICM42688_TEMP_DATA0 0x1E +#define ICM42688_ACCEL_DATA_X1 0x1F +#define ICM42688_ACCEL_DATA_X0 0x20 +#define ICM42688_ACCEL_DATA_Y1 0x21 +#define ICM42688_ACCEL_DATA_Y0 0x22 +#define ICM42688_ACCEL_DATA_Z1 0x23 +#define ICM42688_ACCEL_DATA_Z0 0x24 +#define ICM42688_GYRO_DATA_X1 0x25 +#define ICM42688_GYRO_DATA_X0 0x26 +#define ICM42688_GYRO_DATA_Y1 0x27 +#define ICM42688_GYRO_DATA_Y0 0x28 +#define ICM42688_GYRO_DATA_Z1 0x29 +#define ICM42688_GYRO_DATA_Z0 0x2A +#define ICM42688_TMST_FSYNCH 0x2B +#define ICM42688_TMST_FSYNCL 0x2C +#define ICM42688_INT_STATUS 0x2D +#define ICM42688_FIFO_COUNTH 0x2E +#define ICM42688_FIFO_COUNTL 0x2F +#define ICM42688_FIFO_DATA 0x30 +#define ICM42688_APEX_DATA0 0x31 +#define ICM42688_APEX_DATA1 0x32 +#define ICM42688_APEX_DATA2 0x33 +#define ICM42688_APEX_DATA3 0x34 +#define ICM42688_APEX_DATA4 0x35 +#define ICM42688_APEX_DATA5 0x36 +#define ICM42688_INT_STATUS2 0x37 +#define ICM42688_INT_STATUS3 0x38 +#define ICM42688_SIGNAL_PATH_RESET 0x4B +#define ICM42688_INTF_CONFIG0 0x4C +#define ICM42688_INTF_CONFIG1 0x4D +#define ICM42688_PWR_MGMT0 0x4E +#define ICM42688_GYRO_CONFIG0 0x4F +#define ICM42688_ACCEL_CONFIG0 0x50 +#define ICM42688_GYRO_CONFIG1 0x51 #define ICM42688_GYRO_ACCEL_CONFIG0 0x52 -#define ICM42688_ACCEL_CONFIG1 0x53 -#define ICM42688_TMST_CONFIG 0x54 -#define ICM42688_APEX_CONFIG0 0x56 -#define ICM42688_SMD_CONFIG 0x57 -#define ICM42688_FIFO_CONFIG1 0x5F -#define ICM42688_FIFO_CONFIG2 0x60 -#define ICM42688_FIFO_CONFIG3 0x61 -#define ICM42688_FSYNC_CONFIG 0x62 -#define ICM42688_INT_CONFIG0 0x63 -#define ICM42688_INT_CONFIG1 0x64 -#define ICM42688_INT_SOURCE0 0x65 -#define ICM42688_INT_SOURCE1 0x66 -#define ICM42688_INT_SOURCE3 0x68 -#define ICM42688_INT_SOURCE4 0x69 -#define ICM42688_FIFO_LOST_PKT0 0x6C -#define ICM42688_FIFO_LOST_PKT1 0x6D -#define ICM42688_SELF_TEST_CONFIG 0x70 -#define ICM42688_WHO_AM_I 0x75 -#define ICM42688_REG_BANK_SEL 0x76 +#define ICM42688_ACCEL_CONFIG1 0x53 +#define ICM42688_TMST_CONFIG 0x54 +#define ICM42688_APEX_CONFIG0 0x56 +#define ICM42688_SMD_CONFIG 0x57 +#define ICM42688_FIFO_CONFIG1 0x5F +#define ICM42688_FIFO_CONFIG2 0x60 +#define ICM42688_FIFO_CONFIG3 0x61 +#define ICM42688_FSYNC_CONFIG 0x62 +#define ICM42688_INT_CONFIG0 0x63 +#define ICM42688_INT_CONFIG1 0x64 +#define ICM42688_INT_SOURCE0 0x65 +#define ICM42688_INT_SOURCE1 0x66 +#define ICM42688_INT_SOURCE3 0x68 +#define ICM42688_INT_SOURCE4 0x69 +#define ICM42688_FIFO_LOST_PKT0 0x6C +#define ICM42688_FIFO_LOST_PKT1 0x6D +#define ICM42688_SELF_TEST_CONFIG 0x70 +#define ICM42688_WHO_AM_I 0x75 +#define ICM42688_REG_BANK_SEL 0x76 // Bank 1 -#define ICM42688_SENSOR_CONFIG0 0x03 -#define ICM42688_GYRO_CONFIG_STATIC2 0x0B -#define ICM42688_GYRO_CONFIG_STATIC3 0x0C -#define ICM42688_GYRO_CONFIG_STATIC4 0x0D -#define ICM42688_GYRO_CONFIG_STATIC5 0x0E -#define ICM42688_GYRO_CONFIG_STATIC6 0x0F -#define ICM42688_GYRO_CONFIG_STATIC7 0x10 -#define ICM42688_GYRO_CONFIG_STATIC8 0x11 -#define ICM42688_GYRO_CONFIG_STATIC9 0x12 +#define ICM42688_SENSOR_CONFIG0 0x03 +#define ICM42688_GYRO_CONFIG_STATIC2 0x0B +#define ICM42688_GYRO_CONFIG_STATIC3 0x0C +#define ICM42688_GYRO_CONFIG_STATIC4 0x0D +#define ICM42688_GYRO_CONFIG_STATIC5 0x0E +#define ICM42688_GYRO_CONFIG_STATIC6 0x0F +#define ICM42688_GYRO_CONFIG_STATIC7 0x10 +#define ICM42688_GYRO_CONFIG_STATIC8 0x11 +#define ICM42688_GYRO_CONFIG_STATIC9 0x12 #define ICM42688_GYRO_CONFIG_STATIC10 0x13 -#define ICM42688_XG_ST_DATA 0x5F -#define ICM42688_YG_ST_DATA 0x60 -#define ICM42688_ZG_ST_DATA 0x61 -#define ICM42688_TMSTVAL0 0x62 -#define ICM42688_TMSTVAL1 0x63 -#define ICM42688_TMSTVAL2 0x64 -#define ICM42688_INTF_CONFIG4 0x7A -#define ICM42688_INTF_CONFIG5 0x7B -#define ICM42688_INTF_CONFIG6 0x7C +#define ICM42688_XG_ST_DATA 0x5F +#define ICM42688_YG_ST_DATA 0x60 +#define ICM42688_ZG_ST_DATA 0x61 +#define ICM42688_TMSTVAL0 0x62 +#define ICM42688_TMSTVAL1 0x63 +#define ICM42688_TMSTVAL2 0x64 +#define ICM42688_INTF_CONFIG4 0x7A +#define ICM42688_INTF_CONFIG5 0x7B +#define ICM42688_INTF_CONFIG6 0x7C // Bank 2 #define ICM42688_ACCEL_CONFIG_STATIC2 0x03 #define ICM42688_ACCEL_CONFIG_STATIC3 0x04 #define ICM42688_ACCEL_CONFIG_STATIC4 0x05 -#define ICM42688_XA_ST_DATA 0x3B -#define ICM42688_YA_ST_DATA 0x3C -#define ICM42688_ZA_ST_DATA 0x3D +#define ICM42688_XA_ST_DATA 0x3B +#define ICM42688_YA_ST_DATA 0x3C +#define ICM42688_ZA_ST_DATA 0x3D // Bank 4 -#define ICM42688_APEX_CONFIG1 0x40 -#define ICM42688_APEX_CONFIG2 0x41 -#define ICM42688_APEX_CONFIG3 0x42 -#define ICM42688_APEX_CONFIG4 0x43 -#define ICM42688_APEX_CONFIG5 0x44 -#define ICM42688_APEX_CONFIG6 0x45 -#define ICM42688_APEX_CONFIG7 0x46 -#define ICM42688_APEX_CONFIG8 0x47 -#define ICM42688_APEX_CONFIG9 0x48 +#define ICM42688_APEX_CONFIG1 0x40 +#define ICM42688_APEX_CONFIG2 0x41 +#define ICM42688_APEX_CONFIG3 0x42 +#define ICM42688_APEX_CONFIG4 0x43 +#define ICM42688_APEX_CONFIG5 0x44 +#define ICM42688_APEX_CONFIG6 0x45 +#define ICM42688_APEX_CONFIG7 0x46 +#define ICM42688_APEX_CONFIG8 0x47 +#define ICM42688_APEX_CONFIG9 0x48 #define ICM42688_ACCEL_WOM_X_THR 0x4A #define ICM42688_ACCEL_WOM_Y_THR 0x4B #define ICM42688_ACCEL_WOM_Z_THR 0x4C -#define ICM42688_INT_SOURCE6 0x4D -#define ICM42688_INT_SOURCE7 0x4E -#define ICM42688_INT_SOURCE8 0x4F -#define ICM42688_INT_SOURCE9 0x50 -#define ICM42688_INT_SOURCE10 0x51 -#define ICM42688_OFFSET_USER0 0x77 -#define ICM42688_OFFSET_USER1 0x78 -#define ICM42688_OFFSET_USER2 0x79 -#define ICM42688_OFFSET_USER3 0x7A -#define ICM42688_OFFSET_USER4 0x7B -#define ICM42688_OFFSET_USER5 0x7C -#define ICM42688_OFFSET_USER6 0x7D -#define ICM42688_OFFSET_USER7 0x7E -#define ICM42688_OFFSET_USER8 0x7F +#define ICM42688_INT_SOURCE6 0x4D +#define ICM42688_INT_SOURCE7 0x4E +#define ICM42688_INT_SOURCE8 0x4F +#define ICM42688_INT_SOURCE9 0x50 +#define ICM42688_INT_SOURCE10 0x51 +#define ICM42688_OFFSET_USER0 0x77 +#define ICM42688_OFFSET_USER1 0x78 +#define ICM42688_OFFSET_USER2 0x79 +#define ICM42688_OFFSET_USER3 0x7A +#define ICM42688_OFFSET_USER4 0x7B +#define ICM42688_OFFSET_USER5 0x7C +#define ICM42688_OFFSET_USER6 0x7D +#define ICM42688_OFFSET_USER7 0x7E +#define ICM42688_OFFSET_USER8 0x7F // PWR_MGMT0 -#define ICM42688_PWR_TEMP_ON (0 << 5) -#define ICM42688_PWR_TEMP_OFF (1 << 5) -#define ICM42688_PWR_IDLE (1 << 4) -#define ICM42688_PWR_GYRO_MODE_OFF (0 << 2) -#define ICM42688_PWR_GYRO_MODE_LN (3 << 2) +#define ICM42688_PWR_TEMP_ON (0 << 5) +#define ICM42688_PWR_TEMP_OFF (1 << 5) +#define ICM42688_PWR_IDLE (1 << 4) +#define ICM42688_PWR_GYRO_MODE_OFF (0 << 2) +#define ICM42688_PWR_GYRO_MODE_LN (3 << 2) #define ICM42688_PWR_ACCEL_MODE_OFF (0 << 0) -#define ICM42688_PWR_ACCEL_MODE_LP (2 << 0) -#define ICM42688_PWR_ACCEL_MODE_LN (3 << 0) +#define ICM42688_PWR_ACCEL_MODE_LP (2 << 0) +#define ICM42688_PWR_ACCEL_MODE_LN (3 << 0) // GYRO_CONFIG0 -#define ICM42688_GFS_2000DPS (0x00 << 5) -#define ICM42688_GFS_1000DPS (0x01 << 5) -#define ICM42688_GFS_500DPS (0x02 << 5) -#define ICM42688_GFS_250DPS (0x03 << 5) -#define ICM42688_GFS_125DPS (0x04 << 5) -#define ICM42688_GFS_62_5DPS (0x05 << 5) -#define ICM42688_GFS_31_25DPS (0x06 << 5) +#define ICM42688_GFS_2000DPS (0x00 << 5) +#define ICM42688_GFS_1000DPS (0x01 << 5) +#define ICM42688_GFS_500DPS (0x02 << 5) +#define ICM42688_GFS_250DPS (0x03 << 5) +#define ICM42688_GFS_125DPS (0x04 << 5) +#define ICM42688_GFS_62_5DPS (0x05 << 5) +#define ICM42688_GFS_31_25DPS (0x06 << 5) #define ICM42688_GFS_15_625DPS (0x07 << 5) -#define ICM42688_GODR_32kHz 0x01 -#define ICM42688_GODR_16kHz 0x02 -#define ICM42688_GODR_8kHz 0x03 -#define ICM42688_GODR_4kHz 0x04 -#define ICM42688_GODR_2kHz 0x05 -#define ICM42688_GODR_1kHz 0x06 -#define ICM42688_GODR_200Hz 0x07 -#define ICM42688_GODR_100Hz 0x08 -#define ICM42688_GODR_50Hz 0x09 -#define ICM42688_GODR_25Hz 0x0A +#define ICM42688_GODR_32kHz 0x01 +#define ICM42688_GODR_16kHz 0x02 +#define ICM42688_GODR_8kHz 0x03 +#define ICM42688_GODR_4kHz 0x04 +#define ICM42688_GODR_2kHz 0x05 +#define ICM42688_GODR_1kHz 0x06 +#define ICM42688_GODR_200Hz 0x07 +#define ICM42688_GODR_100Hz 0x08 +#define ICM42688_GODR_50Hz 0x09 +#define ICM42688_GODR_25Hz 0x0A #define ICM42688_GODR_12_5Hz 0x0B -#define ICM42688_GODR_500Hz 0x0F +#define ICM42688_GODR_500Hz 0x0F // ACCEL_CONFIG0 #define ICM42688_AFS_16G (0x00 << 5) -#define ICM42688_AFS_8G (0x01 << 5) -#define ICM42688_AFS_4G (0x02 << 5) -#define ICM42688_AFS_2G (0x03 << 5) +#define ICM42688_AFS_8G (0x01 << 5) +#define ICM42688_AFS_4G (0x02 << 5) +#define ICM42688_AFS_2G (0x03 << 5) -#define ICM42688_AODR_32kHz 0x01 -#define ICM42688_AODR_16kHz 0x02 -#define ICM42688_AODR_8kHz 0x03 -#define ICM42688_AODR_4kHz 0x04 -#define ICM42688_AODR_2kHz 0x05 -#define ICM42688_AODR_1kHz 0x06 -#define ICM42688_AODR_200Hz 0x07 -#define ICM42688_AODR_100Hz 0x08 -#define ICM42688_AODR_50Hz 0x09 -#define ICM42688_AODR_25Hz 0x0A -#define ICM42688_AODR_12_5Hz 0x0B -#define ICM42688_AODR_6_25Hz 0x0C -#define ICM42688_AODR_3_125Hz 0x0D +#define ICM42688_AODR_32kHz 0x01 +#define ICM42688_AODR_16kHz 0x02 +#define ICM42688_AODR_8kHz 0x03 +#define ICM42688_AODR_4kHz 0x04 +#define ICM42688_AODR_2kHz 0x05 +#define ICM42688_AODR_1kHz 0x06 +#define ICM42688_AODR_200Hz 0x07 +#define ICM42688_AODR_100Hz 0x08 +#define ICM42688_AODR_50Hz 0x09 +#define ICM42688_AODR_25Hz 0x0A +#define ICM42688_AODR_12_5Hz 0x0B +#define ICM42688_AODR_6_25Hz 0x0C +#define ICM42688_AODR_3_125Hz 0x0D #define ICM42688_AODR_1_5625Hz 0x0E -#define ICM42688_AODR_500Hz 0x0F +#define ICM42688_AODR_500Hz 0x0F diff --git a/air_mouse/views/air_mouse_view.c b/air_mouse/views/air_mouse_view.c index b0fd85e5..e87b7fa5 100644 --- a/air_mouse/views/air_mouse_view.c +++ b/air_mouse/views/air_mouse_view.c @@ -172,8 +172,7 @@ AirMouseView* air_mouse_view_alloc(AirMouseViewExit exit_callback, void* context view_set_exit_callback(air_mouse->view, air_mouse_view_exit); view_set_orientation(air_mouse->view, ViewOrientationVerticalFlip); - with_view_model( - air_mouse->view, AirMouseModel * model, { model->connected = true; }, true); + with_view_model(air_mouse->view, AirMouseModel * model, { model->connected = true; }, true); return air_mouse; }