From 16485d47da8b2d0a829e378afa1443c1ef4839f8 Mon Sep 17 00:00:00 2001 From: Jan Hauffa Date: Sun, 6 Mar 2011 19:37:25 +0100 Subject: [PATCH] Optimize motor table calculation. --- backend/mustek_usb2_asic.c | 191 ++++++++++++------------------------- backend/mustek_usb2_asic.h | 2 +- 2 files changed, 60 insertions(+), 133 deletions(-) diff --git a/backend/mustek_usb2_asic.c b/backend/mustek_usb2_asic.c index 58d3c034c..e7edd6467 100644 --- a/backend/mustek_usb2_asic.c +++ b/backend/mustek_usb2_asic.c @@ -46,6 +46,7 @@ and similar USB2 scanners. */ #include +#include #include "mustek_usb2_asic.h" @@ -1853,16 +1854,13 @@ SetMotorStepTable (PAsic chip, LLF_MOTORMOVE * MotorStepsTable, unsigned short w } static STATUS -CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable, - unsigned short wYResolution) +CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable) { STATUS status = STATUS_GOOD; unsigned short i; unsigned short wEndSpeed, wStartSpeed; unsigned short wScanAccSteps; SANE_Byte bScanDecSteps; - double PI = 3.1415926; - double x = PI / 2; long double y; unsigned short *lpMotorTable; @@ -1877,64 +1875,50 @@ CalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable, /* Motor T0 & T6 acc table */ for (i = 0; i < 512; i++) { - y = (6000 - 3500); - y *= (pow (0.09, (x * i) / 512) - pow (0.09, (x * 511) / 512)); + y = 6000 - 3500; + y *= pow (0.09, (M_PI_2 * i) / 512) - pow (0.09, (M_PI_2 * 511) / 512); y += 4500; - *((unsigned short *) lpMotorTable + i) = (unsigned short) y; /* T0 */ - *((unsigned short *) lpMotorTable + i + 512 * 6) = (unsigned short) y; /* T6 */ + lpMotorTable[i] = (unsigned short) y; /* T0 */ + lpMotorTable[i + 512 * 6] = (unsigned short) y; /* T6 */ } /* Motor T1 & T7 dec table */ for (i = 0; i < 256; i++) { - y = (6000 - 3500); - y *= pow (0.3, (x * i) / 256); + y = 6000 - 3500; + y *= pow (0.3, (M_PI_2 * i) / 256); y = 6000 - y; - *((unsigned short *) lpMotorTable + i + 512) = (unsigned short) y; /* T1 */ - *((unsigned short *) lpMotorTable + i + 512 * 7) = (unsigned short) y; /* T7 */ + lpMotorTable[i + 512] = (unsigned short) y; /* T1 */ + lpMotorTable[i + 512 * 7] = (unsigned short) y; /* T7 */ } - switch (wYResolution) + for (i = 0; i < wScanAccSteps; i++) { - case 2400: - case 1200: - case 600: - case 300: - case 150: - case 100: - case 75: - case 50: - for (i = 0; i < wScanAccSteps; i++) - { - y = (wStartSpeed - wEndSpeed); - y *= - (pow (0.09, (x * i) / wScanAccSteps) - - pow (0.09, (x * (wScanAccSteps - 1)) / wScanAccSteps)); - y += wEndSpeed; - *((unsigned short *) lpMotorTable + i + 512 * 2) = (unsigned short) y; /* T2 */ - *((unsigned short *) lpMotorTable + i + 512 * 4) = (unsigned short) y; /* T4 */ - } - for (i = wScanAccSteps; i < 512; i++) - { - *((unsigned short *) lpMotorTable + i + 512 * 2) = (unsigned short) wEndSpeed; /* T2 */ - *((unsigned short *) lpMotorTable + i + 512 * 4) = (unsigned short) wEndSpeed; /* T4 */ - } + y = wStartSpeed - wEndSpeed; + y *= pow (0.09, (M_PI_2 * i) / wScanAccSteps) - + pow (0.09, (M_PI_2 * (wScanAccSteps - 1)) / wScanAccSteps); + y += wEndSpeed; + lpMotorTable[i + 512 * 2] = (unsigned short) y; /* T2 */ + lpMotorTable[i + 512 * 4] = (unsigned short) y; /* T4 */ + } + for (i = wScanAccSteps; i < 512; i++) + { + lpMotorTable[i + 512 * 2] = wEndSpeed; /* T2 */ + lpMotorTable[i + 512 * 4] = wEndSpeed; /* T4 */ + } - - for (i = 0; i < (unsigned short) bScanDecSteps; i++) - { - y = (wStartSpeed - wEndSpeed); - y *= pow (0.3, (x * i) / bScanDecSteps); - y = wStartSpeed - y; - *((unsigned short *) lpMotorTable + i + 512 * 3) = (unsigned short) (y); /* T3 */ - *((unsigned short *) lpMotorTable + i + 512 * 5) = (unsigned short) (y); /* T5 */ - } - for (i = bScanDecSteps; i < 256; i++) - { - *((unsigned short *) lpMotorTable + i + 512 * 3) = (unsigned short) wStartSpeed; /* T3 */ - *((unsigned short *) lpMotorTable + i + 512 * 5) = (unsigned short) wStartSpeed; /* T5 */ - } - break; + for (i = 0; i < (unsigned short) bScanDecSteps; i++) + { + y = wStartSpeed - wEndSpeed; + y *= pow (0.3, (M_PI_2 * i) / bScanDecSteps); + y = wStartSpeed - y; + lpMotorTable[i + 512 * 3] = (unsigned short) y; /* T3 */ + lpMotorTable[i + 512 * 5] = (unsigned short) y; /* T5 */ + } + for (i = bScanDecSteps; i < 256; i++) + { + lpMotorTable[i + 512 * 3] = wStartSpeed; /* T3 */ + lpMotorTable[i + 512 * 5] = wStartSpeed; /* T5 */ } DBG (DBG_ASIC, "CalculateMotorTable: Exit\n"); @@ -1945,100 +1929,43 @@ static STATUS LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * LLF_CalculateMotorTable) { STATUS status = STATUS_GOOD; + unsigned short wEndSpeed, wStartSpeed; + unsigned short wScanAccSteps; + unsigned short * lpMotorTable; + long double y; unsigned short i; - double PI = 3.1415926535; - double x; DBG (DBG_ASIC, "LLF_CALCULATEMOTORTABLE: Enter\n"); - x = PI / 2; + wStartSpeed = LLF_CalculateMotorTable->StartSpeed; + wEndSpeed = LLF_CalculateMotorTable->EndSpeed; + wScanAccSteps = LLF_CalculateMotorTable->AccStepBeforeScan; + lpMotorTable = LLF_CalculateMotorTable->lpMotorTable; for (i = 0; i < 512; i++) { /* before scan acc table */ - *(LLF_CalculateMotorTable->lpMotorTable + i) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 2) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 4) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 6) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); + y = (wStartSpeed - wEndSpeed) * pow (0.09, (M_PI_2 * i) / 512) + wEndSpeed; + lpMotorTable[i] = (unsigned short) y; + lpMotorTable[i + 512 * 2] = (unsigned short) y; + lpMotorTable[i + 512 * 4] = (unsigned short) y; + lpMotorTable[i + 512 * 6] = (unsigned short) y; } - for (i = 0; i < 255; i++) + for (i = 0; i < 256; i++) { - *(LLF_CalculateMotorTable->lpMotorTable + i + 512) = - (unsigned short) (LLF_CalculateMotorTable->StartSpeed - - (LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.3, - (x * i) / 256)); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 3) = - (unsigned short) (LLF_CalculateMotorTable->StartSpeed - - (LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.3, - (x * i) / 256)); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 5) = - (unsigned short) (LLF_CalculateMotorTable->StartSpeed - - (LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.3, - (x * i) / 256)); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 7) = - (unsigned short) (LLF_CalculateMotorTable->StartSpeed - - (LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.3, - (x * i) / 256)); + y = wStartSpeed - (wStartSpeed - wEndSpeed) * pow (0.3, (M_PI_2 * i) / 256); + lpMotorTable[i + 512] = (unsigned short) y; + lpMotorTable[i + 512 * 3] = (unsigned short) y; + lpMotorTable[i + 512 * 5] = (unsigned short) y; + lpMotorTable[i + 512 * 7] = (unsigned short) y; } - for (i = 0; i < 512; i++) - { /* back acc table */ - *(LLF_CalculateMotorTable->lpMotorTable + i) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 6) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * pow (0.09, - (x * i) / 512) + - LLF_CalculateMotorTable->EndSpeed); - } - - if (LLF_CalculateMotorTable->AccStepBeforeScan == 0) + for (i = 0; i < wScanAccSteps; i++) { - } - else - { - for (i = 0; i < LLF_CalculateMotorTable->AccStepBeforeScan; i++) - { - *(LLF_CalculateMotorTable->lpMotorTable + i + 512 * 2) = - (unsigned short) ((LLF_CalculateMotorTable->StartSpeed - - LLF_CalculateMotorTable->EndSpeed) * (pow (0.09, - (x * i) / - LLF_CalculateMotorTable-> - AccStepBeforeScan) - - pow (0.09, - (x * - (LLF_CalculateMotorTable-> - AccStepBeforeScan - - - 1)) / - LLF_CalculateMotorTable-> - AccStepBeforeScan)) - + LLF_CalculateMotorTable->EndSpeed); - } + y = (wStartSpeed - wEndSpeed) * (pow (0.09, (M_PI_2 * i) / wScanAccSteps) - + pow (0.09, (M_PI_2 * (wScanAccSteps - 1)) / wScanAccSteps)) + wEndSpeed; + lpMotorTable[i + 512 * 2] = (unsigned short) y; } DBG (DBG_ASIC, "LLF_CALCULATEMOTORTABLE: Exit\n"); @@ -3784,7 +3711,7 @@ Asic_SetWindow (PAsic chip, SANE_Byte bScanBits, CalMotorTable.DecStepAfterScan = lpMotorStepsTable->bScanDecSteps; CalMotorTable.lpMotorTable = lpMotorTable; - CalculateMotorTable (&CalMotorTable, wYResolution); + CalculateMotorTable (&CalMotorTable); CurrentPhase.MotorDriverIs3967 = 0; CurrentPhase.FillPhase = 1; diff --git a/backend/mustek_usb2_asic.h b/backend/mustek_usb2_asic.h index c7756b2d8..8c2d2c91f 100644 --- a/backend/mustek_usb2_asic.h +++ b/backend/mustek_usb2_asic.h @@ -1207,7 +1207,7 @@ typedef struct tagLLF_MOTORMOVE } LLF_MOTORMOVE; static STATUS CalculateMotorTable (LLF_CALCULATEMOTORTABLE * - lpCalculateMotorTable, unsigned short wYResolution); + lpCalculateMotorTable); static STATUS LLFCalculateMotorTable (LLF_CALCULATEMOTORTABLE * lpCalculateMotorTable); static STATUS LLFSetMotorCurrentAndPhase (PAsic chip,