IOHIDAccelerationAlgorithm.hpp   [plain text]


//
//  IOHIDAccelerationAlgorithm.hpp
//  IOHIDFamily
//
//  Created by YG on 10/29/15.
//
//

#ifndef IOHIDAccelerationAlgorithm_hpp
#define IOHIDAccelerationAlgorithm_hpp

#include <CoreFoundation/CoreFoundation.h>
#include "IOHIDAccelerationTable.hpp"
#include <vector>
#include <set>
#include <ostream>
#include <iomanip>
#include "CF.h"
#include "IOHIDDebug.h"

#define FIXED_TO_DOUBLE(x) ((x)/65536.0)
#define DOUBLE_TO_FIXED(x) (uint64_t)((x)*65536.0)
#define MAX_DEVICE_THRESHOLD   FIXED_TO_DOUBLE(0x7fffffff)
#define kCursorScale (96.0/67.0)

class IOHIDAccelerationAlgorithm {
   
public:

    enum Type {
      Table,
      Parametric,
      Unknown
    };
  
    IOHIDAccelerationAlgorithm () {}
  
    virtual ~IOHIDAccelerationAlgorithm() {}
    virtual double multiplier (double value) {
      return value;
    }
    virtual IOHIDAccelerationAlgorithm::Type getType () const {
      return IOHIDAccelerationAlgorithm::Unknown;
    };
  
    virtual void serialize (CFMutableDictionaryRef dict) const = 0;
  
};



class IOHIDParametricAcceleration : public  IOHIDAccelerationAlgorithm {

public:

    typedef struct {
        double  Index;
        double  GainLinear;
        double  GainParabolic;
        double  GainCubic;
        double  GainQudratic;
        double  TangentSpeedLinear;
        double  TangentSpeedParabolicRoot;
        bool isValid () {
          return GainLinear || GainParabolic  || GainCubic || GainQudratic ;
        }
    } ACCELL_CURVE;

    double        tangent [2];
    double        m [2];
    double        b [2];
    
    ACCELL_CURVE  accel;
    
    double        resolution_;
    double        rate_;
    double        accelIndex_;

    static double GetCurveParameter (CFDictionaryRef curve, CFStringRef parameter);
    static ACCELL_CURVE GetCurve (CFDictionaryRef curve);
  
public:
  
    static  IOHIDParametricAcceleration * CreateWithParameters (CFArrayRef curves, double acceleration, double resolution, double rate);
    
    virtual ~IOHIDParametricAcceleration() {}
  
    virtual double multiplier (double value);

    virtual IOHIDAccelerationAlgorithm::Type getType () const {
        return IOHIDAccelerationAlgorithm::Parametric;
    };

    virtual void serialize (CFMutableDictionaryRef dict) const;

protected:

    IOHIDParametricAcceleration () {};
};


class IOHIDTableAcceleration : public  IOHIDAccelerationAlgorithm {
  
protected:
  
    std::vector <ACCEL_SEGMENT> segments_;
    
    double resolution_;
    double rate_;
    
    ACCEL_POINT  InterpolatePoint (const ACCEL_POINT &p, const ACCEL_POINT &p0, const ACCEL_POINT &p1, double scale);
    static ACCEL_POINT  InterpolatePoint (const ACCEL_POINT &p, const ACCEL_POINT &p0, const ACCEL_POINT &p1,  double scale , boolean_t isLower);
   
    void  InterpolateFunction (const ACCEL_TABLE_ENTRY *lo, const ACCEL_TABLE_ENTRY *hi, double scale, std::set<ACCEL_POINT> &result);
  
public:
  
    static  IOHIDTableAcceleration * CreateWithTable (CFDataRef table, double acceleration, double resolution, double rate);
    static  IOHIDTableAcceleration * CreateOriginalWithTable (CFDataRef table, double acceleration, double resolution, double rate);
    
    virtual ~IOHIDTableAcceleration() {}
    
    virtual double multiplier (double value);

    virtual IOHIDAccelerationAlgorithm::Type getType () const {
        return IOHIDAccelerationAlgorithm::Table;
    };

    virtual void serialize (CFMutableDictionaryRef dict) const;

protected:
  
  IOHIDTableAcceleration () {};
};

#endif /* IOHIDAccelerationAlgorithm_hpp */