/*******************************************************************************
;*******************************************************************************
;**                                                                           **
;**                  COPYRIGHT 2001-2012 NUANCE COMMUNICATIONS                **
;**                                                                           **
;**               NUANCE COMMUNICATIONS PROPRIETARY INFORMATION               **
;**                                                                           **
;**     This software is supplied under the terms of a license agreement      **
;**     or non-disclosure agreement with Nuance Communications and may not    **
;**     be copied or disclosed except in accordance with the terms of that    **
;**     agreement.                                                            **
;**                                                                           **
;*******************************************************************************
;**                                                                           **
;**     FileName: et9aipanalyzer.h                                            **
;**                                                                           **
;**  Description: Conversion of path points to inflection points and segments.**
;**                                                                           **
;*******************************************************************************
;******************************************************************************/


#ifndef AFX_IPANALYZER_H__FE283C7B_78CD_44C5_A5CD_6DECA31A78B4__INCLUDED_
#define AFX_IPANALYZER_H__FE283C7B_78CD_44C5_A5CD_6DECA31A78B4__INCLUDED_   1


#include "et9abuildconfig.h"

#include "et9aiptable.h"
#include "et9abackend.h"

#define SWDbm_KD_INVALID_CHAR       0x00
#define SWDbm_KD_INVALID_KEY        0xFF

struct SWUtility;

#define MAX_FIXED_POOL_SIZE       500
#define MAX_SEARCH_POOL_SIZE      125

#define MISC            0
#define MOUSE           1
#define WORD_LIST       2
#define IP_TABLE        3
#define MAX_MUTEX       3
#define THEN            0
#define NOW             17
#define MAX_WAIT        1
#define TOTAL_WAIT      2
#define SEARCH          0
#define GET_DATA        1

#define SIGN_TRACK_MAX      10
#define SIGN_TRACK_SAVE     4

#define SMOOTH_BUFFER_SIZE  5

#if         SMOOTHER_RAW_DATA
    #define SMOOTHING_DATA_COUNT_MIN    4
#else
    #define SMOOTHING_DATA_COUNT_MIN    3
#endif

/* SAVE_TIME_SIZE must be power of 2 (2^N) that is > Z1_DIFFERENCE_OFFSET */
#define SAVE_TIME_SIZE      8
/* SAVED_TIME_MASK masks N lower bits to reset indices of array[SAVE_TIME_SIZE] */
#define SAVED_TIME_MASK     0x07

#define D2_BUFFER_SIZE      6
#define D2_BUFFER2_SIZE     3

#define DIF2_AVG_DOUBLE_THRESHOLD1              225     /* Set to value corresponding to ?? degree vector change */
#define DIF2_AVG_DOUBLE_THRESHOLD2              120     /* Set to value corresponding to ?? degree vector change */
#define DIF2_AVG_DOUBLE_THRESHOLD3               50

#define DIF2_AVG_ANGLE_THRESHOLD1               225     /* Set to value corresponding to ?? degree vector change */
/* Z1_FIXED_INTERVAL dependent values: */
#define DOUBLE_LETTER_FIXED_COUNT_MIN1    (7 * 5 / Z1_FIXED_INTERVAL)       /* Require seven points higher than threshold for DoubleLetter */
#define DOUBLE_LETTER_FIXED_COUNT_MIN2    (5 * 5 / Z1_FIXED_INTERVAL)       /* Require only five points higher than threshold for DoubleLetter when we hit PenUp */
#define DOUBLE_LETTER_MIN_QUALIFYING_SCORE      (float)3.0
#define DOUBLE_LETTER_MIN_QUALIFYING_SCORE2     (float)4.0
#define ANGLE_IP_FIXED_COUNT_MIN          1     /* Require only one point higher than threshold for Angle IP */

#if FILTER_ERRATIC_MOUSE_DATA_BACK
#if GET_FINER_MOUSE_DATA
    #define     MAX_DATA_CLUSTERS           4           /* No more than four mouse data clusters considered */
    #define     STABLE_DATA_COUNT           4           /* Four successive neighboring points indicate "stable" data */
    #define     MAX_SUCCESSIVE_ERRORS       3
    #define     MOUSE_DOWN_VALIDATION_COUNT 5

    #define MAX_PEN_DOWN_PATH_RATIO            4

    #define MAX_PATH_METRIC_VGA     11000           /* Successive (valid) mouse samples must have metric of no more than 11000 (VGA) */
    #define MAX_PATH_METRIC_QVGA     5500           /* Successive (valid) mouse samples must have metric of no more than 5500 (QVGA) */

    #define MAX_PATH_METRIC_SUM_VGA              18000            /* Sum of calculated m_Metric of any two successive (valid) mouse samples must be no more than 18000 (VGA) */
    #define MAX_PATH_METRIC_SUM_QVGA              9000            /* Sum of calculated m_Metric of any two successive (valid) mouse samples must be no more than 9000 (QVGA) */

    #define MAX_PATH_DELTA_VGA      400             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 400 (VGA) */
    #define MAX_PATH_DELTA_QVGA     200             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 200 (QVGA) */

    #define MAX_PATH_DELTA_SUM_VGA      650             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 650 (VGA) */
    #define MAX_PATH_DELTA_SUM_QVGA     325             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 325 (QVGA) */

    #define MAX_CLUSTER_DISTANCE_VGA        70                      /* Approximately 1.5 portrait-mode key-widths */
    #define MAX_CLUSTER_DISTANCE_QVGA       35                      /* Approximately 1.5 portrait-mode key-widths */

    #define MAX_PEN_DOWN_PATH_DELTA_VGA      100             /* First two successive (valid) mouse samples must have a calculated m_PathLen of no more than 100 (VGA) */
    #define MAX_PEN_DOWN_PATH_DELTA_QVGA      50             /* First two successive (valid) mouse samples must have a calculated m_PathLen of no more than 50 (QVGA) */

    #define MAX_PEN_DOWN_METRIC_VGA          8000            /* Calculated m_Metric of first (valid) mouse samples must be no more than 8000 (VGA) */
    #define MAX_PEN_DOWN_METRIC_QVGA         4000            /* Calculated m_Metric of first (valid) mouse samples must be no more than 4000 (QVGA) */

    #define MAX_PEN_DOWN_METRIC_SUM_VGA     12500            /* Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 12500 (VGA) */
    #define MAX_PEN_DOWN_METRIC_SUM_QVGA     6250            /* Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 6250 (QVGA) */

    #define MAX_PEN_DOWN_PATH_DELTA_SUM_VGA      120             /* Sum of calculated m_PathLen of first two successive (valid) mouse samples must be no more than 120 (VGA) */
    #define MAX_PEN_DOWN_PATH_DELTA_SUM_QVGA      60             /* Sum of calculated m_PathLen of first two successive (valid) mouse samples must be no more than 60 (QVGA) */
#else
    #define     MAX_DATA_CLUSTERS           4           /* No more than four mouse data clusters considered */
    #define     STABLE_DATA_COUNT           4           /* Four successive neighboring points indicate "stable" data */
    #define     MAX_SUCCESSIVE_ERRORS       3
    #define     MOUSE_DOWN_VALIDATION_COUNT 5

    #define MAX_PEN_DOWN_PATH_RATIO            4

    #define MAX_PATH_METRIC_VGA     11000           /* Successive (valid) mouse samples must have metric of no more than 11000 (VGA) */
    #define MAX_PATH_METRIC_QVGA     5500           /* Successive (valid) mouse samples must have metric of no more than 5500 (QVGA) */

    #define MAX_PATH_METRIC_SUM_VGA              18000            /* Sum of calculated m_Metric of any two successive (valid) mouse samples must be no more than 18000 (VGA) */
    #define MAX_PATH_METRIC_SUM_QVGA              9000            /* Sum of calculated m_Metric of any two successive (valid) mouse samples must be no more than 9000 (QVGA) */

    #define MAX_PATH_DELTA_VGA      400             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 400 (VGA) */
    #define MAX_PATH_DELTA_QVGA     200             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 200 (QVGA) */

    #define MAX_PATH_DELTA_SUM_VGA      650             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 650 (VGA) */
    #define MAX_PATH_DELTA_SUM_QVGA     325             /* Successive (valid) mouse samples must have a calculated m_PathLen of no more than 325 (QVGA) */

    #define MAX_CLUSTER_DISTANCE_VGA        70                      /* Approximately 1.5 portrait-mode key-widths */
    #define MAX_CLUSTER_DISTANCE_QVGA       35                      /* Approximately 1.5 portrait-mode key-widths */

    #define MAX_PEN_DOWN_PATH_DELTA_VGA      100             /* First two successive (valid) mouse samples must have a calculated m_PathLen of no more than 100 (VGA) */
    #define MAX_PEN_DOWN_PATH_DELTA_QVGA      50             /* First two successive (valid) mouse samples must have a calculated m_PathLen of no more than 50 (QVGA) */

    #define MAX_PEN_DOWN_METRIC_VGA          8000            /* Calculated m_Metric of first (valid) mouse samples must be no more than 8000 (VGA) */
    #define MAX_PEN_DOWN_METRIC_QVGA         4000            /* Calculated m_Metric of first (valid) mouse samples must be no more than 4000 (QVGA) */

    /*#define MAX_PEN_DOWN_METRIC_SUM_VGA     12500            // Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 12500 (VGA) */
    /*#define MAX_PEN_DOWN_METRIC_SUM_QVGA     6250            // Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 6250 (QVGA) */
    #define MAX_PEN_DOWN_METRIC_SUM_VGA      9000            /* Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 12500 (VGA) */
    #define MAX_PEN_DOWN_METRIC_SUM_QVGA     4500            /* Sum of calculated m_Metric of first two successive (valid) mouse samples must be no more than 6250 (QVGA) */

    #define MAX_PEN_DOWN_PATH_DELTA_SUM_VGA      150             /* Sum of calculated m_PathLen of first two successive (valid) mouse samples must be no more than 120 (VGA) */
    #define MAX_PEN_DOWN_PATH_DELTA_SUM_QVGA      75             /* Sum of calculated m_PathLen of first two successive (valid) mouse samples must be no more than 60 (QVGA) */
  #endif
#endif


#define      MUTEX_FIXED_DATA_EXIST()  true
#define      MUTEX_FIXED_DATA_LOCK()
#define      MUTEX_FIXED_DATA_UNLOCK()


typedef struct SWSmoothData_s
{
    _SWPoint smoothPoint;    /* Smoothed mouse data point */
    _SWPoint rawPoint;       /* Original raw mouse data point */
    BYTE4   m_TimeOffset;
    SBYTE2  dx, dy;
}
SWSmoothData;

struct SWCIPAnalyzer_s
{
    SBYTE4  smoothCount;
    BYTE4   m_dwPenDownTime;
    BYTE4   m_dwTotalPauses;            /* Total time spent paused (at Pause IPs) */
    BYTE4   m_dwMovementDuration;       /* Total time pen was in motion */

    /* UI parameters */
    _SWPoint m_PenDownLoc;               /* Save location and time of PenDown */
    _SWPoint originalKeyMinRub;              /* Save bounds of inital key to test for rubbing */
    _SWPoint originalKeyMaxRub;
    BYTE4   m_dwPenSpeed;               /* 1/100's of a pixel / millisec. */
    BYTE4   m_dwSpeedFactor;            /* Interpolated value between 0 and MAX_SPEED_FACTOR */
    BYTE2   m_wAverageSpeed;            /* Running average of user's speed currently recorded in speed history */
    BYTE2   m_wSpeedMax;                /* Average speed + 2 Standard Deviations of user's average speed */
    BYTE2   m_wSpeedMin;                /* Average speed - 2 Standard Deviations of user's average speed */
    SBYTE2  m_wPathMinX, m_wPathMaxX, m_wPathMinY, m_wPathMaxY;     /* Path minima and maxima */
    SBYTE2  m_wPathWidth, m_wPathHeight;        /* Differences between path minima and maxima */
    BYTE1   rubbedKey;                  /* Key ID of identified rubbed key, or SWDbm_KD_INVALID_KEY if none */
    ET9BOOL    m_bInsideBoundingBoxRub;    /* If true, all preceding points are still within a limited area containing the PenDown loc within which a valid rubbing gesture must be performed */
    ET9BOOL    m_bInsideBoundingBoxTap;    /* If true, all preceding points are still within a limited area containing the PenDown loc within which a valid ordinary tap must be performed */
    ET9BOOL    m_bInsideOrignalKeyRub;     /* If true, all preceding points are within the (possibly extended) bounds of a single key */
    ET9BOOL    m_bRubbedKeyOK;             /* If true, then path time did not exceed limit for rubbing a key, and m_bInsideBoundingBox is true */
    ET9BOOL    m_bCalledZ1Detect;          /* If true, then SignalDetectZ1Input() has already been called */
    ET9BOOL    m_bCheckTap;                /* Flag that current input may still be interpreted as a Tap */
    ET9BOOL    m_bCheckTapHold;            /* Flag that current input may still be interpreted as a Tap-Hold for diacritics */
    ET9BOOL    m_bCheckShiftGesture;
    ET9BOOL    m_ShiftGestured;
    ET9BOOL    m_bMaxFixedCount;            /* Flag that the maximum number of Fixed data points has been generated for the current path */
#if ENABLE_DIACRITIC_GESTURES
    ET9BOOL    m_bCheckDiacriticGesture;
    ET9BOOL    m_DiacriticGestured;
#endif


    SWFixedData         m_pFixedData[_SWYPE_MAX_FIXED_DATA];                  /* Current Fixed data array created from input data */
    SWFixedData         m_FixedDataOverflow;
    ET9U16              wFixedDataCount;
    SWCMouseData        m_pChangeData[_SWYPE_MAX_CHANGE_DATA];
    ET9U16              wChangeDataCount;

    /* mouse data processing variables */
    _SWPoint        m_SmoothPoint;
    BYTE4           m_dwSmoothTime;
    SWSmoothData    *m_PrevSmoothPoint;
    SWSmoothData    *m_NewSmoothPoint;
    SWFixedData     *m_PrevFixedPoint;
    SWFixedData     *m_LastFixedPoint;
    SWSmoothData    smoothBuffer[SMOOTH_BUFFER_SIZE];
    SBYTE2          smoothIn, smoothOut;
#ifdef SMOOTH_RAW_DATA
    SBYTE2          smoothPrev, smoothPrev2;
#endif
    BYTE4   m_dwSavedTime[SAVE_TIME_SIZE];
    BYTE4   m_wSavedDurationPrev;
    SBYTE2  m_wSavedTimeIn;
    SBYTE2  m_wSavedTimePrev;
    SBYTE2  m_wSavedTimeNext;
    BYTE2   m_wSignChangeCountRub;      /* Number of detected sign changes (for rubbed key detection) */
    BYTE2   m_wXSignChangeCount;        /* Number of detected X-coordinate sign changes (for rubbed key detection) */
    BYTE2   m_wYSignChangeCount;        /* Number of detected Y-coordinate sign changes (for rubbed key detection) */
    SBYTE2  m_wLastRawXdif;             /* Last non-zero change in raw X-coordinate (for rubbed key detection) */
    SBYTE2  m_wLastRawYdif;             /* Last non-zero change in raw Y-coordinate (for rubbed key detection) */
    BYTE4   m_dwFixedSegmentLength;     /* Length of path since last fixed point */
    BYTE4   m_dwFixedInterval;          /* Fixed-interval for creating points along input path */
    SBYTE2  m_wD1Offset;                /* Number of fixed samples to offset for first difference */
    SBYTE2  m_wD2AngleThreshold;        /* Minimum second difference sum to establish Angle IP */
    SBYTE2  m_wD2LowerThreshold;        /* Lower threshold for second difference sum to confirm previously detected Angle IP */
    SBYTE2  m_wD2Index;                 /* Index of location that maximally exceeds second difference threshold */
    SBYTE2  D2Sums2[D2_BUFFER2_SIZE];
    SBYTE2  D2Sums2In;
    ET9BOOL D2Sums2Full;
    SBYTE2  lastTrackedAngleIndex;

    SBYTE2  m_wLastAddedD2Index;        /* Index of last location already added as second difference IP */
    SBYTE2  m_wD2LocalMax;              /* Value of second difference sum at m_wD2Index */
    SBYTE2  m_wD2LocalThreshold;        /* Dynamic threshold used after a first Angle IP is detected */
    ET9BOOL m_bD2ThresholdExceeded;     /* Flag that m_wD2Threshold recently exceeded */
    BYTE4   m_dwPauseThreshold;         /* Minimum Fixed point duration to establish Pause IP */
    SBYTE2  m_wPauseIndex;              /* Index of location that maximally exceeds duration threshold */
    SBYTE2  m_wPauseIPAdded;            /* Flag that point at m_wPauseIndex already added as IP */
    BYTE4   m_dwPauseLocalMax;          /* Value of duration at m_wPauseIndex */
    BYTE4   m_dwPauseLocalThreshold;    /* Dynamic threshold used after a first Pause IP is detected */
    BYTE4   m_dwMaxFixedDataCount;      /* Maximum number of Fixed data points allowed for a path on the current screen geometry */
    ET9BOOL m_bPauseThresholdExceeded;  /* Flag that m_wPauseThreshold recently exceeded */
    ET9BOOL m_bPenDown;                 /* Flag that next mouse data point is the PenDown location for the next path */
    ET9BOOL m_bStylusDown;              /* Flag that a PenDown event has been received but no PenUp yet */
    ET9BOOL m_bPenUp;

    // sign change tracking variables
    SBYTE2   m_wSignChangeIn;
    SBYTE2   m_wGestureTurns;
    SBYTE2   m_wSignChange2Cnt;
    _SWPoint m_SignChangeLoc[SIGN_TRACK_MAX];
    _SWPoint m_SignChangeSum;
    _SWPoint m_SignChangeCenter;
    _SWPoint m_SignChangeOrigin;
    _SWPoint m_SignChangeOrigin2;
    SBYTE2   m_wSignChanges[SIGN_TRACK_MAX];
    SBYTE2   m_wSignChangeFixedIndex1;
    SBYTE2   m_wSignChangeFixedIndex2;
    SBYTE2   m_wBadSignChangeFixedIndex;
    SBYTE2   m_wBadSignChangeCount;
    SBYTE2   m_wSignChangeMinX;
    SBYTE2   m_wSignChangeMaxX;
    SBYTE2   m_wSignChangeMinY;
    SBYTE2   m_wSignChangeMaxY;
    BYTE2    thisGestureRadius;
    BYTE2    thisGestureRadiusThreshold;
    BYTE2    lastClosureDistance;
    ET9FLOAT gestureClosedRatio;
    ET9BOOL  gestureClosed;
    ET9BOOL  gestureClosing;
    ET9BOOL  gestureSmallEnough;
    ET9BOOL  gestureLargeEnough;

    BackEnd *m_backend;
};


    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_Construct(SWCIPAnalyzer *pThis);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_Destruct(SWCIPAnalyzer *pThis);

    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_ReleaseHandles(SWCIPAnalyzer *pThis);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_SetSignChange(SWCIPAnalyzer *pThis, SWSmoothData *newPoint, SWSmoothData *prevPoint, SBYTE2 *signChange1, SBYTE2 *signChange2);

    /* mouse data item processor */
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_ProcessMouseData(SWCIPAnalyzer *pThis, BYTE4 newTimeOffset, _SWPoint *newPoint, ET9BOOL bIsSpecial);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_ProcessSmoothDataPoint(SWCIPAnalyzer *pThis);
    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_PathIsLikelySwypePath(SWCIPAnalyzer *pThis, BYTE2 totalPathLength, BYTE2 horzSignChangeCount);

    /* access mouse data */
    ET9PRIVATE SWFixedData* ET9FARCALL SWIPAnalyzer_ObtainFixedData(SWCIPAnalyzer *pThis);
    ET9PRIVATE SWFixedData* ET9FARCALL SWCIPAnalyzer_GetFixedData(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex, SBYTE2 callNum);
    ET9PRIVATE _SWPoint ET9FARCALL SWCIPAnalyzer_GetFixedPoint(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex, SBYTE2 callNum);
    ET9PRIVATE BYTE2 ET9FARCALL SWCIPAnalyzer_GetPathLength(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex1, SBYTE2 fixedIndex2);
    ET9PRIVATE BYTE2 ET9FARCALL SWCIPAnalyzer_GetPathLength8(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex1, SBYTE2 fixedIndex2);
    ET9PRIVATE BYTE4 ET9FARCALL SWCIPAnalyzer_GetFixedTime(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex);
    ET9PRIVATE SBYTE4 ET9FARCALL SWCIPAnalyzer_GetFixedD2Sum(SWCIPAnalyzer *pThis, SBYTE2 fixedIndex);
    ET9PRIVATE SBYTE2 ET9FARCALL SWCIPAnalyzer_GetFixedDataSize(SWCIPAnalyzer *pThis);

    /* For calculating Fixed data durations */
    ET9PRIVATE void  ET9FARCALL SWCIPAnalyzer_SaveFixedTimeOffset(SWCIPAnalyzer *pThis, BYTE4 dwTimeOffset, ET9BOOL penDownFlag);
    ET9PRIVATE BYTE4 ET9FARCALL SWCIPAnalyzer_GetFixedDuration(SWCIPAnalyzer *pThis, BYTE4 dwTimeOffset);

    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_ClearFixedData(SWCIPAnalyzer *pThis);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_CopyFixedDataToZ1(SWCIPAnalyzer *pThis);

    ET9PRIVATE BYTE4 ET9FARCALL SWCIPAnalyzer_GetSpeedFactor(SWCIPAnalyzer *pThis, BYTE2 penSpeed, ET9BOOL updateHistory);

    ET9PRIVATE BYTE4 ET9FARCALL SWCIPAnalyzer_GetSpeedFactorDW(const SWCIPAnalyzer *pThis) {
        return pThis->m_dwSpeedFactor;
    }

    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_IsCheckTap(const SWCIPAnalyzer *pThis) {
        return pThis->m_bCheckTap;
    }

    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_SetCheckTap(SWCIPAnalyzer *pThis, ET9BOOL value) {
        pThis->m_bCheckTap = value;
    }

    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_IsCheckTapHold(const SWCIPAnalyzer *pThis) {
        return pThis->m_bCheckTapHold;
    }

    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_SetCheckTapHold(SWCIPAnalyzer *pThis, ET9BOOL value) {
        pThis->m_bCheckTapHold = value;
    }

    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_IsInsideBoundingBoxTap(const SWCIPAnalyzer *pThis) {
        return pThis->m_bInsideBoundingBoxTap;
    }

    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_IsRubbedKeyOK(const SWCIPAnalyzer *pThis) {
        return pThis->m_bRubbedKeyOK;
    }


    ET9PRIVATE SWFixedData* ET9FARCALL SWCIPAnalyzer_GetFixedDataArray(SWCIPAnalyzer *pThis) {
        return pThis->m_pFixedData;
    }

    ET9PRIVATE ET9BOOL ET9FARCALL SWCIPAnalyzer_HasMaxFixedCount(const SWCIPAnalyzer *pThis) {
        return pThis->m_bMaxFixedCount;
    }

    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_SetMaxFixedCount(SWCIPAnalyzer *pThis, ET9BOOL value) {
        pThis->m_bMaxFixedCount = value;
    }

    ET9PRIVATE SBYTE2 ET9FARCALL SWCIPAnalyzer_TrackD2Changes(SWCIPAnalyzer *pThis, SBYTE2 D2Sum, SBYTE2 prevIndex, ET9BOOL penLifted);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_TrackDurationChanges(SWCIPAnalyzer *pThis, BYTE4 FixedDuration, SBYTE2 prevIndex);
    ET9PRIVATE void ET9FARCALL SWCIPAnalyzer_TrackSignChanges(SWCIPAnalyzer *pThis, SBYTE2 signChange1, SBYTE2 signChange2, ET9BOOL penLifted);

    ET9PRIVATE SWFixedData * ET9FARCALL SWCIPAnalyzer_AddFixedPoint(SWCIPAnalyzer *pThis, SBYTE2 x, SBYTE2 y, BYTE4 dwTimeOffset, SWFixedData *prevPoint, SBYTE2 Index);
    ET9PRIVATE SBYTE4 ET9FARCALL SWCIPAnalyzer_AnalyzeChangeData(SWCIPAnalyzer *pThis, SBYTE4 *avRadius, ET9FLOAT *stdDev);


#endif /* ifndef(AFX_IPANALYZER_H__FE283C7B_78CD_44C5_A5CD_6DECA31A78B4__INCLUDED_) */



/* eof */
