From c38f18c2a32e3c91a9d0b1c18c0a52ee3d47f12e Mon Sep 17 00:00:00 2001 From: afanofosc Date: Wed, 3 Aug 2011 23:38:17 +0000 Subject: Fast I2C support Direct digital pin control support CommHSRead system call changes to support partial buffer reads git-svn-id: https://mindboards.svn.sourceforge.net/svnroot/mindboards/lms_nbcnxc/branches/version_131@42 c9361245-7fe8-9947-84e8-057757c4e366 --- AT91SAM7S256/Source/c_input.c | 223 +++++++++++++++++++++++++++--------------- 1 file changed, 145 insertions(+), 78 deletions(-) (limited to 'AT91SAM7S256/Source/c_input.c') diff --git a/AT91SAM7S256/Source/c_input.c b/AT91SAM7S256/Source/c_input.c index d60f850..319bad4 100644 --- a/AT91SAM7S256/Source/c_input.c +++ b/AT91SAM7S256/Source/c_input.c @@ -17,6 +17,7 @@ #include "modules.h" #include "c_input.h" #include "d_input.h" +#include "c_cmd.iom" #include "c_output.iom" #include "c_loader.iom" #include @@ -150,9 +151,11 @@ void cInputSetupCustomSensor(UBYTE Port); void cInputCalcSensorValues(UBYTE No); UBYTE cInputInitColorSensor(UBYTE Port, UBYTE *pInitStatus); void cInputCalibrateColor(COLORSTRUCT *pC, UWORD *pNewVals); +UBYTE cInputPinFunc(UBYTE Cmd, UBYTE Port, UBYTE Pin, UBYTE *pData); void cInputInit(void* pHeader) { + IOMapInput.pFunc = &cInputPinFunc; UBYTE Tmp; memset(IOMapInput.Colors, 0, sizeof(IOMapInput.Colors)); @@ -161,19 +164,20 @@ void cInputInit(void* pHeader) /* Init IO map */ for (Tmp = 0; Tmp < NO_OF_INPUTS; Tmp++) { - IOMapInput.Inputs[Tmp].SensorType = NO_SENSOR; - IOMapInput.Inputs[Tmp].SensorMode = RAWMODE; - IOMapInput.Inputs[Tmp].SensorRaw = 0; - IOMapInput.Inputs[Tmp].SensorValue = 0; - IOMapInput.Inputs[Tmp].SensorBoolean = 0; - IOMapInput.Inputs[Tmp].InvalidData = INVALID_DATA; - IOMapInput.Inputs[Tmp].DigiPinsDir = 0; - IOMapInput.Inputs[Tmp].DigiPinsOut = 0; - IOMapInput.Inputs[Tmp].CustomActiveStatus = CUSTOMINACTIVE; - IOMapInput.Inputs[Tmp].CustomZeroOffset = 0; - IOMapInput.Inputs[Tmp].CustomPctFullScale = 0; - dInputRead0(Tmp, &(IOMapInput.Inputs[Tmp].DigiPinsIn)); - dInputRead1(Tmp, &(IOMapInput.Inputs[Tmp].DigiPinsIn)); + INPUTSTRUCT * pIn = &(IOMapInput.Inputs[Tmp]); + pIn->SensorType = NO_SENSOR; + pIn->SensorMode = RAWMODE; + pIn->SensorRaw = 0; + pIn->SensorValue = 0; + pIn->SensorBoolean = 0; + pIn->InvalidData = INVALID_DATA; + pIn->DigiPinsDir = 0; + pIn->DigiPinsOut = 0; + pIn->CustomActiveStatus = CUSTOMINACTIVE; + pIn->CustomZeroOffset = 0; + pIn->CustomPctFullScale = 0; + dInputRead0(Tmp, &(pIn->DigiPinsIn)); + dInputRead1(Tmp, &(pIn->DigiPinsIn)); VarsInput.EdgeCnt[Tmp] = 0; VarsInput.InputDebounce[Tmp] = 0; @@ -226,7 +230,8 @@ void cInputCtrl(void) for (Tmp = 0; Tmp < NO_OF_INPUTS; Tmp++) { - UBYTE sType = IOMapInput.Inputs[Tmp].SensorType; + INPUTSTRUCT * pIn = &(IOMapInput.Inputs[Tmp]); + UBYTE sType = pIn->SensorType; UBYTE oldType = VarsInput.OldSensorType[Tmp]; if (sType != oldType) @@ -248,12 +253,12 @@ void cInputCtrl(void) oldType == COLOREXIT)) { VarsInput.InvalidTimer[Tmp] = INVALID_RELOAD_COLOR; - IOMapInput.Inputs[Tmp].SensorType = COLOREXIT; + pIn->SensorType = COLOREXIT; sType = COLOREXIT; } /* Setup the pins for the new sensortype */ cInputSetupType(Tmp, sType, oldType); - IOMapInput.Inputs[Tmp].InvalidData = INVALID_DATA; + pIn->InvalidData = INVALID_DATA; VarsInput.OldSensorType[Tmp] = sType; } else @@ -278,7 +283,7 @@ void cInputCtrl(void) { /* Time elapsed - data are now valid */ - IOMapInput.Inputs[Tmp].InvalidData &= ~INVALID_DATA; + pIn->InvalidData &= ~INVALID_DATA; } } else @@ -286,11 +291,11 @@ void cInputCtrl(void) /* The invalid bit could have been set by the VM due to Mode change */ /* but input module needs to be called once to update the values */ - IOMapInput.Inputs[Tmp].InvalidData &= ~INVALID_DATA; + pIn->InvalidData &= ~INVALID_DATA; } } - if (!(INVALID_DATA & (IOMapInput.Inputs[Tmp].InvalidData))) + if (!(INVALID_DATA & (pIn->InvalidData))) { cInputCalcSensorValues(Tmp); } @@ -300,7 +305,8 @@ void cInputCtrl(void) void cInputCalcSensorValues(UBYTE No) { - UBYTE sType = IOMapInput.Inputs[No].SensorType; + INPUTSTRUCT * pIn = &(IOMapInput.Inputs[No]); + UBYTE sType = pIn->SensorType; switch(sType) { @@ -319,12 +325,12 @@ void cInputCalcSensorValues(UBYTE No) if (sType == CUSTOM) { /* Setup and read digital IO */ cInputSetupCustomSensor(No); - dInputRead0(No, &(IOMapInput.Inputs[No].DigiPinsIn)); - dInputRead1(No, &(IOMapInput.Inputs[No].DigiPinsIn)); + dInputRead0(No, &(pIn->DigiPinsIn)); + dInputRead1(No, &(pIn->DigiPinsIn)); } dInputGetRawAd(&InputVal, No); - IOMapInput.Inputs[No].ADRaw = InputVal; + pIn->ADRaw = InputVal; if (sType == REFLECTION) { @@ -350,27 +356,30 @@ void cInputCalcSensorValues(UBYTE No) } else if (sType == CUSTOM) { - cInputCalcFullScale(&InputVal, IOMapInput.Inputs[No].CustomZeroOffset, IOMapInput.Inputs[No].CustomPctFullScale, FALSE); + cInputCalcFullScale(&InputVal, pIn->CustomZeroOffset, pIn->CustomPctFullScale, FALSE); } cInputCalcSensorValue( InputVal, - &(IOMapInput.Inputs[No].SensorRaw), - &(IOMapInput.Inputs[No].SensorValue), - &(IOMapInput.Inputs[No].SensorBoolean), + &(pIn->SensorRaw), + &(pIn->SensorValue), + &(pIn->SensorBoolean), &(VarsInput.InputDebounce[No]), &(VarsInput.SampleCnt[No]), &(VarsInput.LastAngle[No]), &(VarsInput.EdgeCnt[No]), - ((IOMapInput.Inputs[No].SensorMode) & SLOPEMASK), - ((IOMapInput.Inputs[No].SensorMode) & MODEMASK)); + ((pIn->SensorMode) & SLOPEMASK), + ((pIn->SensorMode) & MODEMASK)); } break; - /* Tripple case intended */ + /* Triple case intended */ case LOWSPEED: case LOWSPEED_9V: case HIGHSPEED: { + UWORD InputVal; + dInputGetRawAd(&InputVal, No); + pIn->ADRaw = InputVal; } break; @@ -380,9 +389,10 @@ void cInputCalcSensorValues(UBYTE No) case COLORBLUE: case COLORNONE: { + COLORSTRUCT * pC = &(IOMapInput.Colors[No]); UWORD InputVal; - switch (IOMapInput.Colors[No].CalibrationState) + switch (pC->CalibrationState) { case SENSOROFF: { @@ -392,7 +402,7 @@ void cInputCalcSensorValues(UBYTE No) /* Sensor has been attached now get cal data */ VarsInput.VarsColor[No].ColorInitState = 0; - (IOMapInput.Colors[No].CalibrationState) = SENSORCAL; + (pC->CalibrationState) = SENSORCAL; } } break; @@ -404,7 +414,7 @@ void cInputCalcSensorValues(UBYTE No) { /* Color sensor has been removed during calibration */ - (IOMapInput.Colors[No].CalibrationState) = SENSOROFF; + (pC->CalibrationState) = SENSOROFF; } if (TRUE == Status) @@ -412,30 +422,30 @@ void cInputCalcSensorValues(UBYTE No) /* Use clock to detect errors */ dInputSetDirInDigi0(No); - (IOMapInput.Colors[No].CalibrationState) = 0; + (pC->CalibrationState) = 0; } } break; default: { - if (dInputGetColor(No, &(IOMapInput.Inputs[No].ADRaw))) + if (dInputGetColor(No, &(pIn->ADRaw))) { - InputVal = IOMapInput.Inputs[No].ADRaw; + InputVal = pIn->ADRaw; cInputCalcFullScale(&InputVal, COLORSENSORBGMIN, COLORSENSORBGPCTDYN, FALSE); cInputCalcSensorValue(InputVal, - &(IOMapInput.Inputs[No].SensorRaw), - &(IOMapInput.Inputs[No].SensorValue), - &(IOMapInput.Inputs[No].SensorBoolean), + &(pIn->SensorRaw), + &(pIn->SensorValue), + &(pIn->SensorBoolean), &(VarsInput.InputDebounce[No]), &(VarsInput.SampleCnt[No]), &(VarsInput.LastAngle[No]), &(VarsInput.EdgeCnt[No]), - ((IOMapInput.Inputs[No].SensorMode) & SLOPEMASK), - ((IOMapInput.Inputs[No].SensorMode) & MODEMASK)); + ((pIn->SensorMode) & SLOPEMASK), + ((pIn->SensorMode) & MODEMASK)); } else { - IOMapInput.Colors[No].CalibrationState = SENSOROFF; + pC->CalibrationState = SENSOROFF; } } break; @@ -444,7 +454,8 @@ void cInputCalcSensorValues(UBYTE No) break; case COLORFULL: { - switch (IOMapInput.Colors[No].CalibrationState) + COLORSTRUCT * pC = &(IOMapInput.Colors[No]); + switch (pC->CalibrationState) { case SENSOROFF: { @@ -454,7 +465,7 @@ void cInputCalcSensorValues(UBYTE No) /* Sensor has been attached now get cal data */ VarsInput.VarsColor[No].ColorInitState = 0; - (IOMapInput.Colors[No].CalibrationState) = SENSORCAL; + (pC->CalibrationState) = SENSORCAL; } } break; @@ -466,7 +477,7 @@ void cInputCalcSensorValues(UBYTE No) { /* Color sensor has been removed during calibration */ - (IOMapInput.Colors[No].CalibrationState) = SENSOROFF; + (pC->CalibrationState) = SENSOROFF; VarsInput.ColorStatus &= ~(0x01<CalibrationState) = 0; /* Calculate Calibration factor */ VarsInput.ColorStatus |= (0x01<SensorRaw[ColorCount]), + &(pC->SensorValue[ColorCount]), + &(pC->Boolean[ColorCount]), &(VarsInput.VarsColor[No].ColorInputDebounce[ColorCount]), &(VarsInput.VarsColor[No].ColorSampleCnt[ColorCount]), &(VarsInput.VarsColor[No].ColorLastAngle[ColorCount]), &(VarsInput.VarsColor[No].ColorEdgeCnt[ColorCount]), - ((IOMapInput.Inputs[No].SensorMode) & SLOPEMASK), - ((IOMapInput.Inputs[No].SensorMode) & MODEMASK)); + ((pIn->SensorMode) & SLOPEMASK), + ((pIn->SensorMode) & MODEMASK)); } /* Calculate background sensor values */ cInputCalcSensorValue(NewSensorVals[BLANK], - &(IOMapInput.Colors[No].SensorRaw[BLANK]), - &(IOMapInput.Colors[No].SensorValue[BLANK]), - &(IOMapInput.Colors[No].Boolean[BLANK]), + &(pC->SensorRaw[BLANK]), + &(pC->SensorValue[BLANK]), + &(pC->Boolean[BLANK]), &(VarsInput.VarsColor[No].ColorInputDebounce[BLANK]), &(VarsInput.VarsColor[No].ColorSampleCnt[BLANK]), &(VarsInput.VarsColor[No].ColorLastAngle[BLANK]), &(VarsInput.VarsColor[No].ColorEdgeCnt[BLANK]), - ((IOMapInput.Inputs[No].SensorMode) & SLOPEMASK), - ((IOMapInput.Inputs[No].SensorMode) & MODEMASK)); + ((pIn->SensorMode) & SLOPEMASK), + ((pIn->SensorMode) & MODEMASK)); /* Color Sensor values has been calculated - */ /* now calculate the color and put it in Sensor value */ @@ -541,14 +548,14 @@ void cInputCalcSensorValues(UBYTE No) if (((pC->SensorRaw[RED]) < 65) || (((pC->SensorRaw[BLANK]) < 40) && ((pC->SensorRaw[RED]) < 110))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { if (((((pC->SensorRaw[BLUE]) >> 2) + ((pC->SensorRaw[BLUE]) >> 3) + (pC->SensorRaw[BLUE])) < (pC->SensorRaw[GREEN])) && ((((pC->SensorRaw[GREEN]) << 1)) > (pC->SensorRaw[RED]))) { - IOMapInput.Inputs[No].SensorValue = YELLOWCOLOR; + pIn->SensorValue = YELLOWCOLOR; } else { @@ -556,7 +563,7 @@ void cInputCalcSensorValues(UBYTE No) if ((((pC->SensorRaw[GREEN]) << 1) - ((pC->SensorRaw[GREEN]) >> 2)) < (pC->SensorRaw[RED])) { - IOMapInput.Inputs[No].SensorValue = REDCOLOR; + pIn->SensorValue = REDCOLOR; } else { @@ -565,11 +572,11 @@ void cInputCalcSensorValues(UBYTE No) ((pC->SensorRaw[GREEN]) < 70)) || (((pC->SensorRaw[BLANK]) < 140) && ((pC->SensorRaw[RED]) < 140))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { - IOMapInput.Inputs[No].SensorValue = WHITECOLOR; + pIn->SensorValue = WHITECOLOR; } } } @@ -587,20 +594,20 @@ void cInputCalcSensorValues(UBYTE No) if (((pC->SensorRaw[GREEN]) < 40) || (((pC->SensorRaw[BLANK]) < 30) && ((pC->SensorRaw[GREEN]) < 70))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { if ((((pC->SensorRaw[BLUE]) << 1)) < (pC->SensorRaw[RED])) { - IOMapInput.Inputs[No].SensorValue = YELLOWCOLOR; + pIn->SensorValue = YELLOWCOLOR; } else { if ((((pC->SensorRaw[RED]) + ((pC->SensorRaw[RED])>>2)) < (pC->SensorRaw[GREEN])) || (((pC->SensorRaw[BLUE]) + ((pC->SensorRaw[BLUE])>>2)) < (pC->SensorRaw[GREEN]))) { - IOMapInput.Inputs[No].SensorValue = GREENCOLOR; + pIn->SensorValue = GREENCOLOR; } else { @@ -608,11 +615,11 @@ void cInputCalcSensorValues(UBYTE No) ((pC->SensorRaw[BLUE]) < 70)) || (((pC->SensorRaw[BLANK]) < 140) && ((pC->SensorRaw[GREEN]) < 140))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { - IOMapInput.Inputs[No].SensorValue = WHITECOLOR; + pIn->SensorValue = WHITECOLOR; } } } @@ -627,7 +634,7 @@ void cInputCalcSensorValues(UBYTE No) if (((pC->SensorRaw[BLUE]) < 48) || (((pC->SensorRaw[BLANK]) < 25) && ((pC->SensorRaw[BLUE]) < 85))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { @@ -637,7 +644,7 @@ void cInputCalcSensorValues(UBYTE No) (((((pC->SensorRaw[RED]) * 58) >> 5) < (pC->SensorRaw[BLUE])) || ((((pC->SensorRaw[GREEN]) * 58) >> 5) < (pC->SensorRaw[BLUE])))) { - IOMapInput.Inputs[No].SensorValue = BLUECOLOR; + pIn->SensorValue = BLUECOLOR; } else { @@ -647,18 +654,18 @@ void cInputCalcSensorValues(UBYTE No) ((pC->SensorRaw[GREEN]) < 60)) || (((pC->SensorRaw[BLANK]) < 110) && ((pC->SensorRaw[BLUE]) < 120))) { - IOMapInput.Inputs[No].SensorValue = BLACKCOLOR; + pIn->SensorValue = BLACKCOLOR; } else { if ((((pC->SensorRaw[RED]) + ((pC->SensorRaw[RED]) >> 3)) < (pC->SensorRaw[BLUE])) || (((pC->SensorRaw[GREEN]) + ((pC->SensorRaw[GREEN]) >> 3)) < (pC->SensorRaw[BLUE]))) { - IOMapInput.Inputs[No].SensorValue = BLUECOLOR; + pIn->SensorValue = BLUECOLOR; } else { - IOMapInput.Inputs[No].SensorValue = WHITECOLOR; + pIn->SensorValue = WHITECOLOR; } } } @@ -668,7 +675,7 @@ void cInputCalcSensorValues(UBYTE No) } else { - IOMapInput.Colors[No].CalibrationState = SENSOROFF; + pC->CalibrationState = SENSOROFF; VarsInput.ColorStatus &= ~(0x01<SensorType = NO_SENSOR; } if (TRUE == Status) @@ -692,7 +699,7 @@ void cInputCalcSensorValues(UBYTE No) /* Initialization finished with success recalc the values*/ (IOMapInput.Colors[No].CalibrationState) = 0; - IOMapInput.Inputs[No].SensorType = NO_SENSOR; + pIn->SensorType = NO_SENSOR; VarsInput.OldSensorType[No] = NO_SENSOR; } } @@ -1363,3 +1370,63 @@ void cInputExit(void) dInputExit(); } +UBYTE cInputPinFunc(UBYTE Cmd, UBYTE Port, UBYTE Pin, UBYTE *pData) +{ + UBYTE ReturnState = NO_ERR; + if (IOMapInput.Inputs[Port].SensorType != CUSTOM) + return (UBYTE)ERR_INVALID_PORT; + + UBYTE WaitUSEC = (Cmd&0xFC)>>2; + UBYTE Dir = (Pin&0xFC)>>2; + Pin &= 0x03; + + switch(Cmd&0x03) + { + case PINDIR: + { + if (Pin & DIGI0) + { + if (Dir) + dInputSetDirInDigi0(Port); + else + dInputSetDirOutDigi0(Port); + } + if (Pin & DIGI1) + { + if (Dir) + dInputSetDirInDigi1(Port); + else + dInputSetDirOutDigi1(Port); + } + } + break; + case SETPIN: + { + if (Pin & DIGI0) + dInputSetDigi0(Port); + if (Pin & DIGI1) + dInputSetDigi1(Port); + } + break; + case CLEARPIN: + { + if (Pin & DIGI0) + dInputClearDigi0(Port); + if (Pin & DIGI1) + dInputClearDigi1(Port); + } + break; + case READPIN: + { + if (Pin & DIGI0) + dInputRead0(Port, pData); + if (Pin & DIGI1) + dInputRead1(Port, pData); + } + break; + } + if (WaitUSEC) + dInputWaitUS(WaitUSEC); + + return (ReturnState); +} -- cgit v1.2.3