package com.miya.weighing;

import android.content.Context;

/**
 * 称重组件开放平台：标准称重接口
 *
 * @author pupu
 * @time 2018/10/19
 */
public interface Weighing {

    /**
     * 设置当前称重台硬件名称
     *
     * @param name 硬件名称
     */
    void setWeighingName(String name);

    /**
     * 获取当前称重台硬件名称
     *
     * @return 当前称重台硬件名称
     */
    String getWeighingName();

    /**
     * 初始化
     *
     * @param context 上下文引用，一般为ApplicationContext ，与application同生命周期
     * @return true：初始化成功；false：初始化失败。在此方法加抛异常，供外部感知失败
     */
    boolean init(Context context);

    /**
     * 释放硬件资源
     *
     * @return true：释放成功；false：释放失败。在此方法加抛异常，供外部感知失败原因
     */
    boolean release();

    /**
     * 获取当前称上的重量
     *
     * @return 当前称上的重量，单位：g或mg。默认返回单位为g，如果后期业务需要非常精准的控制重量，可自定义返回单位为mg。在此方法加抛异常，供外部感知失败原
     */
    int getWeight();

    /**
     * 重置零点
     *
     * @return true：重置指令发送成功；false：重置发送失败。在此方法加抛异常，供外部感知失败原因
     */
    boolean resetZero();

    /**
     * 设置皮重为指定重量
     *
     * @param tare 皮重，单位默认为g；视业务而定可传入mg单位重量
     * @return true：设置成功；false：设置失败。在此方法加抛异常，供外部感知失败原因
     */
    boolean setTare(int tare);

    /**
     * 设置当前地区的重力加速度
     *
     * @param gravity 重力加速度，即重力除以质量（G/m）
     * @return true：设置成功；false：设置失败。在此方法加抛异常，供外部感知失败原因
     */
    boolean setGravity(double gravity);

    /**
     * 标定重量，设置称重硬件重量标准。在设备需初始化设置或者设备转移到异地的时候使用。
     * 如将设备从上海标定后运送到新疆，因为两地的重力加速度是不一致的，所以需要重新做下标定。
     * 一般来说，在称重台实际使用地区做好重量标定后无需再设置重力加速度。或者先做重量标定，转移称台地点后单独设置重力加速度。
     * 标定的过程：执行零位标定，把当前状态标定为零点（无论当前秤盘上是否有物品，零位标定时都把当前状态标定为零点），
     * 然后在秤盘上放一个15kg的砝码，执行重量标定为15kg（weight=15000），砝码的重量值为最大量程时标定后最准确
     *
     * @param weight 标准重量，默认单位g
     * @return true：设置成功；false：设置失败。在此方法加抛异常，供外部感知失败原因
     */
    boolean markWeight(int weight);

    /**
     * 获取当前称上的去皮重量，可能为负值，皮重数值由具体实现类维护，视业务情况调用。默认单位为g
     *
     * @return 去皮重量，默认单位为g
     */
    int getWeightWithOutTare();

    /**
     * 设置重量回调
     *
     * @param weighingCallback 重量回调
     */
    void setWeighingCallback(WeighingCallback weighingCallback);

    /**
     * 重量回调，用于持续提供当前重量的回调
     */
    interface WeighingCallback {

        /**
         * 重量回调
         *
         * @param weight   当前称台上的重量，默认单位为g
         * @param isStable 是否稳定标志，true==>已稳定
         */
        void returnWeight(int weight, boolean isStable);
    }
}