نرم افزار تست را راه اندازی کنید

ارزیابی سخت افزار از نرم افزار زیر استفاده می کند:

  • Audacity (نصب شده روی کامپیوتر)
  • متلب (نصب شده بر روی کامپیوتر)
  • برنامه تست Haptics (نصب شده در DUT)

برای کسب اطلاعات بیشتر در مورد نیازهای سیستم، به Audacity برای Windows ، Audacity برای Mac و MATLAB مراجعه کنید.

Audacity را راه اندازی کنید

Audacity باید برای دریافت ورودی از کارت صدای Sound Blaster با نرخ نمونه‌گیری مشخصی از داده تنظیم شود. پس از اتصال Sound Blaster به پورت USB کامپیوتر خود، Audacity را باز کنید و این دستورالعمل ها را دنبال کنید.

  1. با اتصال فیزیکی خروجی CCLD به درگاه ورودی Line In Sound Blaster، Line (USB Sound Blaster HD) را به عنوان منبع میکروفون ورودی انتخاب کنید.

    ورودی میکروفون

    شکل 1. انتخاب ورودی میکروفون

  2. با انتخاب 48000 در منوی Project Rate ، نرخ نمونه برداری را روی 48 کیلوهرتز تنظیم کنید.

    نرخ نمونه برداری

    شکل 2. تنظیم نرخ نمونه برداری

دانلود متلب

  1. فایل متلب را دانلود کنید.

  2. فایل را استخراج کنید و Effect1NEffect2_V1p0_2020PM.m (برای Effect1 و Effect 2) و Effect3_V1p0_2020PM.m (برای Effect 3) را پیدا کنید.

برنامه تست را روی گوشی تنظیم کنید

در این بخش نحوه راه اندازی برنامه آزمایشی روی گوشی توضیح داده شده است.

برای برنامه آزمایشی آماده شوید

  1. کد منبع را از بلوک های کد جاوا و کاتلین در زیر کپی کنید. هر کدام که برای شما مناسب تر است را انتخاب کنید.
  2. کد خود را با پیروی از پارامترهای رابط کاربری گرافیکی نشان داده شده در شکل 3 بنویسید. در صورت لزوم، جزئیات کد منبع طرح را طوری تنظیم کنید که با تلفن خود مطابقت داشته باشد.
  3. اطمینان حاصل کنید که رابط کاربری گرافیکی شما شامل سه دکمه قابل کلیک و یک نشانگر بصری برای تعیین منطقه برای تعیین محل شتاب سنج است.

    • ناحیه ای که قرار است شتاب سنج را پیدا کنید، نمایانگر بخش واقعی صفحه نمایش دستگاه است که معمولاً با دست لمس می شود.
    • در طول این اندازه‌گیری، می‌توانید شتاب‌سنج را در ناحیه فیروزه‌ای حرکت دهید تا ناحیه‌ای از صفحه را پیدا کنید که قوی‌ترین سیگنال را می‌گیرد.
  4. کد را روی دستگاه اندرویدی نصب کنید.

  5. اگر حالت پیش‌فرض به‌عنوان دکمه‌ها تنظیم شده باشد، به شدت توصیه می‌شود که حالت ناوبری سیستم را روی حالت اشاره‌ای تنظیم کنید.

    • با تنظیم حالت ژست می‌توانید شتاب‌سنج را تا حد امکان در پایین گوشی قرار دهید در حالی که توسط رابط‌های گرافیکی ناوبری سیستم گوشی قطع نمی‌شود.

کد منبع جاوا

package com.example.hapticeffectassessment;

import static android.os.VibrationEffect.EFFECT_CLICK;

import android.graphics.Color;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

 private static final long oneShotTiming = 20;
 private static final int oneShotAmplitude = 255;

 private static final long[] waveformTimings = {500, 500};
 private static final int[] waveformAmplitudes = {128, 255};

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Vibrator vibrator = getSystemService(Vibrator.class);

   // Click R.id.button1 button to generate Effect 1
   findViewById(R.id.button1).setOnClickListener(
       view -> vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK)));

   // Click R.id.button2 button to generate Effect 2
   findViewById(R.id.button2).setOnClickListener(
       view -> vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude)));

   // Click R.id.button3 button to generate Effect 3
   findViewById(R.id.button3).setOnClickListener(view -> {
     vibrator.vibrate(VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1));

     // See quick results of Effect 3
     Button button = (Button) view;
     if (vibrator.hasAmplitudeControl()) {
       button.setText("Effect 3: PASS");
       button.setBackgroundColor(Color.GREEN);
       button.setTextColor(Color.BLACK);
     } else {
       button.setText("Effect 3: FAIL");
       button.setBackgroundColor(Color.RED);
       button.setTextColor(Color.WHITE);
     }
   });
 }
}

کد منبع کاتلین

package com.example.hapticeffectassessment

import android.graphics.Color
import android.os.Bundle
import android.os.VibrationEffect
import android.os.VibrationEffect.EFFECT_CLICK
import android.os.Vibrator
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivityKt : AppCompatActivity() {

 private val oneShotTiming: Long = 20
 private val oneShotAmplitude = 255

 private val waveformTimings = longArrayOf(500, 500)
 private val waveformAmplitudes = intArrayOf(128, 255)

 override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_main)

   val vibrator = getSystemService(Vibrator::class.java)

   // Click button1 to generate Effect 1
   button1.setOnClickListener {
     vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK))
   }

   // Click button2 to generate Effect 2
   button2.setOnClickListener {
     vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude))
   }

   // Click button3 to generate Effect 3
   button3.setOnClickListener {
     vibrator.vibrate(
       VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1))

     // See quick results of Effect 3
     if (vibrator.hasAmplitudeControl()) {
       button3.text = "Effect 3: PASS"
       button3.setBackgroundColor(Color.GREEN)
       button3.setTextColor(Color.BLACK)
     } else {
       button3.text = "Effect 3: FAIL"
       button3.setBackgroundColor(Color.RED)
       button3.setTextColor(Color.WHITE)
     }
   }
 }
}

کد منبع طرح بندی (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <Button
       android:id="@+id/button1"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 1"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

   <Button
       android:id="@+id/button2"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 2"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button1" />

   <Button
       android:id="@+id/button3"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 3"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button2" />

   <View
       android:id="@+id/divider"
       android:layout_width="363dp"
       android:layout_height="1dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="10dp"
       android:layout_marginEnd="32dp"
       android:background="?android:attr/listDivider"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintHorizontal_bias="0.5"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button3" />

   <androidx.constraintlayout.widget.ConstraintLayout
       android:layout_width="363dp"
       android:layout_height="0dp"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintHorizontal_bias="0.5"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/divider">

       <ImageView
           android:id="@+id/imageView"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:adjustViewBounds="true"
           android:scaleType="fitXY"
           app:layout_constraintBottom_toBottomOf="parent"
           app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintHorizontal_bias="0.5"
           app:layout_constraintStart_toStartOf="parent"
           app:layout_constraintTop_toTopOf="parent"
           app:srcCompat="@drawable/bluebar" />
   </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

شتاب سنج

شکل 3. اتصال شتاب سنج در امتداد ناحیه توصیه شده در رابط کاربری گرافیکی

،

ارزیابی سخت افزار از نرم افزار زیر استفاده می کند:

  • Audacity (نصب شده روی کامپیوتر)
  • متلب (نصب شده بر روی کامپیوتر)
  • برنامه تست Haptics (نصب شده در DUT)

برای کسب اطلاعات بیشتر در مورد نیازهای سیستم، به Audacity برای Windows ، Audacity برای Mac و MATLAB مراجعه کنید.

Audacity را راه اندازی کنید

Audacity باید برای دریافت ورودی از کارت صدای Sound Blaster با نرخ نمونه‌گیری مشخصی از داده تنظیم شود. پس از اتصال Sound Blaster به پورت USB کامپیوتر خود، Audacity را باز کنید و این دستورالعمل ها را دنبال کنید.

  1. با اتصال فیزیکی خروجی CCLD به درگاه ورودی Line In Sound Blaster، Line (USB Sound Blaster HD) را به عنوان منبع میکروفون ورودی انتخاب کنید.

    ورودی میکروفون

    شکل 1. انتخاب ورودی میکروفون

  2. با انتخاب 48000 در منوی Project Rate ، نرخ نمونه برداری را روی 48 کیلوهرتز تنظیم کنید.

    نرخ نمونه برداری

    شکل 2. تنظیم نرخ نمونه برداری

دانلود متلب

  1. فایل متلب را دانلود کنید.

  2. فایل را استخراج کنید و Effect1NEffect2_V1p0_2020PM.m (برای Effect1 و Effect 2) و Effect3_V1p0_2020PM.m (برای Effect 3) را پیدا کنید.

برنامه تست را روی گوشی تنظیم کنید

در این بخش نحوه راه اندازی برنامه آزمایشی روی گوشی توضیح داده شده است.

برای برنامه آزمایشی آماده شوید

  1. کد منبع را از بلوک های کد جاوا و کاتلین در زیر کپی کنید. هر کدام که برای شما مناسب تر است را انتخاب کنید.
  2. کد خود را با پیروی از پارامترهای رابط کاربری گرافیکی نشان داده شده در شکل 3 بنویسید. در صورت لزوم، جزئیات کد منبع طرح را طوری تنظیم کنید که با تلفن خود مطابقت داشته باشد.
  3. اطمینان حاصل کنید که رابط کاربری گرافیکی شما شامل سه دکمه قابل کلیک و یک نشانگر بصری برای تعیین منطقه برای تعیین محل شتاب سنج است.

    • ناحیه ای که قرار است شتاب سنج را پیدا کنید، نمایانگر بخش واقعی صفحه نمایش دستگاه است که معمولاً با دست لمس می شود.
    • در طول این اندازه‌گیری، می‌توانید شتاب‌سنج را در ناحیه فیروزه‌ای حرکت دهید تا ناحیه‌ای از صفحه را پیدا کنید که قوی‌ترین سیگنال را می‌گیرد.
  4. کد را روی دستگاه اندرویدی نصب کنید.

  5. اگر حالت پیش‌فرض به‌عنوان دکمه‌ها تنظیم شده باشد، به شدت توصیه می‌شود که حالت ناوبری سیستم را روی حالت اشاره‌ای تنظیم کنید.

    • با تنظیم حالت ژست می‌توانید شتاب‌سنج را تا حد امکان در پایین گوشی قرار دهید در حالی که توسط رابط‌های گرافیکی ناوبری سیستم گوشی قطع نمی‌شود.

کد منبع جاوا

package com.example.hapticeffectassessment;

import static android.os.VibrationEffect.EFFECT_CLICK;

import android.graphics.Color;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

 private static final long oneShotTiming = 20;
 private static final int oneShotAmplitude = 255;

 private static final long[] waveformTimings = {500, 500};
 private static final int[] waveformAmplitudes = {128, 255};

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Vibrator vibrator = getSystemService(Vibrator.class);

   // Click R.id.button1 button to generate Effect 1
   findViewById(R.id.button1).setOnClickListener(
       view -> vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK)));

   // Click R.id.button2 button to generate Effect 2
   findViewById(R.id.button2).setOnClickListener(
       view -> vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude)));

   // Click R.id.button3 button to generate Effect 3
   findViewById(R.id.button3).setOnClickListener(view -> {
     vibrator.vibrate(VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1));

     // See quick results of Effect 3
     Button button = (Button) view;
     if (vibrator.hasAmplitudeControl()) {
       button.setText("Effect 3: PASS");
       button.setBackgroundColor(Color.GREEN);
       button.setTextColor(Color.BLACK);
     } else {
       button.setText("Effect 3: FAIL");
       button.setBackgroundColor(Color.RED);
       button.setTextColor(Color.WHITE);
     }
   });
 }
}

کد منبع کاتلین

package com.example.hapticeffectassessment

import android.graphics.Color
import android.os.Bundle
import android.os.VibrationEffect
import android.os.VibrationEffect.EFFECT_CLICK
import android.os.Vibrator
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivityKt : AppCompatActivity() {

 private val oneShotTiming: Long = 20
 private val oneShotAmplitude = 255

 private val waveformTimings = longArrayOf(500, 500)
 private val waveformAmplitudes = intArrayOf(128, 255)

 override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_main)

   val vibrator = getSystemService(Vibrator::class.java)

   // Click button1 to generate Effect 1
   button1.setOnClickListener {
     vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK))
   }

   // Click button2 to generate Effect 2
   button2.setOnClickListener {
     vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude))
   }

   // Click button3 to generate Effect 3
   button3.setOnClickListener {
     vibrator.vibrate(
       VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1))

     // See quick results of Effect 3
     if (vibrator.hasAmplitudeControl()) {
       button3.text = "Effect 3: PASS"
       button3.setBackgroundColor(Color.GREEN)
       button3.setTextColor(Color.BLACK)
     } else {
       button3.text = "Effect 3: FAIL"
       button3.setBackgroundColor(Color.RED)
       button3.setTextColor(Color.WHITE)
     }
   }
 }
}

کد منبع طرح بندی (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <Button
       android:id="@+id/button1"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 1"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

   <Button
       android:id="@+id/button2"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 2"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button1" />

   <Button
       android:id="@+id/button3"
       android:layout_width="350dp"
       android:layout_height="60dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="5dp"
       android:layout_marginEnd="32dp"
       android:text="Effect 3"
       android:textSize="18sp"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button2" />

   <View
       android:id="@+id/divider"
       android:layout_width="363dp"
       android:layout_height="1dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="10dp"
       android:layout_marginEnd="32dp"
       android:background="?android:attr/listDivider"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintHorizontal_bias="0.5"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/button3" />

   <androidx.constraintlayout.widget.ConstraintLayout
       android:layout_width="363dp"
       android:layout_height="0dp"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintHorizontal_bias="0.5"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/divider">

       <ImageView
           android:id="@+id/imageView"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:adjustViewBounds="true"
           android:scaleType="fitXY"
           app:layout_constraintBottom_toBottomOf="parent"
           app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintHorizontal_bias="0.5"
           app:layout_constraintStart_toStartOf="parent"
           app:layout_constraintTop_toTopOf="parent"
           app:srcCompat="@drawable/bluebar" />
   </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

شتاب سنج

شکل 3. اتصال شتاب سنج در امتداد ناحیه توصیه شده در رابط کاربری گرافیکی