[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9257":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},9257,"pslab-app","fossasia\u002Fpslab-app","fossasia","PSLab Android App https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=io.pslab","https:\u002F\u002Fpslab.io",null,"Dart",2112,847,23,32,0,5,61.29,"Apache License 2.0",false,"flutter",[23,24],"android","android-app","2026-06-12 04:00:43","# PSLab Android App\n\nRepository for the PSLab Android App for performing experiments with the [Pocket Science Lab](https:\u002F\u002Fpslab.io) open-hardware platform.\n\n[![Build](https:\u002F\u002Fgithub.com\u002Ffossasia\u002Fpslab-app\u002Factions\u002Fworkflows\u002Fpull-request.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Ffossasia\u002Fpslab-app\u002Factions\u002Fworkflows\u002Fpull-request.yml)\n[![Mailing List](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMailing%20List-FOSSASIA-blue.svg)](https:\u002F\u002Fgroups.google.com\u002Fforum\u002F#!forum\u002Fpslab-fossasia)\n![GitHub repo size](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frepo-size\u002Ffossasia\u002Fpslab-app)\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002Ffossasia\u002Fpslab.svg)](https:\u002F\u002Fgitter.im\u002Ffossasia\u002Fpslab?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Twitter Follow](https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fpslabio.svg?style=social&label=Follow&maxAge=2592000?style=flat-square)](https:\u002F\u002Ftwitter.com\u002Fpslabio)\n[![Translation status](https:\u002F\u002Fhosted.weblate.org\u002Fwidgets\u002Ffossasia\u002F-\u002Fpslab-app\u002Fsvg-badge.svg)](https:\u002F\u002Fhosted.weblate.org\u002Fprojects\u002Ffossasia\u002Fpslab-app\u002F)\n\nThis repository holds the Android App for performing experiments with [PSLab](https:\u002F\u002Fpslab.io\u002F). PSLab is a tiny pocket science lab that provides an array of equipment for doing science and engineering experiments. It can function like an oscilloscope, waveform generator, frequency counter, programmable voltage and current source and also as a data logger. Our website is at https:\u002F\u002Fpslab.io.\n\nSign up for the latest updates and test new features early by joining our beta program [here](https:\u002F\u002Fplay.google.com\u002Fapps\u002Ftesting\u002Fio.pslab).\n\n\u003Ca href=\"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=io.pslab\">\u003Cimg alt=\"Get it on Google Play\" height=\"80\" src=\"\u002Fdocs\u002Fimages\u002Fplaystore_badge.png\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Ff-droid.org\u002Fapp\u002Fio.pslab\">\u003Cimg alt=\"Get it on F-Droid\" height=\"80\" src=\"\u002Fdocs\u002Fimages\u002Ffdroid_badge.png\">\u003C\u002Fa>\n\n## Buy\n\n* You can get a Pocket Science Lab device from the [FOSSASIA Shop](https:\u002F\u002Ffossasia.com).\n* More resellers are listed on the [PSLab website](https:\u002F\u002Fpslab.io\u002Fshop\u002F).\n\n## Communication\n\n* The PSLab [chat channel is on Gitter](https:\u002F\u002Fgitter.im\u002Ffossasia\u002Fpslab).\n* Please also join us on the [PSLab Mailing List](https:\u002F\u002Fgroups.google.com\u002Fforum\u002F#!forum\u002Fpslab-fossasia).\n\n## Roadmap\n - [x] First we need to get communication between Android App and PSLab working.\n - [x] Implement Applications and expose PSLab Hardware functionality to the user.\n - [ ] Implement wireless connectivity\n\n## Screenshots\n\n  \u003Ctable>\n      \u003Ctr>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_device_not_found.png\">\u003C\u002Ftd>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_home_screen.png\">\u003C\u002Ftd>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_instrument_panel.png\">\u003C\u002Ftd>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_about_us.png\">\u003C\u002Ftd>\n      \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n      \u003Ctr>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_oscilloscope_guide.png\">\u003C\u002Ftd>\n       \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_logic_analyzer_guide.png\">\u003C\u002Ftd>\n      \u003C\u002Ftr>\n    \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_pin_layout_front.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_pin_layout_back.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_side_navigation_drawer.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_luxmeter_guide.png\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_oscilloscope_channel_view.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_oscilloscope_audiojack_view.png\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_wave_generator_analog.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_wave_generator_digital.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_power_source_view.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_multi_meter_view.png\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_barometer_view.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_log_map_location.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_data_logger.png\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Fview_create_config_file.png\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_accelerometer_view.png\" width = \"500\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_gyro_view.png\" width = \"500\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_compass_view.png\" width = \"500\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_thermo_view.png\" width = \"500\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n     \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_sensors_view.png\" width = \"500\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_gas_sensor_view.png\" width = \"500\">\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_dust_sensor_view.png\" width = \"500\">\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Ctable>\n    \u003Ctr>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_robotic_arm_controller_view.png\" width = \"500\"\u002F>\u003C\u002Ftd>\n     \u003Ctd>\u003Cimg src=\"\u002Fdocs\u002Fimages\u002Finstrument_logical_analyzer_view.png\" width = \"500\"\u002F>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\n## Video Demo\n  * [PSLab Android App Overview](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JJfsF0b8M8k).\n  * [Observing Sound Waveforms Using PSLab Device](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=5bxDd1PiOMQ).\n  * [Real-time Sensor Data Logging Using Pocket Science Lab](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=_A8h6o-UcNo).\n  * [Generating and Observing Waveforms Using Pocket Science Lab](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Ua9_OCR4p8Y).\n\n## Features\n|   ***Feature***        | **Description**                                                   | **Status**         |\n|------------------------|-------------------------------------------------------------------|--------------------|\n| Home Screen            | Show status and version of PSLab device                           | :heavy_check_mark: |\n| Instruments            | Exposes PSLab instruments like Oscilloscope, etc                  | :heavy_check_mark: |\n| Oscilloscope           | Shows variation of analog signals                                 | :heavy_check_mark: |\n| Multimeter             | Measures voltage, current, resistance and capacitance             | :heavy_check_mark: |\n| Logical Analyzer       | Captures and displays signals from digital system                 | :heavy_check_mark: |\n| Wave Generator         | Generates arbitrary analog and digital waveforms                  | :heavy_check_mark: |\n| Power Source           | Generates programmable voltage and currents\t                     | :heavy_check_mark: |\n| Luxmeter              | Measures the ambient light intensity                               | :heavy_check_mark: |\n| Barometer             | Measures the Pressure                                              | :heavy_check_mark: |\n| Accelerometer          | Measures the acceleration of the device                           | :heavy_check_mark: |\n| Gyrometer             | Measures the rate of rotation                                      | :heavy_check_mark: |\n| Compass                | Measures the absolute rotation relative to earth magnetic poles   | :heavy_check_mark: |\n| Thermometer            | Measures the ambient temperature                                  | :heavy_check_mark: |\n| Gas Sensor             | Detects gases, including NH3, NOx, alcohol, benzene, smoke and CO2| :heavy_check_mark: |\n| Robotic Arm Controller | Allows to control 4 servo motors of the robotic arm independently | :heavy_check_mark: |\n\n## Development Environment Setup\n\n### Project Overview\n\nThis is a **Flutter cross-platform application** that supports:\n- **Android** (primary platform)\n- **iOS** \n- **Linux** (with USB device support)\n- **macOS**\n- **Windows**\n- **Web**\n\nThe app interfaces with PSLab hardware devices via USB and provides scientific instrument functionality.\n\n### Required Software \n\n**Flutter & Dart**\n- Flutter (stable channel)\n- Dart (bundled with Flutter)\n\n**Java**\n- Java (LTS version required for Android builds)\n\n\n### Flutter SDK Setup\n\n#### Install Flutter\n##### macOS (via Homebrew)\n```bash\nbrew install --cask flutter\n```\n\n##### Linux\n\nFollow the official Flutter setup guide for Linux: \u003Chttps:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Flinux\u002Fsetup>\n#### Windows\n\nFollow the official Flutter setup guide for Windows: \u003Chttps:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fwindows\u002Fsetup>\n\n### Flutter development setup (VS Code)\n\nThe instructions below explain how to install the Flutter SDK, set up Visual Studio Code with the Flutter and Dart extensions, and run the project using `flutter run`. These steps avoid Android Studio-specific instructions and focus on a minimal, cross-platform Flutter workflow.\n\nPrerequisites\n- A supported operating system (Windows, macOS, or Linux).\n- A working internet connection to download the Flutter SDK and extensions.\n\n1) Install the Flutter SDK\n- Download the Flutter SDK from https:\u002F\u002Fdocs.flutter.dev\u002Fget-started\u002Finstall and follow the platform-specific instructions. On Windows, extract the SDK (for example to `C:\\src\\flutter`) and add the `bin` folder to your PATH environment variable. On macOS\u002FLinux, follow the steps on the Flutter website for adding `flutter` to your PATH.\n- After installation, open a terminal (PowerShell on Windows) and run:\n\n```powershell\nflutter --version\nflutter doctor\n```\n\nResolve any missing components suggested by `flutter doctor`. If you plan to build desktop apps, follow the platform-specific toolchain steps suggested by `flutter doctor` (e.g., install Visual Studio on Windows for Windows desktop builds).\n\n2) Set up Visual Studio Code\n- Install VS Code (if you don't have it) and open the project folder in VS Code.\n- Install the following extensions from the Extensions view:\n  - Flutter (includes the Dart extension)\n  - Dart (if the Flutter extension did not install it automatically)\n- (Optional) If VS Code cannot find the Flutter SDK, set the `dart.flutterSdkPath` setting to the SDK location in your VS Code settings.\n\n3) Prepare the project and run\n- In the project root, fetch packages and generate any code:\n\n```powershell\nflutter pub get\nflutter pub run build_runner build --delete-conflicting-outputs  # if the project uses code generation\n```\n\n- Run the app on the default device (emulator, connected device, or desktop target):\n\n```powershell\nflutter run\n```\n\nIf you want to run on a specific device, list available devices and pass `-d`:\n\n```powershell\nflutter devices\nflutter run -d windows   # example: run on Windows desktop\n```\n\nNotes and troubleshooting\n- If you see issues related to missing SDKs or tools, run `flutter doctor` and follow the recommended fixes.\n- Building Android APKs or running on Android devices may require Android SDK tools. If you need Android targets later, install the Android SDK separately; Android Studio is not required for Flutter development but can simplify SDK installation.\n- For fast iteration in VS Code, use the Debug panel (press F5) or the Flutter toolbar (Run and Debug).\n\n\n### Application Flavors\n\n#### Verify Flutter Installation\n```bash\nflutter doctor\nflutter --version\n```\n\n### Android Development Setup\n\n**Android Studio is optional** - you can use command-line tools instead.\n\n#### Option 1: Android Studio (Recommended)\n1. Install [Android Studio](https:\u002F\u002Fdeveloper.android.com\u002Fstudio)\n2. Install Android SDK and accept licenses:\n```bash\nflutter doctor --android-licenses\n```\n\n#### Option 2: Command Line Tools Only\n```bash\n# Install Android SDK command-line tools\n# Set environment variables\nexport ANDROID_HOME=$HOME\u002FAndroid\u002FSdk\nexport PATH=$PATH:$ANDROID_HOME\u002Ftools:$ANDROID_HOME\u002Fplatform-tools\n```\n\n**Android Requirements:**\n- Android SDK (stable)\n- Java (LTS version)\n- See Android configuration in the project Gradle files.\n\n### iOS Development Setup (macOS only)\n\n**Requirements:**\n- Xcode\n- CocoaPods\n- iOS deployment target is defined in the project configuration.\n\n```bash\n# Install CocoaPods\nsudo gem install cocoapods\n\n# Install iOS dependencies\ncd ios && pod install && cd ..\n```\n\n### Linux-Specific Setup\n\n**USB Device Access for PSLab Hardware:**\n\n```bash\n# Install udev rules for PSLab devices\nsudo cp linux\u002F99-pslab.rules \u002Fetc\u002Fudev\u002Frules.d\u002F\nsudo udevadm control --reload-rules\nsudo udevadm trigger\n\n# Add user to dialout group for serial access\nsudo usermod -a -G dialout $USER\n# Log out and back in for group changes to take effect\n```\n\n**Supported PSLab Devices:**\n- PSLab v5: VendorID `04d8`, ProductID `00df`\n- PSLab v6: VendorID `10c4`, ProductID `ea60`\n\n### Project Setup\n\n1. **Clone repository:**\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ffossasia\u002Fpslab-app.git\ncd pslab-app\n```\n\n2. **Install dependencies:**\n```bash\nflutter pub get\n```\n\n3. **Platform-specific setup:**\n```bash\n# iOS (macOS only)\ncd ios && pod install && cd ..\n\n# Android - no additional steps needed\n```\n\n### Android permissions used\n\nThe app requires these permissions (configured in AndroidManifest.xml):\n\n**Android:**\n- `ACCESS_FINE_LOCATION` \u002F `ACCESS_COARSE_LOCATION` - GPS logging\n- `RECORD_AUDIO` - Audio oscilloscope functionality\n- `INTERNET` - Connectivity features\n- `READ_EXTERNAL_STORAGE` \u002F `WRITE_EXTERNAL_STORAGE` - Data logging\n- `android.hardware.usb.host` - PSLab device communication\n- `android.hardware.sensor.ambient_temperature` - Temperature sensors\n\n### Key Dependencies\n\n**Hardware Communication:**\n- usb_serial\n- flusbserial\n\n**Sensors & Hardware:**\n- sensors_plus\n- light\n- geolocator\n- permission_handler\n\n**Audio Processing:**\n- `flutter_audio_capture` (Git dependency) - Audio capture for oscilloscope\n\n### Running the Application\n\n#### Development\n```bash\n# List available devices\nflutter devices\n\n# Run on connected device\nflutter run\n\n# Run with hot reload\nflutter run --debug\n```\n\n#### Building for Release\n```bash\n# Android APK\nflutter build apk --release\n\n# Android App Bundle (for Play Store)\nflutter build appbundle --release\n\n# iOS (macOS only)\nflutter build ios --release\n\n# Linux\nflutter build linux --release\n```\n\n### Testing\n\n```bash\n# Unit tests\nflutter test\n\n# Integration tests\nflutter test integration_test\u002F\n```\n\n### Troubleshooting\n\n**Common Issues:**\n\n1. **USB permissions on Linux:**\n   - Ensure udev rules are installed: `ls -la \u002Fetc\u002Fudev\u002Frules.d\u002F99-pslab.rules`\n   - Check user is in dialout group: `groups $USER`\n\n2. **Flutter version mismatch:**\n   ```bash\n   flutter channel stable\n   flutter upgrade\n   flutter pub get\n   ```\n\n3. **iOS build issues:**\n   ```bash\n   cd ios\n   pod deintegrate\n   pod install\n   cd ..\n   flutter clean\n   flutter pub get\n   ```\n\n4. **Android build issues:**\n   - Ensure an LTS Java version is installed: java -version \n   - Clean build: `flutter clean && flutter pub get`\n\n5. **Git dependency issues:**\n   ```bash\n   flutter pub deps\n   flutter pub get\n   ```\n\n### Verify Setup\n\nFollow the steps below to confirm that your local development environment is correctly configured.\n\n#### 1. Check Flutter installation\n```bash\nflutter doctor\n ```\nResolve any critical issues reported by the command.\n\n#### 2. Install dependencies and run tests\n```bash\nflutter pub get\nflutter test\n ```\n\n#### 3. Run the application\n```bash\nflutter run\n ```\nRun the app on a connected physical device, emulator, or desktop target.\n\n#### 4. (Optional) Using Android Studio\nIf you prefer Android Studio:\n- Open the project directory in Android Studio.\n- Wait for the Gradle sync to complete.\n- Check the Build and Run windows for errors.\n\nNote: If you encounter a Gradle sync error such as\n“failed to find …”, use the suggested action (for example, Install missing platform(s) and sync project) to allow Android Studio to download the required components.\n\nOnce the app builds successfully and launches on your target device or emulator, the setup is complete.\n\nThe currently supported Flutter, Dart, and platform versions are defined in the project configuration files (for example `pubspec.yaml`, Android Gradle files, and iOS project settings).\n\n### Permission manifests\n\nPermissions are declared in the platform manifests:\n- Android: android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml\n- iOS: ios\u002FRunner\u002FInfo.plist\n\nThe app may request permissions at runtime depending on the instrument\u002Ffeatures being used (e.g., location, microphone, storage, USB). \n\n## Setup to use PSLab with Android App\nTo use PSLab device with Android, you simply need an OTG cable, an Android Device with USB Host feature enabled ( most modern phones have OTG support ) and PSLab Android App. Connect PSLab device to Android Phone via OTG cable. Rest is handled by App itself.\n\n## Translations\n\nWe use [Weblate](https:\u002F\u002Fhosted.weblate.org\u002Fprojects\u002Ffossasia\u002Fpslab-app\u002F) for managing translations.\n\nIf you want to help translate the app into your language, please visit the [PSLab App project on Weblate](https:\u002F\u002Fhosted.weblate.org\u002Fprojects\u002Ffossasia\u002Fpslab-app\u002F).\n\n### Technical Details\nThe app uses the standard Flutter `flutter_localizations` package.\n* **Location:** Translation files are stored in `lib\u002Fl10n\u002F` in `.arb` (Application Resource Bundle) format.\n* **Template:** The source of truth is `lib\u002Fl10n\u002Fapp_en.arb`.\n* **Contribution:** While we prefer translations submitted via Weblate to avoid merge conflicts, you can also manually edit the `.arb` files and submit a Pull Request.\n\n\n## Contributions Best Practices\n\n### Code practices\n\nPlease help us follow the best practice to make it easy for the reviewer as well as the contributor. We want to focus on the code quality more than on managing pull request ethics.\n\n  * Single commit per pull request.\n  * Reference the issue numbers in the commit message. Follow the pattern ``` Fixes #\u003Cissue number> \u003Ccommit message>```\n  * Follow uniform design practices. The design language must be consistent throughout the app.\n  * The pull request will not get merged until and unless the commits are squashed. In case there are multiple commits on the PR, the commit author needs to squash them and not the maintainers cherrypicking and merging squashes.\n  * If the PR is related to any front end change, please attach relevant screenshots in the pull request description.\n\n#### How to `git squash`?\n\nAs a tip for new developers those who struggle with squashing commits into one, multiple commits may appear in your pull request mostly due to following reasons.\n\n * Intentionally adding multiple commit messages after each change without just `git add`ing.\n * Updating the current branch with the remote so a merge commit takes place.\n\nDespite any reason, follow the steps given below to squash all commits into one adhering to our best practices.\n\n  * Setup remote to upstream branch if not set before\n\n`$ git remote add upstream https:\u002F\u002Fgithub.com\u002Ffossasia\u002Fpslab-app.git`\n\n  * Check into the branch related to the pull request\n\n`$ git checkout \u003Cbranch-name>`\n\n  * Perform a soft reset to retain the changes while removing all the commit details\n\n`$ git reset --soft upstream\u002Fdevelopment`\n\n  * Add files to the staging area\n\n`$ git add \u003Cfile paths or \".\" to add everything>`\n\n  * Create a new commit with a proper message following commit message guidelines\n\n`$ git commit -m \"tag: commit message\"`\n\n  * If you have already made a pull request\n\n`$ git push -f origin \u003Cbranch-name>`\n\n### Branch Policy\n\nWe have the following branches\n* **development** All development goes on in this branch. If you're making a contribution, you are supposed to make a pull request to _development_. Make sure it passes a build check on Travis.\n* **master** This contains the stable code. After significant features\u002Fbugfixes are accumulated on development, we move it to master.\n* **apk** This branch contains automatically generated apk file for testing.\n\n### Code style\n\nPlease try to follow the mentioned guidelines while writing and submitting your code as it makes easier for the reviewer and other developers to understand.\n\n * While naming the layout files, ensure that the convention followed is (activity\u002Ffragment) _ (name).xml like ```activity_oscilloscope.xml``` , ```fragment_control_main.xml``` .\n * Name the views and widgets defined in the layout files as (viewtype\u002Fwidget) _ (fragment\u002Factivity name) _ (no. in the file) like ```spinner_channel_select_la1``` , ```button_activity_oscilloscope1``` .\n * The activity\u002Ffragment file name corresponding to the layout files should be named as                       (activity\u002Ffragment name)(activity\u002Ffragment).java like ```ChannelsParameterFragment.java``` corresponding to the layout file ```fragment_channels_parameter.xml``` .\n * The corresponding widgets for buttons, textboxes, checkboxes etc. in activity files should be named as (viewtype\u002Fwidget)(fragment\u002Factivity name)(no. in the file) like ```spinnerChannelSelect1``` corresponding to ```spinner_channel_select1``` .\n\n## Developers\n\n### Maintainers\nThe project is maintained by\n- Padmal ([@CloudyPadmal](https:\u002F\u002Fgithub.com\u002FCloudyPadmal))\n- Mario Behling ([@mariobehling](http:\u002F\u002Fgithub.com\u002Fmariobehling))\n- Lorenz Gerber ([@lorenzgerber](https:\u002F\u002Fgithub.com\u002Florenzgerber))\n- Wei Tat ([@cweitat](https:\u002F\u002Fgithub.com\u002Fcweitat))\n- Wai Gie ([@woshikie](https:\u002F\u002Fgithub.com\u002Fwoshikie))\n\n### Alumni\n- Neel Trivedi ([@neel1998](https:\u002F\u002Fgithub.com\u002Fneel1998))\n- Akarshan Gandotra ([@akarshan96](https:\u002F\u002Fgithub.com\u002Fakarshan96))\n- Asitava Sarkar ([@asitava1998](https:\u002F\u002Fgithub.com\u002Fasitava1998))\n- Vivek Singh Bhadauria ([@viveksb007](https:\u002F\u002Fgithub.com\u002Fviveksb007))\n- Avjeet ([@Avjeet](https:\u002F\u002Fgithub.com\u002FAvjeet))\n- Abhinav ([@abhinavraj23](https:\u002F\u002Fgithub.com\u002Fabhinavraj23))\n- Harsh ([@harsh-2711](https:\u002F\u002Fgithub.com\u002Fharsh-2711))\n- Yatri ([@yatri1609](https:\u002F\u002Fgithub.com\u002Fyatri1609))\n\n## License\n\nThis project is currently licensed under the Apache License 2.0. A copy of [LICENSE](LICENSE) is to be present along with the source code. To obtain the software under a different license, please contact FOSSASIA.\n","PSLab Android App 是一款专为 Pocket Science Lab (PSLab) 开源硬件平台设计的应用程序，旨在帮助用户执行各种科学和工程实验。该应用利用 Dart 语言开发，支持与 PSLab 设备进行通信，提供包括示波器、波形发生器、频率计数器、可编程电压和电流源以及数据记录仪在内的多种功能。适用于教育机构、实验室和个人爱好者等场景，特别适合需要便携式科学实验工具的场合。项目采用 Apache License 2.0 许可证，拥有活跃的社区支持，并持续更新以增强用户体验和增加新特性。",2,"2026-06-11 03:21:53","top_language"]