• AVR Freaks

Hot!H2.06 Resistive Touch Setup for Class 1 ADC Inputs

Author
TS9
Super Member
  • Total Posts : 649
  • Reward points : 0
  • Joined: 2010/05/07 10:52:22
  • Status: offline
2019/05/07 00:43:27 (permalink)
0

H2.06 Resistive Touch Setup for Class 1 ADC Inputs

Hi,
 
This is continuation topic from 
https://www.microchip.com/forums/m1096839.aspx
 
I am using Harmony H2.06 , PIC32MZ2048EFM100, GFX LCC 4.3 480 x 272 TFT.
 
I have ported aria_touchadc_calibrate from pic32mz_ef_sk_s1d_pictail_wqvga to pic32mz_ef_LCC_wqvga 
which is not available in Harmony V2_06 for four wire resistive touch Successfully.
 Code Reached at "TouchADC TouchWidget Test".
But RTP did not worked yet.
 
 
/*** Functions for BSP_ADC_TOUCH_XMINUS pin ***/
#define BSP_ADC_TOUCH_XMINUS_PORT PORT_CHANNEL_B
#define BSP_ADC_TOUCH_XMINUS_PIN PORTS_BIT_POS_3
#define BSP_ADC_TOUCH_XMINUS_PIN_MASK (0x1 << 3)
 
/*** Functions for BSP_ADC_TOUCH_YMINUS pin ***/
#define BSP_ADC_TOUCH_YMINUS_PORT PORT_CHANNEL_B
#define BSP_ADC_TOUCH_YMINUS_PIN PORTS_BIT_POS_2
#define BSP_ADC_TOUCH_YMINUS_PIN_MASK (0x1 << 2)
 
/*** Functions for BSP_ADC_TOUCH_XPLUS pin ***/
#define BSP_ADC_TOUCH_XPLUS_PORT PORT_CHANNEL_B
#define BSP_ADC_TOUCH_XPLUS_PIN PORTS_BIT_POS_1
#define BSP_ADC_TOUCH_XPLUS_PIN_MASK (0x1 << 1)
 
/*** Functions for BSP_ADC_TOUCH_YPLUS pin ***/
#define BSP_ADC_TOUCH_YPLUS_PORT PORT_CHANNEL_B
#define BSP_ADC_TOUCH_YPLUS_PIN PORTS_BIT_POS_0
#define BSP_ADC_TOUCH_YPLUS_PIN_MASK (0x1 << 0)
 
 
 
X+ -> Analog with 100K
Y+  -> Analog with 100K
X-  -> GPIO
Y-  -> GPIO
 
Please Check screenshots and update...
Has anybody tried this with  Class 1 ADC Inputs of PIC32MZ?
 
Thanks..
post edited by TS9 - 2019/05/07 08:08:13

Attached Image(s)

#1

6 Replies Related Threads

    TS9
    Super Member
    • Total Posts : 649
    • Reward points : 0
    • Joined: 2010/05/07 10:52:22
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/09 07:06:01 (permalink)
    0
    Anybody tried this?
    #2
    TS9
    Super Member
    • Total Posts : 649
    • Reward points : 0
    • Joined: 2010/05/07 10:52:22
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/10 11:19:57 (permalink)
    0
    Please Update If any body have some idea..
    #3
    automate
    Junior Member
    • Total Posts : 83
    • Reward points : 0
    • Joined: 2014/11/10 09:58:57
    • Location: 0
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/10 15:24:10 (permalink)
    0
    @TS9
     
    Class 1 support does not have a productized solution for the touch_calibrate application and/or the touch_adc driver.
     
    However, a few customers have been successful with appropriate class 1 configuration through Microchip Harmony Configurator (MHC). For general configuration of ADC class 1,  please look at the following thread. The user shows an example of how to do this for a class 1 inputs:
     
    https://www.microchip.com/forums/m888193.aspx#888193
     
    #4
    TS9
    Super Member
    • Total Posts : 649
    • Reward points : 0
    • Joined: 2010/05/07 10:52:22
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/11 00:04:31 (permalink)
    0
    Thanks automate for update..
    automate
    However, a few customers have been successful with appropriate class 1 configuration through Microchip Harmony Configurator (MHC). For general configuration of ADC class 1,  please look at the following thread. The user shows an example of how to do this for a class 1 inputs: 
    https://www.microchip.com..ums/m888193.aspx#888193
     

     
    From the link below link I got only for
    "Example of how to do this for a class 1 input. I used AN2, so had to enable this section For Harmony 1.xx":
    But I have to choose AN0 and AN1 which is not under ADCHS_CHANNEL_2.
    So I have selected Channel Intsance 0 > ADCHS_CHANNEL_0
    > ADCHS_DEFALUT_CLASS1_AN0 > ADCHS_TRIGGER_SOURCE_SCAN

    Same for Channel Intsance 1 > ADCHS_CHANNEL_1
    > ADCHS_DEFALUT_CLASS1_AN1 > ADCHS_TRIGGER_SOURCE_SCAN
     
    and Under the Other Options Uncheck Enable Analog Input Scanning.
    Also the OP from this said.
     
    DRV_ADC1_Open(); //<--- FORGOT TO OPEN ADC1
    DRV_ADC2_Open(); //<--- AND FORGOT TO OPEN ADC2
    Do I need to add this  in following code.

    void DRV_ADC_Initialize(void)
    {
    /* Select Power Mode */
    PLIB_ADCHS_Setup(
    DRV_ADC_ID_1,
    ADCHS_VREF_AVDD_AVSS,
    ADCHS_CHARGEPUMP_DISABLE,
    ADCHS_OUTPUT_DATA_FORMAT_INTEGER,
    false,
    ADCHS_FAST_SYNC_SYSTEM_CLOCK_DISABLE,
    ADCHS_FAST_SYNC_PERIPHERAL_CLOCK_DISABLE,
    0,
    0,
    ADCHS_CLOCK_SOURCE_PBCLK,
    1,
    ADCHS_WARMUP_CLOCK_32768
    );

    PLIB_ADCHS_ChannelSetup(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_0,
    ADCHS_DATA_RESOLUTION_12BIT,
    1,
    272,
    0
    );
    if(false == PLIB_ADCHS_ChannelTriggerSampleSelect(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_0,
    ADCHS_CHANNEL_UNSYNC_TRIGGER_UNSYNC_SAMPLING
    ))
    { while(1);}
    /* Since configuration of analog inputs (dedicated and alternate) for dedicated ADC channel */
    /* is done via selection of dedicated channel only, here, the analog input for a dedicated */
    /* ADC channel number is fixed */
    if(false == PLIB_ADCHS_ChannelInputSelect(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_0,
    (ADCHS_CHANNEL_INP_SEL)ADCHS_DEFAULT_CLASS1_AN0
    ))
    { while(1);}
     
    PLIB_ADCHS_AnalogInputModeSelect(
    DRV_ADC_ID_1,
    ADCHS_AN0,
    ADCHS_INPUT_MODE_SINGLE_ENDED_UNIPOLAR
    );
    PLIB_ADCHS_AnalogInputEdgeTriggerSet( DRV_ADC_ID_1, ADCHS_CLASS12_AN0 );
    PLIB_ADCHS_AnalogInputTriggerSourceSelect(
    DRV_ADC_ID_1,
    ADCHS_CLASS12_AN0,
    ADCHS_TRIGGER_SOURCE_SCAN
    );
    if (DEVADC0 != 0xFFFFFFFF)
    PLIB_ADCHS_ChannelConfigurationSet(DRV_ADC_ID_1, ADCHS_CHANNEL_0, DEVADC0);
    PLIB_ADCHS_ChannelSetup(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_1,
    ADCHS_DATA_RESOLUTION_12BIT,
    1,
    1,
    0
    );
    if(false == PLIB_ADCHS_ChannelTriggerSampleSelect(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_1,
    ADCHS_CHANNEL_UNSYNC_TRIGGER_UNSYNC_SAMPLING
    ))
    { while(1);}
    /* Since configuration of analog inputs (dedicated and alternate) for dedicated ADC channel */
    /* is done via selection of dedicated channel only, here, the analog input for a dedicated */
    /* ADC channel number is fixed */
    if(false == PLIB_ADCHS_ChannelInputSelect(
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_1,
    (ADCHS_CHANNEL_INP_SEL)ADCHS_DEFAULT_CLASS1_AN1
    ))
    { while(1);}

    PLIB_ADCHS_AnalogInputModeSelect(
    DRV_ADC_ID_1,
    ADCHS_AN1,
    ADCHS_INPUT_MODE_SINGLE_ENDED_UNIPOLAR
    );
    PLIB_ADCHS_AnalogInputEdgeTriggerSet( DRV_ADC_ID_1, ADCHS_CLASS12_AN1 );
    PLIB_ADCHS_AnalogInputTriggerSourceSelect(
    DRV_ADC_ID_1,
    ADCHS_CLASS12_AN1,
    ADCHS_TRIGGER_SOURCE_SCAN
    );
    if (DEVADC1 != 0xFFFFFFFF)
    PLIB_ADCHS_ChannelConfigurationSet(DRV_ADC_ID_1, ADCHS_CHANNEL_1, DEVADC1);
     
     
     
    /* Enable ADC */
    PLIB_ADCHS_Enable(DRV_ADC_ID_1);

    /* Check Vref to be ready */
    while(!PLIB_ADCHS_VREFIsReady(DRV_ADC_ID_1));

    /* Check for Vref Fault */
    while(PLIB_ADCHS_VREFFaultHasOccurred(DRV_ADC_ID_1));



    /* Enable analog feature for the specified channel */
    PLIB_ADCHS_ChannelAnalogFeatureEnable
    (
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_0
    );

    /* Wait for the modules to be ready */
    while(!PLIB_ADCHS_ChannelIsReady
    (
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_0
    )
    );
    /* Enable analog feature for the specified channel */
    PLIB_ADCHS_ChannelAnalogFeatureEnable
    (
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_1
    );

    /* Wait for the modules to be ready */
    while(!PLIB_ADCHS_ChannelIsReady
    (
    DRV_ADC_ID_1,
    ADCHS_CHANNEL_1
    )
    );
    }

    Any way  I have got below error as per below :

    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c: In function 'DRV_TOUCH_ADC_PositionDetect':
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:542:67: error: expected expression before ')' token
    if ( !PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ) )
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:547:74: error: expected expression before ')' token
    (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2 )
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:598:67: error: expected expression before ')' token
    if ( !PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ) )
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:604:74: error: expected expression before ')' token
    (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2)
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:636:67: error: expected expression before ')' token
    if ( !PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ) )
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:642:74: error: expected expression before ')' token
    (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2)
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:683:66: error: expected expression before ')' token
    if (!PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ))
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:687:77: error: expected expression before ')' token
    temp = (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2;
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:711:66: error: expected expression before ')' token
    if (!PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ))
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:716:77: error: expected expression before ')' token
    temp = (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2;
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:740:66: error: expected expression before ')' token
    if (!PLIB_ADCHS_AnalogInputDataIsReady(DRV_ADC_ID_1, ))
    ^
    ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/input/touch_adc/src/drv_touch_adc.c:746:74: error: expected expression before ')' token
    (uint16_t) PLIB_ADCHS_AnalogInputResultGet(DRV_ADC_ID_1, )>>2 )
    ^
    make[2]: *** [build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/1179893018/drv_touch_adc.o] Error 1
    make[2]: *** Waiting for unfinished jobs....
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/1978752353/drv_adc_static.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/1978752353/drv_adc_static.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/adc/src/drv_adc_static.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2024536424/drv_tmr_static.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2024536424/drv_tmr_static.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/tmr/src/drv_tmr_static.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/968926553/drv_gfx_lcc_generic.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/968926553/drv_gfx_lcc_generic.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/gfx/driver/controller/lcc/drv_gfx_lcc_generic.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2017430663/libaria_harmony.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2017430663/libaria_harmony.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/gfx/libaria/libaria_harmony.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2024536424/drv_tmr_mapping.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2024536424/drv_tmr_mapping.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/driver/tmr/src/drv_tmr_mapping.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2017430663/libaria_init.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/2017430663/libaria_init.o ../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework/gfx/libaria/libaria_init.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    "C:\Program Files (x86)\Microchip\xc32\v2.10\bin\xc32-gcc.exe" -g -x c -c -mprocessor=32MZ2048EFM100 -ffunction-sections -O1 -I../src -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga -I../src/pic32mz_ef_sk_s1d_pictail_wqvga -I../../../../../framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/framework -I../src/system_config/pic32mz_ef_sk_s1d_pictail_wqvga/bsp -Werror -Wall -MMD -MF build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/493934858/lodepng.o.d -o build/pic32mz_ef_sk_s1d_pictail_wqvga/production/_ext/493934858/lodepng.o ../../../../../third_party/decoder/lodepng/lodepng.c -DXPRJ_pic32mz_ef_sk_s1d_pictail_wqvga=pic32mz_ef_sk_s1d_pictail_wqvga -legacy-libc
    make[2]: Leaving directory 'C:/microchip/harmony/v2_06/apps/gfx/GFX_RTP_100_PIN/firmware/GFX_RTP_100.X'
    nbproject/Makefile-pic32mz_ef_sk_s1d_pictail_wqvga.mk:90: recipe for target '.build-conf' failed
    make[1]: Leaving directory 'C:/microchip/harmony/v2_06/apps/gfx/GFX_RTP_100_PIN/firmware/GFX_RTP_100.X'
    nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2

     
    Please Check attachments... What I am missing ?
     
    Thanks for your efforts
    --
    TS9

    Attached Image(s)

    #5
    TS9
    Super Member
    • Total Posts : 649
    • Reward points : 0
    • Joined: 2010/05/07 10:52:22
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/11 00:58:42 (permalink)
    0
    @automate.. 

    I have gone through your threadhttps://www.microchip.com/forums/m1069348.aspx for  proceed to Resistive Touch .but unfortunately ADC Channels/Classes have not mentioned/seen is that post.


     Can you please send me..MHC Screenshots.. How to use AN0 and AN1 according to my hardware alongwith what i need to add in  Code (For Microchip Harmony V2_06) ?

    Any other suggestions?
    post edited by TS9 - 2019/05/11 04:33:54
    #6
    TS9
    Super Member
    • Total Posts : 649
    • Reward points : 0
    • Joined: 2010/05/07 10:52:22
    • Status: offline
    Re: H2.06 Resistive Touch Setup for Class 1 ADC Inputs 2019/05/15 17:07:10 (permalink)
    0
    @automate

    Please Update...
    #7
    Jump to:
    © 2019 APG vNext Commercial Version 4.5