From c37f71939a613549c0532351a0605156b7b43ddf Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 1 Oct 2017 14:55:13 +0200 Subject: [PATCH] add basic Yunmai Mini scale support (currently only weight and fat) --- .../bluetooth/BluetoothCommunication.java | 4 +- .../core/bluetooth/BluetoothYunmaiMini.java | 162 ++++++++++++++++++ .../gui/activities/DataEntryActivity.java | 4 +- .../app/src/main/res/drawable-hdpi/ic_amr.png | Bin 593 -> 0 bytes .../src/main/res/drawable-hdpi/ic_kcal.png | Bin 795 -> 0 bytes .../app/src/main/res/drawable-ldpi/ic_amr.png | Bin 311 -> 0 bytes .../src/main/res/drawable-ldpi/ic_kcal.png | Bin 405 -> 0 bytes .../app/src/main/res/drawable-mdpi/ic_amr.png | Bin 405 -> 0 bytes .../src/main/res/drawable-mdpi/ic_kcal.png | Bin 524 -> 0 bytes .../src/main/res/drawable-xhdpi/ic_amr.png | Bin 804 -> 0 bytes .../src/main/res/drawable-xhdpi/ic_kcal.png | Bin 1173 -> 0 bytes .../src/main/res/drawable-xxhdpi/ic_amr.png | Bin 1239 -> 0 bytes .../src/main/res/drawable-xxhdpi/ic_kcal.png | Bin 1665 -> 0 bytes .../src/main/res/drawable-xxxhdpi/ic_amr.png | Bin 1728 -> 0 bytes .../src/main/res/drawable-xxxhdpi/ic_kcal.png | Bin 2092 -> 0 bytes 15 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothYunmaiMini.java delete mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_kcal.png delete mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_kcal.png delete mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_kcal.png delete mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_kcal.png delete mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_kcal.png delete mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_amr.png delete mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_kcal.png diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothCommunication.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothCommunication.java index 95b8c2e0..01b386fa 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothCommunication.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothCommunication.java @@ -38,7 +38,7 @@ public abstract class BluetoothCommunication { BT_CONNECTION_LOST, BT_NO_DEVICE_FOUND, BT_UNEXPECTED_ERROR, BT_SCALE_MESSAGE }; public enum BT_MACHINE_STATE {BT_INIT_STATE, BT_CMD_STATE, BT_CLEANUP_STATE} - public enum BT_DEVICE_ID {CUSTOM_OPENSCALE, MI_SCALE_V1, SANITAS_SBF70, MEDISANA_BS444, DIGOO_DGS038H, EXCELVANT_CF369BLE} + public enum BT_DEVICE_ID {CUSTOM_OPENSCALE, MI_SCALE_V1, SANITAS_SBF70, MEDISANA_BS444, DIGOO_DGS038H, EXCELVANT_CF369BLE, YUNMAI_MINI} protected Context context; @@ -89,6 +89,8 @@ public abstract class BluetoothCommunication { return new BluetoothDigooDGSO38H(context); case EXCELVANT_CF369BLE: return new BluetoothExcelvanCF369BLE(context); + case YUNMAI_MINI: + return new BluetoothYunmaiMini(context); } return null; diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothYunmaiMini.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothYunmaiMini.java new file mode 100644 index 00000000..6e6ac17c --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothYunmaiMini.java @@ -0,0 +1,162 @@ +/* Copyright (C) 2017 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ + +package com.health.openscale.core.bluetooth; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import com.health.openscale.core.OpenScale; +import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.core.datatypes.ScaleUser; + +import java.util.Date; +import java.util.Random; +import java.util.UUID; + +public class BluetoothYunmaiMini extends BluetoothCommunication { + private final UUID WEIGHT_MEASUREMENT_SERVICE = UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb"); + private final UUID WEIGHT_MEASUREMENT_CHARACTERISTIC = UUID.fromString("0000ffe4-0000-1000-8000-00805f9b34fb"); + private final UUID WEIGHT_CMD_SERVICE = UUID.fromString("0000ffe5-0000-1000-8000-00805f9b34fb"); + private final UUID WEIGHT_CMD_CHARACTERISTIC = UUID.fromString("0000ffe9-0000-1000-8000-00805f9b34fb"); + + private final UUID WEIGHT_MEASUREMENT_CONFIG = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); + + public BluetoothYunmaiMini(Context context) { + super(context); + } + + @Override + public String deviceName() { + return "Yunmai Mini"; + } + + @Override + public String defaultDeviceName() { + return "YUNMAI-SIGNAL-M1US"; + } + + @Override + public boolean checkDeviceName(String btDeviceName) { + if (btDeviceName.startsWith("YUNMAI-SIGNAL-M")) { + return true; + } + + return false; + } + + @Override + boolean nextInitCmd(int stateNr) { + switch (stateNr) { + case 0: + int user_id = getUniqueNumber(); + + final ScaleUser selectedUser = OpenScale.getInstance(context).getSelectedScaleUser(); + byte sex = selectedUser.isMale() ? (byte)0x01 : (byte)0x02; + byte display_unit = selectedUser.scale_unit == 0 ? (byte) 0x01 : (byte) 0x02; + + byte[] user_add_or_query = new byte[]{(byte)0x0d, (byte)0x12, (byte)0x10, (byte)0x01, (byte)0x00, (byte) 0x00, (byte) ((user_id & 0xFF00) >> 8), (byte) ((user_id & 0xFF) >> 0), (byte)selectedUser.body_height, (byte)sex, (byte) selectedUser.getAge(), (byte) 0x55, (byte) 0x5a, (byte) 0x00, (byte)0x00, (byte) display_unit, (byte) 0x03, (byte) 0x00 }; + user_add_or_query[17] = xor_checksum(user_add_or_query); + writeBytes(WEIGHT_CMD_SERVICE, WEIGHT_CMD_CHARACTERISTIC, user_add_or_query); + break; + case 1: + setNotificationOn(WEIGHT_MEASUREMENT_SERVICE, WEIGHT_MEASUREMENT_CHARACTERISTIC, WEIGHT_MEASUREMENT_CONFIG); + break; + case 2: + byte[] magic_bytes = new byte[]{(byte)0x0d, (byte)0x05, (byte)0x13, (byte)0x00, (byte)0x16}; + writeBytes(WEIGHT_CMD_SERVICE, WEIGHT_CMD_CHARACTERISTIC, magic_bytes); + break; + default: + return false; + } + + return true; + } + + @Override + boolean nextBluetoothCmd(int stateNr) { + return false; + } + + @Override + boolean nextCleanUpCmd(int stateNr) { + return false; + } + + @Override + public void onBluetoothDataChange(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic gattCharacteristic) { + final byte[] data = gattCharacteristic.getValue(); + + if (data != null && data.length > 0) { + + // if finished weighting? + if (data[3] == 0x02) { + parseBytes(data); + } + } + } + + private void parseBytes(byte[] weightBytes) { + long unix_timestamp = ((weightBytes[5] & 0xFF) << 24) | ((weightBytes[6] & 0xFF) << 16) | ((weightBytes[7] & 0xFF) << 8) | (weightBytes[8] & 0xFF); + Date btDate = new Date(); + btDate.setTime(unix_timestamp*1000); + + float weight = (float) (((weightBytes[13] & 0xFF) << 8) | (weightBytes[14] & 0xFF)) / 100.0f; + float fat = (float)(((weightBytes[17] & 0xFF) << 8) | (weightBytes[18] & 0xFF)) / 100.0f; + + ScaleData scaleBtData = new ScaleData(); + + final ScaleUser selectedUser = OpenScale.getInstance(context).getSelectedScaleUser(); + + scaleBtData.setConvertedWeight(weight, selectedUser.scale_unit); + scaleBtData.setFat(fat); + scaleBtData.setDateTime(btDate); + + addScaleData(scaleBtData); + } + + private int getUniqueNumber() { + int uniqueNumber; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + uniqueNumber = prefs.getInt("uniqueNumber", 0x00); + + if (uniqueNumber == 0x00) { + Random r = new Random(); + uniqueNumber = r.nextInt(65535 - 100 + 1) + 100; + + prefs.edit().putInt("uniqueNumber", uniqueNumber).commit(); + } + + int userId = prefs.getInt("selectedUserId", -1); + + return uniqueNumber + userId; + } + + private byte xor_checksum(byte[] data) { + byte checksum = 0x00; + + for (int i=0; i`X88C7&3PLE$EF4l;h+dYJj9|2qk>SGMvL&Y{Cw#!qhCF z)p3&RD8#llJpV_CEZc{hIE*8yzK?i?d%|umfNcqf6A926IE&#rfnCJ@8a^kXE7f>f zb@r8T9$)GN_BVS2-Q#pT#YWYdBLx37^fw5o41F1$Be;QGLY5^}#AX~5YSuf9)&Z!y zAjC+mV)hAlaR*O?EF4YwOc%0eC6)?_(S}7r2Df4^re&-#ge`@*6X}XwO9R3+(<@Z> zvT%(37>qtm!Z8;k%t9;{vbtUMH8YIexCQSuK3KCtVnis!E0SNk4wq$L2lci={J>GH zmx|9q;<;H!@fPgFqX_##xZQ_^^DoC;?Tfx8%#X)Wzy_hHwhMm%GvnBYn2jrV?a#|O fSFT*Sa*e0oO2IIj71EVV00000NkvXXu0mjfil_{u diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_kcal.png b/android_app/app/src/main/res/drawable-hdpi/ic_kcal.png deleted file mode 100644 index 53727cdb7753249e8b37423eb9295493a5e5fcdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmV+$1LXXPP)w7Tvp~6}Lo5)TZ4C5r2fF3&eG3 zrMI^&2~tWdEHtsPuwubZ5D^iUY!DP_rPYdt9Wi6^oF{X7`rgh=XXdw=>3PpN{q(%& z)(n1W0iFU&fft@_7d;z+XQspjhPFsiK49p-CIG0fOlmQii?rLCK3`AE`5L5T0sWSqcs|IR2GJ#(quSx&< zk&wE5=Gl-{wy3Xf6Yw2)&HUFCuyBd%$XpKT=e&7#7RZ`@y|V?GGcLwO^#dnjFfQr? zPymklV739XF&NDtrOA6Gq0i;O7vMK=+XuA-xC{IPI*?I{%3Q>EH;uppU^TE8cm_-W zSAhoLS`tb(x51b?$0?1>kon#hfq8EPDj;C$VYJT}0tL%nP2QkS3Z;%DD)u&-6vQged4&^D5PyM7c0q=lsz=m=<(4~6M zd|s~rlS8gNv&em{?C7=julXFV05bz@t^}hw2pmGTe_xc1DeHQh6ur`>nNK=rCV}PwTH6{#YW7gIKqtTnE{!89mPmCsy+#0{p*KNMQ%E2< zBYBlbm=njkU1EJ3bfkqmX0tDwk@)Ptow0tf?;=Z+fSDp&+C^k_`mC=Us9d+LMI~YR zV~4N}4RU3M(s{QSJue+Z>rY@8WT*RfWrCul)U+*2TQ>)bkGU zZl!~g+y3|Se!g*L$EpXm*VZOlW<8xz$$7o`Prr|8%>J%Pei0g*YqkUZ&EVw5LA->Z5>u{Q7*jgtAHw21@E z;vDnuh5W==#8q663fsVQZc!CIT%kEEq>DB#V^KZEEzE_p7ADIeUvY%-i05z<-=MqC z;rJGnBG8{m%9nEyu1IILk50fJ@F@?fNVn5OEy`&}d==v#*uoyp@E^-XuBzeSCg*NG z%IRPQ-{OBgfVDE%nSK+F;d?+}7mEY=8LV0a%WkSIHDw1&*opE#6y%?xlAp-R`HgKX z;03?%ShTZr6y2hUDcnnK&?{M-=_8J@UY1b99iEgw+;OS@N+FqMq$}>}_tPNcP-^C( zH7y-zJK_nPV09Eo9`+?5Ywv+%YT%#rz~ATn@ZVK@%}_zw_!0z?gs%t^y2+SSn2ec%~}bLPx5^UN8_DC0g* zg*hys>n;RZ@F%#7_SjMrD>K4(O}-d125r|2k(zr;~S;26CaC}q=1450~M@Cu!h z6{C2EH>kBY&Ad4ik8RF+7tjcvQmS_Txt5QJ=#Iwy}dP%)n$Ud>e(W z_~gQpQn(%t6vw}bp%D0pwh-#VR21JtEX!Xx9HKFE^*lb{Jr;2$wdNqY(Gz?ud4C<| zayUoD6$_5=U3$nL*p$3Ki2MUQks75pSm?r^7>1?)u;4PTN-f_^die@G54Aq2&wool z_+iY~P#e}XL@pomYHVN+vzW)pKddXGj2qxDJVgsxHExr2Y~o17jWB7A1AZCbFjZJ@po{h>@HT$oZb|NB7;Ir?H}K^+oO|Bv%bn1x zelha1JAtnT;CRHR12P?JU1_4S79xKWw}-*kq%U-`u%0U|!n1DSH$LKNmBA+Nm8|E= z%X)qY8@Po1c#kK844MI1EP*fSwIlaD!`E>D5AhD)F)_$wCLr?#c-ASso^ME_+`$*T zkfv_CX=)ZmfoJ7PS0bJpCp>Ff@5gD-b3U>f(j~0?Bk&LPJ!gaeRt8`I O0000aIS|SU=KryhWw1^aP0&yXR4wi0cj(Q`@BJI!%qZM1 z9Js&VJNKS*?w@n+?~%!5GMP*!lW7HuupbAo8l|yyr#bGypD0(z2WT5hr4N@L5c5 zpwBEERy}|dN$+vo*l5nq9`SlE^?sm9`%L;CpfCy78k}&AtZuwuvBSV!FsYGg5n!s6kW3d7D*bj5o2Z zlnfT_@!@a{KPBnGIb29m9;DlWiK#u^z%v#!urI}Tcn(KWfSvd{jdzEr)@wzfxj#vJ>a#!TJSMK{)9@g^5tVg;NW;f! iIiAU6GMP*!li@#*5dg8FC{TGahZUi;N z=*F11P~#NiuyWX{3kL|nD2{+M^Q53b(ZnG!g2R$PFt&@T;#S{&@AiH7J)75Ga+8-D z&i%fsbI&@%I;|z)q~d&jR7M zFhf}RU8cZJtTdi{!VtFUV-YLyi`L{5h6Fe2I}xiCd65BDa#=M;T5$tsVL|m>QzXb>4?;WZ|%rTbyMObK( zMdWe*O~L2$5P1+wTFje|opH=wfq25Ch1e_ceSFa-%*y%}VPEXq83`xM!6&irD`Dl! zSftp=d?#kL7~2TT6d&xyHij1|++jpm$vWf{78@(#1)RYHy&(TXH2fY0D#k9v9)&yP zMSJTdUY*rmz%9w+X6>gJuqK=51{Pm^2#v;lga&b-a z$!+p)q8y!aJX1k_Dej6k(>HNlry{n;$p_kqXhl9DPgbo&B=UdZhS;_O8-&IC$Jmd0 zqk36?4CV=$b`<-CkeQR;+J<~Wo+t8*{d7kD#!_2)PT~zkh}~msBJ4=Sm(j?+NNRQs z^0|opnTY4(@4qwhGlb}KPWUEn!}Qpf=ZW1KX6$lFP?vl{P9l-NDeJ#IwtrS*e&ezu z7cq*XI*ao!YE7PESE{maE@DLcz)*?#adM|V`JC}SpCi>;S506i7f}`6Dp9WOtLmKT zcrA|o4cD|7vsw}9>R^E)&(zIR<1kl|b=!%Uj@MO_hezX>$2xd_SwvNyYKwA+&5caM zON!cN?YP
Y@(VxXMJCPH2S?$Gd1G|%{CHw~}Ewo_OW$4rgVD%op^hhP?K%9eJ3nuSo{>+uN2uG+;!fNhjlbHh;TD*U4;5~6X|D`Fq}Yk0 zx~wAGU_iKN7!@uami5p!xL4STJZv5kT&i2-D}PK6SH6r#;!8FwGWKo_4dUgeMEM#s2|6zPtu-Z( n@5Gc@`7(y^fp9b(?#9r6Z%Lf_dDn&o00000NkvXXu0mjf3(!AO diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_amr.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_amr.png deleted file mode 100644 index adab899ea2915e7650a099819c59adaebec5aa22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1239 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 LNkvXXu0mjf1(*-X diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_amr.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_amr.png deleted file mode 100644 index 903fbd4f2926a1ee020b59e0d2a93226d755fed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1728 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