├── images ├── PICkit.jpg ├── MPLAB_X_IDE.png ├── MPLAB_X_IPE.png ├── ATU-100_EXT_YAF.jpg └── Calibrate_setup.png ├── ATU-100_YAF.X ├── adc.h ├── disp.h ├── menu.h ├── uart.h ├── button.h ├── defines.h ├── eeprom.h ├── utili.c ├── utili.h ├── nbproject │ ├── Makefile-variables.mk │ ├── Makefile-genesis.properties │ ├── project.xml │ ├── Makefile-impl.mk │ ├── Makefile-local-default.mk │ ├── configurations.xml │ └── Makefile-default.mk ├── tune.h ├── eeprom.c ├── adc.c ├── font5x8.h ├── Makefile ├── button.c ├── uart.c ├── main.c ├── disp.c ├── tune.c └── menu.c ├── .gitignore ├── LICENSE ├── README.md └── dist └── ATU-100_YAF_0V68.hex /images/PICkit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/images/PICkit.jpg -------------------------------------------------------------------------------- /ATU-100_YAF.X/adc.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/adc.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/disp.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/disp.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/menu.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/menu.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/uart.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/uart.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/button.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/button.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/defines.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/defines.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/eeprom.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/eeprom.h -------------------------------------------------------------------------------- /ATU-100_YAF.X/utili.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/utili.c -------------------------------------------------------------------------------- /ATU-100_YAF.X/utili.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/ATU-100_YAF.X/utili.h -------------------------------------------------------------------------------- /images/MPLAB_X_IDE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/images/MPLAB_X_IDE.png -------------------------------------------------------------------------------- /images/MPLAB_X_IPE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/images/MPLAB_X_IPE.png -------------------------------------------------------------------------------- /images/ATU-100_EXT_YAF.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/images/ATU-100_EXT_YAF.jpg -------------------------------------------------------------------------------- /images/Calibrate_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DG4SN/ATU-100-EXT-YAF/HEAD/images/Calibrate_setup.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /ATU-100_YAF.X/build 2 | /ATU-100_YAF.X/debug 3 | /ATU-100_YAF.X/dist 4 | /ATU-100_YAF.X/nbproject/private 5 | 6 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/Makefile-variables.mk: -------------------------------------------------------------------------------- 1 | # 2 | # Generated - do not edit! 3 | # 4 | # NOCDDL 5 | # 6 | CND_BASEDIR=`pwd` 7 | # default configuration 8 | CND_ARTIFACT_DIR_default=dist/default/production 9 | CND_ARTIFACT_NAME_default=ATU-100_YAF.X.production.hex 10 | CND_ARTIFACT_PATH_default=dist/default/production/ATU-100_YAF.X.production.hex 11 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/tune.h: -------------------------------------------------------------------------------- 1 | /* 2 | * File: tune.h 3 | * Author: sven 4 | * 5 | * Created on 30. Juni 2022, 19:50 6 | */ 7 | 8 | #ifndef TUNE_H 9 | #define TUNE_H 10 | 11 | #include "defines.h" 12 | 13 | 14 | #ifdef __cplusplus 15 | extern "C" 16 | { 17 | #endif 18 | 19 | 20 | #define TUNE_MIN_PWR 10 //10 = 1W 21 | 22 | 23 | 24 | 25 | typedef enum 26 | { 27 | TUNE_IDLE=1, 28 | TUNE_RUN=2, 29 | TUNE_BREAK=3, 30 | TUNE_PWRLOW=4, 31 | TUNE_READY=5 32 | } tunestate_t; 33 | 34 | 35 | 36 | 37 | 38 | extern tunestate_t TUNE_state; 39 | 40 | void TUNE_Init(void); 41 | void TUNE_Run(void); 42 | 43 | 44 | 45 | 46 | #ifdef __cplusplus 47 | } 48 | #endif 49 | 50 | #endif /* TUNE_H */ 51 | 52 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/Makefile-genesis.properties: -------------------------------------------------------------------------------- 1 | # 2 | #Tue Dec 27 17:24:42 CET 2022 3 | default.languagetoolchain.version=2.36 4 | default.Pack.dfplocation=C\:\\Program Files\\Microchip\\MPLABX\\v6.00\\packs\\Microchip\\PIC12-16F1xxx_DFP\\1.3.90 5 | conf.ids=default 6 | default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc8\\v2.36\\bin 7 | host.id=2rua-ogxv-qq 8 | configurations-xml=4c4faae0ea3c7ac91e8c9c18002299a0 9 | default.com-microchip-mplab-mdbcore-PICKit3Tool-PICkit3DbgToolManager.md5=da762f67e85632f6b187619070210246 10 | com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=6e02ca5e9f5042ffd365b42ab82d3a9b 11 | user-defined-mime-resolver-xml=none 12 | default.com-microchip-mplab-nbide-toolchain-xc8-XC8LanguageToolchain.md5=ab1e0737b447a24f7366e9fd8fe5a2f0 13 | proj.dir=C\:\\Users\\sven\\Documents\\GitHub\\ATU-100-EXT-YAF\\ATU-100_YAF.X 14 | host.platform=windows 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 DG4SN 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.microchip.mplab.nbide.embedded.makeproject 4 | 5 | 6 | ATU-100_YAF 7 | e1ae4b54-01c3-47b3-b6bb-d6b616154a62 8 | 0 9 | c 10 | 11 | h 12 | 13 | ISO-8859-1 14 | 15 | 16 | . 17 | 18 | 19 | 20 | default 21 | 2 22 | 23 | 24 | 25 | false 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/eeprom.c: -------------------------------------------------------------------------------- 1 | /** 2 | * Eeprom function 3 | */ 4 | 5 | #include "defines.h" 6 | 7 | 8 | void EEPROM_Init(void) 9 | { 10 | EEPROM_Read((uint8_t)&ee_tune_stop_swr, &global.tune_stop_swr, sizeof(global.tune_stop_swr)); 11 | EEPROM_Read((uint8_t)&ee_tune_auto_swr, &global.tune_auto_swr, sizeof(global.tune_auto_swr)); 12 | EEPROM_Read((uint8_t)&ee_tune_auto_enable, &global.tune_auto_enable, sizeof(global.tune_auto_enable)); 13 | EEPROM_Read((uint8_t)&ee_sleep_delay_sec, &global.sleep_delay_sec, sizeof(global.sleep_delay_sec)); 14 | EEPROM_Read((uint8_t)&ee_sleep_enable, &global.sleep_enable, sizeof(global.sleep_enable)); 15 | EEPROM_Read((uint8_t)&ee_cal_point_0, &global.cal_point[0], sizeof(global.cal_point[0])); 16 | EEPROM_Read((uint8_t)&ee_cal_point_1, &global.cal_point[1], sizeof(global.cal_point[1])); 17 | EEPROM_Read((uint8_t)&ee_cal_offset, &global.cal_offset, sizeof(global.cal_offset)); 18 | EEPROM_Read((uint8_t)&ee_cal_gain, &global.cal_gain, sizeof(global.cal_gain)); 19 | } 20 | 21 | 22 | void EEPROM_Write(uint8_t addr, void *ptrValue, uint8_t size) 23 | { 24 | uint8_t *ptr = ptrValue; 25 | while(size >0) 26 | { 27 | eeprom_write(addr, *ptr); 28 | size--; 29 | addr++; 30 | ptr++; 31 | } 32 | } 33 | 34 | 35 | void EEPROM_Read(uint8_t addr, void *ptrValue, uint8_t size) 36 | { 37 | uint8_t *ptr = ptrValue; 38 | while(size >0) 39 | { 40 | *ptr = eeprom_read(addr); 41 | size--; 42 | addr++; 43 | ptr++; 44 | } 45 | } -------------------------------------------------------------------------------- /ATU-100_YAF.X/adc.c: -------------------------------------------------------------------------------- 1 | /** 2 | * ADC functions 3 | */ 4 | #include "defines.h" 5 | 6 | #define mV_per_Digit 4 7 | 8 | #define AVERAGE_DEEP 10 9 | 10 | static int16_t f_buffer[AVERAGE_DEEP]; 11 | static int16_t r_buffer[AVERAGE_DEEP]; 12 | 13 | 14 | void ADC_Init(void) 15 | { 16 | 17 | //Set Ports 18 | //ANSELAbits.ANSELA = 0; 19 | 20 | ADC_REVERSE_DIR = DIR_INPUT; 21 | ADC_REVERSE_SEL = 1; 22 | 23 | ADC_FORWARD_DIR = DIR_INPUT; 24 | ADC_FORWARD_SEL = 1; 25 | 26 | 27 | 28 | 29 | FVRCON = 0b10000011; // ADC 4096 mV Vref 30 | //while (FVRCONbits.FVRRDY == 0); 31 | 32 | //ADCON1 settings 33 | ADCON1bits.ADFM = 1; //right justified format 34 | ADCON1bits.ADCS = 2; //Fosc/32 35 | 36 | ADCON1bits.ADNREF = 0; //negative Ref to Vss 37 | ADCON1bits.ADPREF = 3; //positive Ref to FVR module 38 | 39 | 40 | //ADCON0 settings 41 | ADCON0bits.ADON = 1; 42 | } 43 | 44 | int16_t ADC_GetSample(uint8_t ch) 45 | { 46 | ADCON0bits.CHS = ch; 47 | DELAY_5_us(); 48 | ADCON0bits.ADGO = 1; /* start A/D */ 49 | while (ADCON0bits.ADGO == 1); 50 | int16_t hi = ADRESH; 51 | 52 | return (((hi << 8) + ADRESL) * mV_per_Digit); 53 | 54 | } 55 | 56 | 57 | void ADC_Run(void) 58 | { 59 | // int16_t value; 60 | // int32_t average; 61 | 62 | int32_t f_sum =0; 63 | int32_t r_sum =0; 64 | 65 | uint8_t i; 66 | uint8_t s; 67 | 68 | //move buffer 69 | s=0; 70 | for(i=0; i < (AVERAGE_DEEP -1); i++) 71 | { 72 | s++; 73 | f_sum += f_buffer[i] = f_buffer[s]; 74 | r_sum += r_buffer[i] = r_buffer[s]; 75 | } 76 | 77 | f_sum += f_buffer[s] = ADC_GetSample(ADC_FORWARD_CH); 78 | r_sum += r_buffer[s] = ADC_GetSample(ADC_REVERSE_CH); 79 | 80 | 81 | //cal average 82 | global.adc_f_mV = (int16_t)(f_sum / AVERAGE_DEEP); 83 | global.adc_r_mV = (int16_t)(r_sum / AVERAGE_DEEP); 84 | 85 | } 86 | 87 | 88 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/Makefile-impl.mk: -------------------------------------------------------------------------------- 1 | # 2 | # Generated Makefile - do not edit! 3 | # 4 | # Edit the Makefile in the project folder instead (../Makefile). Each target 5 | # has a pre- and a post- target defined where you can add customization code. 6 | # 7 | # This makefile implements macros and targets common to all configurations. 8 | # 9 | # NOCDDL 10 | 11 | 12 | # Building and Cleaning subprojects are done by default, but can be controlled with the SUB 13 | # macro. If SUB=no, subprojects will not be built or cleaned. The following macro 14 | # statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf 15 | # and .clean-reqprojects-conf unless SUB has the value 'no' 16 | SUB_no=NO 17 | SUBPROJECTS=${SUB_${SUB}} 18 | BUILD_SUBPROJECTS_=.build-subprojects 19 | BUILD_SUBPROJECTS_NO= 20 | BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} 21 | CLEAN_SUBPROJECTS_=.clean-subprojects 22 | CLEAN_SUBPROJECTS_NO= 23 | CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} 24 | 25 | 26 | # Project Name 27 | PROJECTNAME=ATU-100_YAF.X 28 | 29 | # Active Configuration 30 | DEFAULTCONF=default 31 | CONF=${DEFAULTCONF} 32 | 33 | # All Configurations 34 | ALLCONFS=default 35 | 36 | 37 | # build 38 | .build-impl: .build-pre 39 | ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf 40 | 41 | 42 | # clean 43 | .clean-impl: .clean-pre 44 | ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf 45 | 46 | # clobber 47 | .clobber-impl: .clobber-pre .depcheck-impl 48 | ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean 49 | 50 | 51 | 52 | # all 53 | .all-impl: .all-pre .depcheck-impl 54 | ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build 55 | 56 | 57 | 58 | # dependency checking support 59 | .depcheck-impl: 60 | # @echo "# This code depends on make tool being used" >.dep.inc 61 | # @if [ -n "${MAKE_VERSION}" ]; then \ 62 | # echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ 63 | # echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ 64 | # echo "include \$${DEPFILES}" >>.dep.inc; \ 65 | # echo "endif" >>.dep.inc; \ 66 | # else \ 67 | # echo ".KEEP_STATE:" >>.dep.inc; \ 68 | # echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ 69 | # fi 70 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/Makefile-local-default.mk: -------------------------------------------------------------------------------- 1 | # 2 | # Generated Makefile - do not edit! 3 | # 4 | # 5 | # This file contains information about the location of compilers and other tools. 6 | # If you commmit this file into your revision control server, you will be able to 7 | # to checkout the project and build it from the command line with make. However, 8 | # if more than one person works on the same project, then this file might show 9 | # conflicts since different users are bound to have compilers in different places. 10 | # In that case you might choose to not commit this file and let MPLAB X recreate this file 11 | # for each user. The disadvantage of not commiting this file is that you must run MPLAB X at 12 | # least once so the file gets created and the project can be built. Finally, you can also 13 | # avoid using this file at all if you are only building from the command line with make. 14 | # You can invoke make with the values of the macros: 15 | # $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... 16 | # 17 | SHELL=cmd.exe 18 | PATH_TO_IDE_BIN=C:/Program Files/Microchip/MPLABX/v6.00/mplab_platform/platform/../mplab_ide/modules/../../bin/ 19 | # Adding MPLAB X bin directory to path. 20 | PATH:=C:/Program Files/Microchip/MPLABX/v6.00/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) 21 | # Path to java used to run MPLAB X when this makefile was created 22 | MP_JAVA_PATH="C:\Program Files\Microchip\MPLABX\v6.00\sys\java\zulu8.54.0.21-ca-fx-jre8.0.292-win_x64/bin/" 23 | OS_CURRENT="$(shell uname -s)" 24 | MP_CC="C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe" 25 | # MP_CPPC is not defined 26 | # MP_BC is not defined 27 | MP_AS="C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe" 28 | MP_LD="C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe" 29 | MP_AR="C:\Program Files\Microchip\xc8\v2.36\bin\xc8-ar.exe" 30 | DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files/Microchip/MPLABX/v6.00/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" 31 | MP_CC_DIR="C:\Program Files\Microchip\xc8\v2.36\bin" 32 | # MP_CPPC_DIR is not defined 33 | # MP_BC_DIR is not defined 34 | MP_AS_DIR="C:\Program Files\Microchip\xc8\v2.36\bin" 35 | MP_LD_DIR="C:\Program Files\Microchip\xc8\v2.36\bin" 36 | MP_AR_DIR="C:\Program Files\Microchip\xc8\v2.36\bin" 37 | # MP_BC_DIR is not defined 38 | DFP_DIR=C:/Program Files/Microchip/MPLABX/v6.00/packs/Microchip/PIC12-16F1xxx_DFP/1.3.90 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Antenna tuner - ATU-100 EXT - Yet Another Firmware 2 | ![ATU-100_EXT_YAF](images/ATU-100_EXT_YAF.jpg) 3 | 4 | ## Motivation 5 | After I have bought a Chinese clone of N7DDC Antenna tune ATU-100 EXT I wasn’t really satisfied. 6 | The tuner was not able to work with my QRP transmitter. Also the shown power was very inaccurate. 7 | I have seen some room for improvement in the firmware. Unfortunately the original firmware of N7DDC was written under the mikroC IDE that is not available for free. So I decided to start the project from scratch with the Microchip MPLAB X IDE. 8 | 9 | ## The original project by N7DDC 10 | https://github.com/Dfinitski/N7DDC-ATU-100-mini-and-extended-boards 11 | 12 | ## Imported Notes 13 | This firmware only works with the ATU-100_EXT (7x7) hardware, the PIC16F1938 MCU and the OLED Display 128x64px. 14 | Before you start please make a backup of the original firmware and be sure that you can restore it. 15 | ```diff 16 | - You act at your own risk! 17 | ``` 18 | ## Features 19 | + Function menu on display – one button operation 20 | + 10 memory slots for tune-settings one of them as a startup setting 21 | + Calibration function for the integrated power meter 22 | + Configurable Auto-Tune function 23 | + Sleep function for battery saving 24 | + Temporary Bypass function 25 | 26 | ## Button functions 27 | **Button short pressed:** _____ *Start Tuning or select next item* 28 | 29 | **Button long pressed:** ______ *Enter Menu or change value* 30 | 31 | ## Menu-tree 32 | + Bypass ______*Temporary bypass the current tune settings* 33 | + Load Tune __ *Load tune setting from memory slots* 34 | + Save Tune __ *Save the current tune settings in 10 memory slots* 35 | + Reset ______ *Reset the current tune settings* 36 | + Setup 37 | - Tuning _____ *Set tune parameters (Auto tune on/off)* 38 | * Sleep ______ *Set sleep mode and time* 39 | * Calibrate __ *Calibrate the power measurement at two points* 40 | * Test _______ *Test function for each relay* 41 | + About ______ *Who did it* 42 | 43 | ## Calibration 44 | The firmware includes a two point calibration function for the integrated power meter. 45 | It is recommend to calibrate on the lowest (max 10W) and highest (max 100W) used power level. 46 | For calibration you need a transmitter with adjustable TX power and a dummy load. 47 | ![Calibration](images/Calibrate_setup.png) 48 | 49 | ## Programmer 50 | For programming a PICkit3 programmer is used. 51 | When the ATU-100 is switched off, connect it in the shown way. 52 | After that switch on the ATU-100. 53 | ![PICkit](images/PICkit.jpg) 54 | 55 | ## Programming Tool 56 | If you only like to flash the firmware you can use the Microchip Integrated Programming Environment 57 | **MPLAB X IPE**. 58 | The needed hex-file you find in the *dist* folder. 59 | ![MPLAB_X_IPE](images/MPLAB_X_IPE.png) 60 | 61 | ## Development IDE 62 | For development the Microchip **MPLAB X IDE v6.00** was used. 63 | The IDE is available for free on the Microchip web side. 64 | ![MPLAB_X_IDE](images/MPLAB_X_IDE.png) 65 | 66 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/font5x8.h: -------------------------------------------------------------------------------- 1 | static const char font5x8[] = { 2 | // 3 | 0x00, 0x00, 0x00, 0x00, 0x00,// (space) 4 | 0x00, 0x00, 0x5F, 0x00, 0x00,// ! 5 | 0x00, 0x07, 0x00, 0x07, 0x00,// " 6 | 0x14, 0x7F, 0x14, 0x7F, 0x14,// # 7 | 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 8 | 0x23, 0x13, 0x08, 0x64, 0x62,// % 9 | 0x36, 0x49, 0x55, 0x22, 0x50,// & 10 | 0x00, 0x05, 0x03, 0x00, 0x00,// ' 11 | 0x00, 0x1C, 0x22, 0x41, 0x00,// ( 12 | 0x00, 0x41, 0x22, 0x1C, 0x00,// ) 13 | 0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 14 | 0x08, 0x08, 0x3E, 0x08, 0x08,// + 15 | 0x00, 0x50, 0x30, 0x00, 0x00,// , 16 | 0x08, 0x08, 0x08, 0x08, 0x08,// - 17 | 0x00, 0x30, 0x30, 0x00, 0x00,// . 18 | 0x20, 0x10, 0x08, 0x04, 0x02,// / 19 | 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 20 | 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 21 | 0x42, 0x61, 0x51, 0x49, 0x46,// 2 22 | 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 23 | 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 24 | 0x27, 0x45, 0x45, 0x45, 0x39,// 5 25 | 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 26 | 0x01, 0x71, 0x09, 0x05, 0x03,// 7 27 | 0x36, 0x49, 0x49, 0x49, 0x36,// 8 28 | 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 29 | 0x00, 0x36, 0x36, 0x00, 0x00,// : 30 | 0x00, 0x56, 0x36, 0x00, 0x00,// ; 31 | 0x00, 0x08, 0x14, 0x22, 0x41,// < 32 | 0x14, 0x14, 0x14, 0x14, 0x14,// = 33 | 0x41, 0x22, 0x14, 0x08, 0x00,// > 34 | 0x02, 0x01, 0x51, 0x09, 0x06,// ? 35 | 0x32, 0x49, 0x79, 0x41, 0x3E,// @ 36 | 0x7E, 0x11, 0x11, 0x11, 0x7E,// A 37 | 0x7F, 0x49, 0x49, 0x49, 0x36,// B 38 | 0x3E, 0x41, 0x41, 0x41, 0x22,// C 39 | 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 40 | 0x7F, 0x49, 0x49, 0x49, 0x41,// E 41 | 0x7F, 0x09, 0x09, 0x01, 0x01,// F 42 | 0x3E, 0x41, 0x41, 0x51, 0x32,// G 43 | 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 44 | 0x00, 0x41, 0x7F, 0x41, 0x00,// I 45 | 0x20, 0x40, 0x41, 0x3F, 0x01,// J 46 | 0x7F, 0x08, 0x14, 0x22, 0x41,// K 47 | 0x7F, 0x40, 0x40, 0x40, 0x40,// L 48 | 0x7F, 0x02, 0x04, 0x02, 0x7F,// M 49 | 0x7F, 0x04, 0x08, 0x10, 0x7F,// N 50 | 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 51 | 0x7F, 0x09, 0x09, 0x09, 0x06,// P 52 | 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 53 | 0x7F, 0x09, 0x19, 0x29, 0x46,// R 54 | 0x46, 0x49, 0x49, 0x49, 0x31,// S 55 | 0x01, 0x01, 0x7F, 0x01, 0x01,// T 56 | 0x3F, 0x40, 0x40, 0x40, 0x3F,// U 57 | 0x1F, 0x20, 0x40, 0x20, 0x1F,// V 58 | 0x7F, 0x20, 0x18, 0x20, 0x7F,// W 59 | 0x63, 0x14, 0x08, 0x14, 0x63,// X 60 | 0x03, 0x04, 0x78, 0x04, 0x03,// Y 61 | 0x61, 0x51, 0x49, 0x45, 0x43,// Z 62 | 0x00, 0x00, 0x7F, 0x41, 0x41,// [ 63 | 0x02, 0x04, 0x08, 0x10, 0x20,// "\" 64 | 0x41, 0x41, 0x7F, 0x00, 0x00,// ] 65 | 0x04, 0x02, 0x01, 0x02, 0x04,// ^ 66 | 0x40, 0x40, 0x40, 0x40, 0x40,// _ 67 | 0x00, 0x01, 0x02, 0x04, 0x00,// ` 68 | 0x20, 0x54, 0x54, 0x54, 0x78,// a 69 | 0x7F, 0x48, 0x44, 0x44, 0x38,// b 70 | 0x38, 0x44, 0x44, 0x44, 0x20,// c 71 | 0x38, 0x44, 0x44, 0x48, 0x7F,// d 72 | 0x38, 0x54, 0x54, 0x54, 0x18,// e 73 | 0x08, 0x7E, 0x09, 0x01, 0x02,// f 74 | 0x08, 0x14, 0x54, 0x54, 0x3C,// g 75 | 0x7F, 0x08, 0x04, 0x04, 0x78,// h 76 | 0x00, 0x44, 0x7D, 0x40, 0x00,// i 77 | 0x20, 0x40, 0x44, 0x3D, 0x00,// j 78 | 0x00, 0x7F, 0x10, 0x28, 0x44,// k 79 | 0x00, 0x41, 0x7F, 0x40, 0x00,// l 80 | 0x7C, 0x04, 0x18, 0x04, 0x78,// m 81 | 0x7C, 0x08, 0x04, 0x04, 0x78,// n 82 | 0x38, 0x44, 0x44, 0x44, 0x38,// o 83 | 0x7C, 0x14, 0x14, 0x14, 0x08,// p 84 | 0x08, 0x14, 0x14, 0x18, 0x7C,// q 85 | 0x7C, 0x08, 0x04, 0x04, 0x08,// r 86 | 0x48, 0x54, 0x54, 0x54, 0x20,// s 87 | 0x04, 0x3F, 0x44, 0x40, 0x20,// t 88 | 0x3C, 0x40, 0x40, 0x20, 0x7C,// u 89 | 0x1C, 0x20, 0x40, 0x20, 0x1C,// v 90 | 0x3C, 0x40, 0x30, 0x40, 0x3C,// w 91 | 0x44, 0x28, 0x10, 0x28, 0x44,// x 92 | 0x0C, 0x50, 0x50, 0x50, 0x3C,// y 93 | 0x44, 0x64, 0x54, 0x4C, 0x44,// z 94 | 0x00, 0x08, 0x36, 0x41, 0x00,// { 95 | 0x00, 0x00, 0x7F, 0x00, 0x00,// | 96 | 0x00, 0x41, 0x36, 0x08, 0x00,// } 97 | 0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 98 | 0x08, 0x1C, 0x2A, 0x08, 0x08 // <- 99 | }; 100 | // -------------------------------------------------------------------------------- /ATU-100_YAF.X/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # There exist several targets which are by default empty and which can be 3 | # used for execution of your targets. These targets are usually executed 4 | # before and after some main targets. They are: 5 | # 6 | # .build-pre: called before 'build' target 7 | # .build-post: called after 'build' target 8 | # .clean-pre: called before 'clean' target 9 | # .clean-post: called after 'clean' target 10 | # .clobber-pre: called before 'clobber' target 11 | # .clobber-post: called after 'clobber' target 12 | # .all-pre: called before 'all' target 13 | # .all-post: called after 'all' target 14 | # .help-pre: called before 'help' target 15 | # .help-post: called after 'help' target 16 | # 17 | # Targets beginning with '.' are not intended to be called on their own. 18 | # 19 | # Main targets can be executed directly, and they are: 20 | # 21 | # build build a specific configuration 22 | # clean remove built files from a configuration 23 | # clobber remove all built files 24 | # all build all configurations 25 | # help print help mesage 26 | # 27 | # Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and 28 | # .help-impl are implemented in nbproject/makefile-impl.mk. 29 | # 30 | # Available make variables: 31 | # 32 | # CND_BASEDIR base directory for relative paths 33 | # CND_DISTDIR default top distribution directory (build artifacts) 34 | # CND_BUILDDIR default top build directory (object files, ...) 35 | # CONF name of current configuration 36 | # CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) 37 | # CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) 38 | # CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) 39 | # CND_PACKAGE_DIR_${CONF} directory of package (current configuration) 40 | # CND_PACKAGE_NAME_${CONF} name of package (current configuration) 41 | # CND_PACKAGE_PATH_${CONF} path to package (current configuration) 42 | # 43 | # NOCDDL 44 | 45 | 46 | # Environment 47 | MKDIR=mkdir 48 | CP=cp 49 | CCADMIN=CCadmin 50 | RANLIB=ranlib 51 | 52 | 53 | # build 54 | build: .build-post 55 | 56 | .build-pre: 57 | # Add your pre 'build' code here... 58 | 59 | .build-post: .build-impl 60 | # Add your post 'build' code here... 61 | 62 | 63 | # clean 64 | clean: .clean-post 65 | 66 | .clean-pre: 67 | # Add your pre 'clean' code here... 68 | # WARNING: the IDE does not call this target since it takes a long time to 69 | # simply run make. Instead, the IDE removes the configuration directories 70 | # under build and dist directly without calling make. 71 | # This target is left here so people can do a clean when running a clean 72 | # outside the IDE. 73 | 74 | .clean-post: .clean-impl 75 | # Add your post 'clean' code here... 76 | 77 | 78 | # clobber 79 | clobber: .clobber-post 80 | 81 | .clobber-pre: 82 | # Add your pre 'clobber' code here... 83 | 84 | .clobber-post: .clobber-impl 85 | # Add your post 'clobber' code here... 86 | 87 | 88 | # all 89 | all: .all-post 90 | 91 | .all-pre: 92 | # Add your pre 'all' code here... 93 | 94 | .all-post: .all-impl 95 | # Add your post 'all' code here... 96 | 97 | 98 | # help 99 | help: .help-post 100 | 101 | .help-pre: 102 | # Add your pre 'help' code here... 103 | 104 | .help-post: .help-impl 105 | # Add your post 'help' code here... 106 | 107 | 108 | 109 | # include project implementation makefile 110 | include nbproject/Makefile-impl.mk 111 | 112 | # include project make variables 113 | include nbproject/Makefile-variables.mk 114 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/button.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | 3 | //button_state_t BUTTON_state; 4 | 5 | uint8_t BUTTON_count; 6 | uint8_t BUTTON_was_long_pressed; 7 | uint8_t BUTTON_Auto_count; 8 | uint8_t BUTTON_Bypass_count; 9 | 10 | 11 | void BUTTON_Init(void) 12 | { 13 | BUTTON_TUNE_DIR = DIR_INPUT; 14 | BUTTON_TUNE_PULLUP = 1; 15 | 16 | BUTTON_AUTO_DIR = DIR_INPUT; 17 | BUTTON_AUTO_PULLUP = 1; 18 | 19 | BUTTON_BYPASS_DIR = DIR_INPUT; 20 | BUTTON_BYPASS_PULLUP = 1; 21 | 22 | //BUTTON_state.byte = BUTTON_STATE_RESET; 23 | } 24 | 25 | 26 | void BUTTON_Reset(void) 27 | { 28 | BUTTON_count=BUTTON_RESET; 29 | BUTTON_was_long_pressed =0; 30 | } 31 | 32 | void BUTTON_Run(void) 33 | { 34 | //static uint8_t count; 35 | 36 | 37 | //Decouncing 38 | // static uint8_t last; 39 | // if (BUTTON_TUNE_R != last) 40 | // { 41 | // last = BUTTON_TUNE_R; 42 | // return; 43 | // } 44 | 45 | //----------------------------------------------------------------------- 46 | //if(BUTTON_count > BUTTON_MAX_COUNT) 47 | //{ 48 | // BUTTON_count=BUTTON_IDLE; 49 | //} 50 | 51 | if (BUTTON_TUNE_R == 0) //Button pressed 52 | { 53 | if(BUTTON_count < BUTTON_MAX_COUNT) 54 | { 55 | BUTTON_count++; 56 | } 57 | 58 | if(BUTTON_count == BUTTON_LONG_PRESSED) 59 | { 60 | BUTTON_was_long_pressed =1; 61 | } 62 | 63 | } 64 | else 65 | { 66 | if((!BUTTON_was_long_pressed) && (BUTTON_count > 0) && (BUTTON_count <= BUTTON_MAX_COUNT)) 67 | { 68 | BUTTON_count = BUTTON_RELEASED; 69 | } 70 | else 71 | { 72 | BUTTON_count =BUTTON_IDLE; 73 | } 74 | 75 | BUTTON_was_long_pressed =0; 76 | } 77 | 78 | 79 | //----------------------------------------------------------------------- 80 | 81 | // if (BUTTON_TUNE_R == 0) //Button pressed 82 | // { 83 | // if(BUTTON_state.bits.Reset ==0) 84 | // { 85 | // 86 | // BUTTON_state.bits.State_Released = 0; 87 | // BUTTON_state.bits.Trig_Released = 0; 88 | // 89 | // 90 | // if (BUTTON_state.bits.State_Pressed == 0) 91 | // { 92 | // BUTTON_state.bits.State_Pressed = 1; 93 | // BUTTON_state.bits.Trig_Pressed = 1; 94 | // BUTTON_state.bits.Enable_Released =1; 95 | // } 96 | // 97 | // count++; 98 | // if(count == BUTTON_LONG_PRESS_RE_TRIGGER) 99 | // { 100 | // count = BUTTON_LONG_PRESS_TRIGGER; 101 | // } 102 | // 103 | // //Long Pressed 104 | // if (count == BUTTON_LONG_PRESS_TRIGGER) 105 | // { 106 | // BUTTON_state.bits.State_LongPressed = 1; 107 | // BUTTON_state.bits.Trig_LongPressed = 1; 108 | // } 109 | // 110 | // } 111 | // } 112 | // else 113 | // { 114 | // if(BUTTON_state.bits.Enable_Released) //Only when pressed set released 115 | // { 116 | // if (BUTTON_state.bits.State_Released == 0) 117 | // { 118 | // BUTTON_state.bits.State_Released = 1; 119 | // BUTTON_state.bits.Trig_Released = 1; 120 | // } 121 | // } 122 | // 123 | // BUTTON_state.bits.State_Pressed = 0; 124 | // BUTTON_state.bits.Trig_Pressed = 0; 125 | // BUTTON_state.bits.State_LongPressed = 0; 126 | // BUTTON_state.bits.Trig_LongPressed = 0; 127 | // BUTTON_state.bits.Reset =0; 128 | // count = 0; 129 | // 130 | // } 131 | 132 | // Button Auto ------------------------------------------------- 133 | if (BUTTON_AUTO_R == 0) //Button pressed 134 | { 135 | BUTTON_Auto_count++; 136 | if(BUTTON_Auto_count >= BUTTON_AUTO_RE_TRIGGER) 137 | { 138 | BUTTON_Auto_count=1; 139 | } 140 | } 141 | else 142 | { 143 | BUTTON_Auto_count =0; 144 | } 145 | 146 | // Button Bypass ------------------------------------------------- 147 | if (BUTTON_BYPASS_R == 0) //Button pressed 148 | { 149 | BUTTON_Bypass_count++; 150 | if(BUTTON_Bypass_count >= BUTTON_AUTO_RE_TRIGGER) 151 | { 152 | BUTTON_Bypass_count=1; 153 | } 154 | } 155 | else 156 | { 157 | BUTTON_Bypass_count =0; 158 | } 159 | 160 | } 161 | 162 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/uart.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | 3 | #ifdef DEBUG_UART 4 | 5 | // the CPU clock is 4 Mhz, so to convert to microseconds, there are 6 | // 4 clocks per usec 7 | 8 | #define BD9600 400 9 | #define BD38400 84 10 | #define BD115200 18 11 | #define BIT_DELAY() _delay((unsigned long)(BD115200)) 12 | 13 | 14 | 15 | #define ESC_CLR_SCREEN "\033[2J" 16 | #define ESC_CURSOR_HOME "\033[H" 17 | 18 | static char uart_buffer[UART_BUFFER_SIZE]; 19 | static uint8_t uart_write_pos; 20 | static uint8_t uart_read_pos; 21 | static uint8_t uart_step; 22 | static uint8_t uart_cap_sw; 23 | static uint8_t uart_coarse_cap; 24 | static uint8_t uart_coarse_ind; 25 | 26 | void UART_Init(void) 27 | { 28 | UART_PIN_W = 1; 29 | UART_PIN_DIR = DIR_OUTPUT; 30 | uart_read_pos=0; 31 | uart_write_pos=0; 32 | uart_step=0; 33 | } 34 | 35 | uint8_t UART_Busy(void) 36 | { 37 | return(uart_write_pos); 38 | } 39 | 40 | 41 | void UART_SendChar(char c) 42 | { 43 | unsigned char i; 44 | INTCONbits.GIE = 0; // Disable Global Interrupt 45 | UART_PIN_W = 0; // Start bit 46 | BIT_DELAY(); 47 | for (i = 8; i != 0; --i) 48 | { 49 | if (c & 0x01) 50 | { 51 | UART_PIN_W = 1; // Begin with LSB 52 | } else 53 | { 54 | UART_PIN_W = 0; 55 | } 56 | c >>= 1; 57 | BIT_DELAY(); 58 | } 59 | UART_PIN_W = 1; // Stop bit 60 | INTCONbits.GIE = 1; // Enable Global Interrupt 61 | BIT_DELAY(); 62 | BIT_DELAY(); // add some extra delays after the stop bit 63 | 64 | } 65 | 66 | void UART_WriteChar(char c) 67 | { 68 | if (uart_write_pos < (UART_BUFFER_SIZE - 1)) 69 | { 70 | uart_buffer[uart_write_pos++] = c; 71 | } 72 | } 73 | 74 | void UART_WriteStr(char *str) 75 | { 76 | while (*str != 0) 77 | { 78 | UART_WriteChar(*str++); 79 | } 80 | } 81 | 82 | void UART_WriteStrLn(char *str) 83 | { 84 | UART_WriteStr(str); 85 | UART_WriteChar(0x0d); // send a CR 86 | UART_WriteChar(0x0a); // send a LF 87 | } 88 | 89 | 90 | 91 | void UART_WriteLn(void) 92 | { 93 | UART_WriteChar(0x0d); // send a CR 94 | UART_WriteChar(0x0a); // send a LF 95 | } 96 | 97 | 98 | void UART_WriteInt(int16_t value) 99 | { 100 | char buffer[5]; 101 | UTILI_Int2Str(value, buffer, sizeof(buffer)); 102 | UART_WriteStr(buffer); 103 | } 104 | 105 | 106 | 107 | void UART_Run(void) 108 | { 109 | if (uart_read_pos != uart_write_pos) 110 | { 111 | UART_SendChar(uart_buffer[uart_read_pos++]); 112 | } 113 | else 114 | { 115 | uart_read_pos=0; 116 | uart_write_pos=0; 117 | } 118 | } 119 | 120 | 121 | //void UART_Run(void) 122 | //{ 123 | // if (uart_read_pos != uart_write_pos) 124 | // { 125 | // UART_SendChar(uart_buffer[uart_read_pos++]); 126 | // } 127 | // else 128 | // { 129 | // uart_read_pos=0; 130 | // uart_write_pos=0; 131 | // 132 | // switch (uart_step) { 133 | // 134 | // case 0: 135 | // UART_WriteStr(ESC_CLR_SCREEN); 136 | // uart_step=1; 137 | // break; 138 | // 139 | // case 1: 140 | // uart_cap_sw =0; 141 | // uart_coarse_cap =0; 142 | // uart_coarse_ind =0; 143 | // UART_WriteStr(ESC_CURSOR_HOME); 144 | // uart_step=2; 145 | // break; 146 | // 147 | // case 2: 148 | // UTILI_Int2Str(TUNE_results[uart_cap_sw][uart_coarse_ind][uart_coarse_cap], uart_buffer, 5); 149 | // uart_write_pos=5; 150 | // 151 | // uart_coarse_cap++; 152 | // if (uart_coarse_cap >= COARSE_STEPS) 153 | // { 154 | // uart_coarse_cap=0; 155 | // uart_coarse_ind++; 156 | // UART_WriteChar(0x0d); // send a CR 157 | // UART_WriteChar(0x0a); // send a LF 158 | // 159 | // if (uart_coarse_ind >= COARSE_STEPS) 160 | // { 161 | // uart_coarse_ind=0; 162 | // UART_WriteChar(0x0d); // send a CR 163 | // UART_WriteChar(0x0a); // send a LF 164 | // if (uart_cap_sw == 0) 165 | // { 166 | // uart_cap_sw = 1; 167 | // } else 168 | // { 169 | // uart_step=1; 170 | // } 171 | // 172 | // } 173 | // } 174 | // break; 175 | // 176 | // default: 177 | // uart_step=0; 178 | // break; 179 | // 180 | // } 181 | // } 182 | //} 183 | 184 | #endif -------------------------------------------------------------------------------- /ATU-100_YAF.X/main.c: -------------------------------------------------------------------------------- 1 | /** 2 | * ATU-100_EXT_YAF 3 | * Yet Another Firmware 4 | * by DG4SN 5 | */ 6 | 7 | // PIC16F1938 Configuration Bit Settings 8 | 9 | // CONFIG1 10 | #pragma config FOSC = ECH // Oscillator Selection (ECH, External Clock, High Power Mode (4-32 MHz): device clock supplied to CLKIN pin) 11 | #pragma config WDTE = ON // Watchdog Timer Enable (WDT enabled) 12 | #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) 13 | #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) 14 | #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) 15 | #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) 16 | #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) 17 | #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) 18 | #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) 19 | #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) 20 | 21 | // CONFIG2 22 | #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) 23 | #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled) 24 | #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) 25 | #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) 26 | #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) 27 | #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) 28 | 29 | 30 | #include "defines.h" 31 | 32 | global_t global; 33 | 34 | 35 | static volatile uint8_t tick_count =0; 36 | 37 | void MAIN_Init(void) 38 | { 39 | 40 | 41 | 42 | //Clock 43 | OSCCON = 0b01111010; // 16 MHz oscillator, Internal 44 | 45 | //All Ports off 46 | LATA = 0; 47 | LATB = 0; 48 | LATC = 0; 49 | 50 | 51 | 52 | 53 | 54 | //Timer 2 55 | //set to 1ms = 1000Hz 56 | //Fosc/4 = 4Mhz, Prescaler 1:16, Comp value 250, Postscaler 1:1 57 | 58 | T2CONbits.T2CKPS = 2; //Prescaler 1:16 59 | T2CONbits.T2OUTPS = 0; //Postscaler 1:1 60 | PR2 = 250; //Periode Register 61 | 62 | PIE1bits.TMR2IE = 1; //Timer 2 interrupt enable 63 | INTCONbits.PEIE = 1; // Enable Perpherial Interrupt 64 | 65 | T2CONbits.TMR2ON = 1; //Timer on 66 | INTCONbits.GIE = 1; // Enable Global Interrupt 67 | 68 | 69 | 70 | 71 | // Set watchdog 72 | // CLRWDT(); 73 | // WDTCONbits.WDTPS4 = 0; 74 | // WDTCONbits.WDTPS3 = 1; 75 | // WDTCONbits.WDTPS2 = 0; // 1 sec WDT 76 | // WDTCONbits.WDTPS1 = 1; 77 | // WDTCONbits.WDTPS0 = 0; 78 | // CLRWDT(); 79 | 80 | 81 | ANSELBbits.ANSELB = 0; // all as digital 82 | 83 | CM1CON0bits.C1ON = 0; // Disable comparators 84 | CM2CON0bits.C2ON = 0; 85 | 86 | 87 | 88 | 89 | // // If we are using the auto button for an output for uart 90 | // // set B1 (auto) to an output 91 | //#ifdef DEBUG_UART 92 | // TRISB = 0b00000101; 93 | //#else 94 | // TRISB = 0b00000111; 95 | //#endif 96 | // 97 | // 98 | // TRISC = 0b00000000; // 99 | // // 100 | // //ADC_Init(); 101 | 102 | //Init Relays 103 | REL_CAP_1_DIR = DIR_OUTPUT; 104 | REL_CAP_2_DIR = DIR_OUTPUT; 105 | REL_CAP_3_DIR = DIR_OUTPUT; 106 | REL_CAP_4_DIR = DIR_OUTPUT; 107 | REL_CAP_5_DIR = DIR_OUTPUT; 108 | REL_CAP_6_DIR = DIR_OUTPUT; 109 | REL_CAP_7_DIR = DIR_OUTPUT; 110 | REL_CAP_SW_DIR = DIR_OUTPUT; 111 | 112 | REL_IND_1_DIR = DIR_OUTPUT; 113 | REL_IND_2_DIR = DIR_OUTPUT; 114 | REL_IND_3_DIR = DIR_OUTPUT; 115 | REL_IND_4_DIR = DIR_OUTPUT; 116 | REL_IND_5_DIR = DIR_OUTPUT; 117 | REL_IND_6_DIR = DIR_OUTPUT; 118 | REL_IND_7_DIR = DIR_OUTPUT; 119 | 120 | global.ind_relays =0; 121 | global.cap_relays =0; 122 | global.cap_sw =0; 123 | 124 | 125 | global.tune_stop_swr = 100; // SWR 1.10 126 | 127 | 128 | //Global Enable of Weak PullUp 129 | OPTION_REGbits.nWPUEN = 0; 130 | 131 | 132 | 133 | // WPUBbits.WPUB1 = 1; // PORTB1 Pull-up resistor 134 | // WPUBbits.WPUB2 = 1; // PORTB2 Pull-up resistor 135 | 136 | 137 | 138 | 139 | 140 | } 141 | 142 | 143 | void __interrupt() myIsr(void) 144 | { 145 | //Timer 2 interrupt 1000Hz 146 | if(PIR1bits.TMR2IF) 147 | { 148 | PIR1bits.TMR2IF =0; 149 | tick_count++; 150 | } 151 | 152 | 153 | return; 154 | 155 | } 156 | 157 | 158 | void main(void) 159 | { 160 | static uint8_t tick_old=0; 161 | static uint8_t tick_10ms =0; 162 | 163 | 164 | //uint16_t count=0; 165 | 166 | //uint8_t c; 167 | 168 | MAIN_Init(); 169 | EEPROM_Init(); 170 | BUTTON_Init(); 171 | ADC_Init(); 172 | 173 | 174 | 175 | #ifdef DEBUG_UART 176 | UART_Init(); 177 | UART_WriteChar(' '); 178 | #endif 179 | 180 | 181 | 182 | DELAY_ms(DISPLAY_INIT_DELAY); 183 | DISP_Init(DISPLAY_I2C_ADDR, DISPLAY_ROTATE); 184 | DISP_Str(DISP_COL_CENTER,0,str_ATU100EXT,0); 185 | DISP_Str(DISP_COL_CENTER,1,str_YAF,0); 186 | DISP_Str(DISP_COL_CENTER,2,str_Version,0); 187 | 188 | #ifdef DEBUG_UART 189 | UART_WriteStrLn("\n\rHello DG4SN"); 190 | #endif 191 | 192 | DELAY_ms(1500); 193 | 194 | 195 | DISP_Clr(); 196 | MENU_Init(); 197 | 198 | //Load index 0 = startup value 199 | { 200 | tunemem_t tunemem; 201 | EEPROM_Read((uint8_t) & ee_tunemem , &tunemem, sizeof (tunemem_t)); 202 | UTILI_Set_LC_Relays(tunemem.relays); 203 | } 204 | 205 | 206 | while(1) 207 | { 208 | 209 | if(tick_old != tick_count) 210 | { 211 | tick_old++; 212 | tick_10ms++; 213 | //1ms 214 | ADC_Run(); 215 | 216 | #ifdef DEBUG_UART 217 | UART_Run(); 218 | #endif 219 | 220 | 221 | } 222 | 223 | 224 | //10x 1ms = 10ms 225 | if(tick_10ms==10) 226 | { 227 | tick_10ms=0; 228 | //10ms 229 | 230 | BUTTON_Run(); 231 | MENU_Run(); 232 | 233 | 234 | 235 | 236 | CLRWDT(); 237 | } 238 | } 239 | } 240 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/disp.c: -------------------------------------------------------------------------------- 1 | /** 2 | * Display functions 3 | */ 4 | 5 | #include "defines.h" 6 | #include "font5x8.h" 7 | 8 | 9 | #define FONT_WIDTH 5 //5pixel (muliply by 2) 10 | #define FONT_SPACING (5+1) //5pixel font + 1 pixel space (muliply by 2) 11 | #define RES_X 128 //Display resolution 12 | #define RES_Y 64 13 | 14 | 15 | uint8_t DISP_i2_addr; 16 | uint8_t DISP_rotate; 17 | 18 | void I2C_Start(void) 19 | { 20 | I2C_SCL_DIR = 1; //SCL=1 21 | DELAY_5_us(); 22 | I2C_SDA_DIR = 1; //SDA=1 23 | DELAY_5_us(); 24 | I2C_SDA_DIR = 0; //SDA=0 25 | DELAY_5_us(); 26 | I2C_SCL_DIR = 0; //SCL=0 27 | DELAY_5_us(); 28 | } 29 | 30 | void I2C_Stop(void) 31 | { 32 | I2C_SDA_DIR = 0; //SDA=0 33 | DELAY_5_us(); 34 | I2C_SCL_DIR = 1; //SCL=1 35 | DELAY_5_us(); 36 | I2C_SDA_DIR = 1; //SDA=1 37 | DELAY_5_us(); 38 | 39 | } 40 | 41 | void I2C_Write(uint8_t value) 42 | { 43 | for (uint8_t i = 0; i <= 7; i++) 44 | { 45 | if ((value & 0x80) == 0) 46 | { 47 | I2C_SDA_DIR = 0; 48 | } 49 | else 50 | { 51 | I2C_SDA_DIR = 1; 52 | } 53 | 54 | DELAY_5_us(); 55 | 56 | I2C_SCL_DIR = 1; 57 | DELAY_5_us(); 58 | I2C_SCL_DIR = 0; 59 | DELAY_5_us(); 60 | value = (uint8_t) (value << 1); 61 | } 62 | 63 | I2C_SDA_DIR = 1; //ACK 64 | DELAY_5_us(); 65 | I2C_SCL_DIR = 1; 66 | DELAY_5_us(); 67 | I2C_SCL_DIR = 0; 68 | DELAY_5_us(); 69 | } 70 | 71 | void DISP_Command(uint8_t command) 72 | { 73 | I2C_Start(); 74 | I2C_Write(DISP_i2_addr); 75 | I2C_Write(128); // 128 - command, 192 - data 76 | I2C_Write(command); 77 | I2C_Stop(); 78 | } 79 | 80 | void DISP_DataAddress(uint8_t page, uint8_t start) 81 | { 82 | I2C_Start(); 83 | I2C_Write(DISP_i2_addr); 84 | I2C_Write(0); // 0 - continious mode, command; 64 - Co, data 85 | I2C_Write(0xB0 + page); 86 | I2C_Write(start & 0x0f); //low nibble of start 87 | I2C_Write(0x10 + (start >> 4)); //high nibbe of start 88 | 89 | I2C_Start(); //send start again 90 | I2C_Write(DISP_i2_addr); 91 | I2C_Write(64); // 0 - continious mode, command; 64 - Co, data 92 | 93 | } 94 | 95 | void DISP_Clr(void) 96 | { 97 | DISP_Off(); 98 | 99 | for (uint8_t page = 0; page <= 7; page++) 100 | { 101 | 102 | DISP_DataAddress(page, 0); 103 | for (uint8_t i = 0; i < RES_X; i++) //clear pixels 104 | { 105 | I2C_Write(0x00); 106 | } 107 | } 108 | I2C_Stop(); 109 | 110 | DISP_On(); 111 | } 112 | 113 | void DISP_On(void) 114 | { 115 | DISP_Command(0xAF); 116 | } 117 | 118 | void DISP_Off(void) 119 | { 120 | DISP_Command(0xAE); 121 | } 122 | 123 | void DISP_Init(uint8_t i2_addr, uint8_t rotate) 124 | { 125 | DISP_i2_addr = i2_addr; 126 | DISP_rotate = rotate; 127 | 128 | I2C_SCL_DIR = DIR_INPUT; //1 = input / 0 = output 129 | I2C_SDA_DIR = DIR_INPUT; //note: external pull up resistors 130 | I2C_SCL_W = 0; //If output then 0 131 | I2C_SDA_W = 0; 132 | 133 | //DELAY_ms(1); 134 | 135 | //I2C_Stop(); 136 | 137 | DELAY_5_us(); 138 | 139 | I2C_Start(); 140 | I2C_Write(DISP_i2_addr); 141 | I2C_Write(0); // 0 - continious mode, command; 64 - Co, data 142 | I2C_Write(0xAE); // display OFF 143 | 144 | // 128*64 OLED 145 | I2C_Write(0xD5); // clock division 146 | I2C_Write(0x80); // ratio 147 | // 148 | I2C_Write(0xA8); // multiplexer 149 | I2C_Write(63); // 150 | // 151 | I2C_Write(0xD3); // offset 152 | I2C_Write(0); // no offset for x64 ! 153 | // 154 | I2C_Write(0x40); // set line, line = 0 155 | // 156 | I2C_Write(0x8D); // charge pump 157 | I2C_Write(0x14); // 0x10 - external, 0x14 - internal 158 | // 159 | I2C_Write(0x81); // contrast 160 | I2C_Write(255); // 0-255 161 | // 162 | I2C_Write(0xD9); // pre-charge 163 | I2C_Write(0xf1); // 0x22 - external, 0xF1 - internal 164 | // 165 | I2C_Write(0x20); // memory addressing mode 166 | I2C_Write(0x02); // page addressing mode 02 167 | // 168 | I2C_Write(0x21); // set column range 169 | I2C_Write(0); // column start 170 | I2C_Write(127); // column stop 171 | // 172 | I2C_Write(0x2E); // stop scrolling 173 | // 174 | 175 | 176 | 177 | if (DISP_rotate == TRUE) 178 | { 179 | I2C_Write(0xA0); // segment re-map, A0 - normal, A1 - remapped 180 | // 181 | I2C_Write(0xC0); // scan direction, C0 - normal, C8 - remapped 182 | } 183 | else 184 | { 185 | I2C_Write(0xA1); // segment re-map, A0 - normal, A1 - remapped 186 | // 187 | I2C_Write(0xC8); // scan direction, C0 - normal, C8 - remapped 188 | } 189 | // 190 | I2C_Write(0xDA); // COM pins configure 191 | I2C_Write(0x12); // 12 for x64 192 | // 193 | I2C_Write(0xDB); // V-COM detect 194 | I2C_Write(0x40); // 195 | 196 | I2C_Write(0xA4); // display entire ON 197 | // 198 | I2C_Write(0xA6); // 0xA6 - normal, 0xA7 - inverse 199 | // 200 | I2C_Stop(); 201 | 202 | DISP_Clr(); 203 | 204 | } 205 | 206 | void DISP_Char(uint8_t col, uint8_t row, char c, uint8_t invert) 207 | { 208 | char str[2]; 209 | str[0] = c; 210 | str[1] =0; 211 | DISP_Str(col, row, str, invert); 212 | } 213 | 214 | 215 | void DISP_Str(uint8_t col, uint8_t row, const char *str, uint8_t invert) 216 | { 217 | const char *p; 218 | bitfield_t x, y; 219 | uint8_t page; 220 | uint8_t start; 221 | uint8_t empty; 222 | uint16_t fpos; 223 | 224 | if (invert) empty = 0xff; 225 | else empty = 0; 226 | 227 | 228 | page = row * 2; 229 | 230 | if (col == DISP_COL_CENTER) 231 | { 232 | uint8_t len = 0; 233 | //string length 234 | p = str; 235 | while (*p != 0) 236 | { 237 | len++; 238 | p++; 239 | } 240 | 241 | //pixel length 242 | len = len * (2 * FONT_SPACING); 243 | start = (RES_X - len) / 2; 244 | 245 | } 246 | else //Left aligned 247 | { 248 | start = col * (2 * FONT_SPACING); 249 | } 250 | 251 | //upper part of the string 252 | DISP_DataAddress(page, start); 253 | 254 | p = str; 255 | while (*p != 0) 256 | { 257 | fpos = (*p - 32) * FONT_WIDTH; 258 | for (uint8_t h = 0; h < FONT_WIDTH; h++) 259 | { 260 | x.byte = font5x8[fpos + h]; //get byte from font 261 | 262 | y.bits.B7 = x.bits.B3; 263 | y.bits.B6 = x.bits.B2; 264 | y.bits.B5 = x.bits.B2; 265 | y.bits.B4 = x.bits.B1; 266 | y.bits.B3 = x.bits.B1; 267 | y.bits.B2 = x.bits.B0; 268 | y.bits.B1 = x.bits.B0; 269 | y.bits.B0 = 0; //space line 270 | 271 | y.byte = y.byte ^ empty; //maybe invert 272 | I2C_Write(y.byte); 273 | I2C_Write(y.byte); //128x64 the same byte twice 274 | } 275 | I2C_Write(empty); //Space between two char 276 | I2C_Write(empty); 277 | p++; 278 | } 279 | 280 | 281 | //lower part of the string 282 | DISP_DataAddress(page + 1, start); 283 | p = str; 284 | while (*p != 0) 285 | { 286 | fpos = (*p - 32) * FONT_WIDTH; 287 | for (uint8_t h = 0; h < FONT_WIDTH; h++) 288 | { 289 | x.byte = font5x8[fpos + h]; //get byte from font 290 | y.bits.B7 = 0; //space line 291 | y.bits.B6 = x.bits.B6; 292 | y.bits.B5 = x.bits.B6; 293 | y.bits.B4 = x.bits.B5; 294 | y.bits.B3 = x.bits.B5; 295 | y.bits.B2 = x.bits.B4; 296 | y.bits.B1 = x.bits.B4; 297 | y.bits.B0 = x.bits.B3; 298 | 299 | y.byte = y.byte ^ empty; //maybe invert 300 | I2C_Write(y.byte); 301 | I2C_Write(y.byte); //128x64 the same byte twice 302 | 303 | } 304 | I2C_Write(empty); //Space between two char 305 | I2C_Write(empty); 306 | p++; 307 | } 308 | 309 | I2C_Stop(); 310 | 311 | } 312 | 313 | /** 314 | * Show power as x.xW when < 10W and xxW or xxxW if higher 315 | */ 316 | void DISP_PWR(uint8_t col, uint8_t row, int16_t deciWatt, uint8_t invert) 317 | { 318 | char str[5]; 319 | uint8_t low_value =1; 320 | 321 | if(deciWatt >= 100) 322 | { 323 | deciWatt = deciWatt / 10; 324 | low_value=0; 325 | } 326 | UTILI_Int2Str(deciWatt, str, (sizeof(str)-1)); 327 | 328 | 329 | if(low_value) 330 | { 331 | //Example: " 99" -> "9.9" 332 | str[0] = str[1]; 333 | if(str[0] == ' ') str[0] = '0'; //leading zero 334 | str[1] = '.'; 335 | } 336 | 337 | str[3] = 'W'; 338 | str[4] = 0; //terminate string 339 | 340 | 341 | DISP_Str(col, row, str, invert); 342 | 343 | } 344 | 345 | 346 | void DISP_SWR(uint8_t col, uint8_t row, int16_t centiSWR, uint8_t invert) 347 | { 348 | char str[5] = "0.00"; 349 | if(centiSWR >= 100) 350 | { 351 | UTILI_Int2Str(centiSWR , &str[1], (sizeof(str)-1)); 352 | str[0] = str[1]; //first number 353 | str[1] = '.'; 354 | } 355 | DISP_Str(col, row, str, invert); 356 | } -------------------------------------------------------------------------------- /ATU-100_YAF.X/tune.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | 3 | #ifdef DEBUG_UART 4 | #define TUNE_DEBUG 5 | #endif 6 | 7 | 8 | #define TUNE_COARSE_FAST 9 | 10 | 11 | #define RELAY_DELAY 2 //2=20ms 12 | 13 | #define AddTolerance(x) (x + (x/20)) //+5% 14 | 15 | 16 | 17 | 18 | #define COARSE_CAP_STEPS 11 19 | const uint8_t coarse_cap_value[COARSE_CAP_STEPS] ={ 20 | 0b00000000, 21 | 0b00000001, //1 22 | 0b00000010, //2 23 | 0b00000100, //4 24 | 0b00001000, //8 25 | 0b00010000, //16 26 | 0b00100000, //32 27 | 0b01000000, //64 28 | 0b01100000, //96 29 | 0b01110000, //112 30 | 0b01111111 //127 31 | }; 32 | 33 | 34 | #define COARSE_IND_STEPS 11 35 | const uint8_t coarse_ind_value[COARSE_IND_STEPS] ={ 36 | 0b00000000, 37 | 0b00000001, //1 38 | 0b00000010, //2 39 | 0b00000100, //4 40 | 0b00001000, //8 41 | 0b00010000, //16 42 | 0b00100000, //32 43 | 0b01000000, //64 44 | 0b01100000, //96 45 | 0b01110000, //112 46 | 0b01111111 //127 47 | }; 48 | 49 | enum 50 | { 51 | fine_low=0, fine_mid, fine_high 52 | } ; 53 | 54 | 55 | tunestate_t TUNE_state; 56 | static uint8_t TUNE_step; 57 | static uint8_t TUNE_delay; 58 | 59 | void TUNE_Init(void) 60 | { 61 | TUNE_state=TUNE_IDLE; 62 | TUNE_step=0; 63 | TUNE_delay=0; 64 | global.cap_sw=0; 65 | global.cap_relays=0; 66 | global.ind_relays=0; 67 | UTILI_SetRelays(); 68 | TUNE_delay = RELAY_DELAY; 69 | } 70 | 71 | void TUNE_Run(void) 72 | { 73 | 74 | static uint8_t ind_step; 75 | static uint8_t cap_step; 76 | static int16_t best_swr; 77 | 78 | static uint8_t best_cap_step; 79 | static uint8_t best_ind_step; 80 | static uint8_t best_cap_sw; 81 | 82 | static int16_t best_row_swr; 83 | static int16_t best_last_row_swr; 84 | 85 | static uint8_t fine_cap_diff_low; 86 | static uint8_t fine_cap_diff_high; 87 | static uint8_t fine_ind_diff_low; 88 | static uint8_t fine_ind_diff_high; 89 | 90 | static uint8_t fine_cap[3]; 91 | static uint8_t fine_ind[3]; 92 | 93 | #ifdef TUNE_DEBUG 94 | char str[7]; 95 | #endif 96 | 97 | 98 | 99 | //10ms interval 100 | 101 | if ((TUNE_state == TUNE_BREAK) || (TUNE_state == TUNE_READY)) return; 102 | 103 | //TUNE_delay 104 | if (TUNE_delay > 0) 105 | { 106 | TUNE_delay--; 107 | return; 108 | } 109 | 110 | 111 | #ifdef TUNE_DEBUG 112 | if (UART_Busy()) return; 113 | #endif 114 | 115 | 116 | UTILI_CalPWR(); 117 | UTILI_CalSWR(); 118 | 119 | 120 | 121 | //Check Min PWR 122 | if ((TUNE_step != 0) && (global.PWR < TUNE_MIN_PWR)) 123 | { 124 | TUNE_state = TUNE_PWRLOW; 125 | return; 126 | } 127 | 128 | 129 | switch (TUNE_step) { 130 | case 0: 131 | if (global.PWR >= TUNE_MIN_PWR) 132 | { 133 | TUNE_step=10; 134 | TUNE_state=TUNE_RUN; 135 | 136 | best_swr = MAX_SWR; 137 | best_row_swr = MAX_SWR; 138 | best_last_row_swr=MAX_SWR; 139 | ind_step=0; 140 | cap_step=0; 141 | TUNE_delay = RELAY_DELAY; 142 | 143 | #ifdef TUNE_DEBUG 144 | UART_WriteLn(); 145 | UART_WriteStrLn("Tune Start"); 146 | UART_WriteStrLn("CAP_SW=0"); 147 | #endif 148 | 149 | } 150 | break; 151 | 152 | 153 | 154 | //coarse tuning 155 | case 10: 156 | 157 | #ifdef TUNE_DEBUG 158 | UART_WriteInt(global.SWR); 159 | #endif 160 | 161 | if(global.SWR <= global.tune_stop_swr) 162 | { 163 | TUNE_state = TUNE_READY; 164 | break; 165 | } 166 | 167 | 168 | if (global.SWR < best_row_swr) 169 | { 170 | best_row_swr = global.SWR; 171 | } 172 | 173 | if (global.SWR < best_swr) 174 | { 175 | best_swr = global.SWR; 176 | best_cap_step = cap_step; 177 | best_ind_step = ind_step; 178 | best_cap_sw = global.cap_sw; 179 | } 180 | 181 | 182 | 183 | 184 | 185 | cap_step++; 186 | #ifdef TUNE_COARSE_FAST 187 | if ((cap_step >= COARSE_CAP_STEPS) || (global.SWR > AddTolerance(best_row_swr) ) ) 188 | #else 189 | if (cap_step >= COARSE_CAP_STEPS) 190 | #endif 191 | { 192 | cap_step=0; 193 | ind_step++; 194 | 195 | #ifdef TUNE_DEBUG 196 | UART_WriteLn(); 197 | #endif 198 | 199 | #ifdef TUNE_COARSE_FAST 200 | 201 | //Stop tuning when current row not better than last row 202 | if (AddTolerance(best_last_row_swr) < best_row_swr) 203 | { 204 | if (global.cap_sw == 1) 205 | { 206 | #ifdef TUNE_DEBUG 207 | UART_WriteLn(); 208 | #endif 209 | TUNE_step=20; //-> go to fine tuning 210 | break; 211 | 212 | } 213 | else 214 | { 215 | //Start tuning again with cap_sw=1 216 | #ifdef TUNE_DEBUG 217 | UART_WriteLn(); 218 | UART_WriteStrLn("CAP_SW=1"); 219 | #endif 220 | global.cap_sw =1; 221 | cap_step=0; 222 | ind_step=0; 223 | best_row_swr = MAX_SWR; 224 | best_last_row_swr=MAX_SWR; 225 | } 226 | } else 227 | { 228 | best_last_row_swr = best_row_swr; 229 | } 230 | 231 | best_row_swr = MAX_SWR; 232 | 233 | #endif //TUNE_COARSE_FAST 234 | 235 | 236 | if (ind_step >= COARSE_IND_STEPS) 237 | { 238 | ind_step=0; 239 | best_row_swr = MAX_SWR; 240 | if (global.cap_sw == 1) 241 | { 242 | TUNE_step=20; //-> go to fine tuning 243 | break; 244 | } else 245 | { 246 | #ifdef TUNE_DEBUG 247 | UART_WriteLn(); 248 | UART_WriteStrLn("CAP_SW=1"); 249 | #endif 250 | 251 | global.cap_sw =1; 252 | } 253 | 254 | } 255 | } 256 | 257 | global.cap_relays = coarse_cap_value[cap_step]; 258 | global.ind_relays = coarse_ind_value[ind_step]; 259 | UTILI_SetRelays(); 260 | TUNE_delay = RELAY_DELAY; 261 | break; 262 | 263 | 264 | 265 | //fine tuning 266 | case 20: 267 | 268 | global.cap_sw = best_cap_sw; //cap_sw is now final 269 | global.cap_relays = coarse_cap_value[best_cap_step]; 270 | global.ind_relays = coarse_ind_value[best_ind_step]; 271 | 272 | #ifdef TUNE_DEBUG 273 | UART_WriteLn(); 274 | UART_WriteStrLn("Coarse-Tuning"); 275 | UART_WriteStr("Cap: "); 276 | UTILI_GetCapValueStr(str, sizeof (str)); 277 | UART_WriteStrLn(str); 278 | UART_WriteStr("Ind: "); 279 | UTILI_GetIndValueStr(str, sizeof (str)); 280 | UART_WriteStrLn(str); 281 | UART_WriteStr("SWR: "); 282 | UART_WriteInt(best_swr); 283 | UART_WriteLn(); 284 | #endif 285 | 286 | //Set best coarse tune in the middle of the fine tune matrix 287 | fine_cap[fine_mid] = coarse_cap_value[best_cap_step]; 288 | fine_ind[fine_mid] = coarse_ind_value[best_ind_step]; 289 | 290 | //Calculate differences to the next steps 291 | if (best_cap_step > 0) 292 | { 293 | fine_cap_diff_low = coarse_cap_value[best_cap_step] - coarse_cap_value[best_cap_step - 1]; 294 | } else 295 | { 296 | fine_cap_diff_low =0; 297 | } 298 | 299 | if (best_cap_step < (COARSE_CAP_STEPS - 1)) 300 | { 301 | fine_cap_diff_high = coarse_cap_value[best_cap_step + 1] - coarse_cap_value[best_cap_step]; 302 | } else 303 | { 304 | fine_cap_diff_high =0; 305 | } 306 | 307 | if (best_ind_step > 0) 308 | { 309 | fine_ind_diff_low = coarse_ind_value[best_ind_step] - coarse_ind_value[best_ind_step - 1]; 310 | } else 311 | { 312 | fine_ind_diff_low =0; 313 | } 314 | 315 | if (best_ind_step < (COARSE_IND_STEPS - 1)) 316 | { 317 | fine_ind_diff_high = coarse_ind_value[best_ind_step + 1] - coarse_ind_value[best_ind_step]; 318 | } else 319 | { 320 | fine_ind_diff_high =0; 321 | } 322 | 323 | //half the differences 324 | fine_cap_diff_low = fine_cap_diff_low / 2; 325 | fine_cap_diff_high = fine_cap_diff_high / 2; 326 | fine_ind_diff_low = fine_ind_diff_low / 2; 327 | fine_ind_diff_high = fine_ind_diff_high / 2; 328 | 329 | //set fine tune matrix values 330 | fine_cap[fine_low] = fine_cap[fine_mid] - fine_cap_diff_low; 331 | fine_cap[fine_high] = fine_cap[fine_mid] + fine_cap_diff_high; 332 | fine_ind[fine_low] = fine_ind[fine_mid] - fine_ind_diff_low; 333 | fine_ind[fine_high] = fine_ind[fine_mid] + fine_ind_diff_high; 334 | 335 | 336 | #ifdef TUNE_DEBUG 337 | UART_WriteLn(); 338 | UART_WriteStrLn("Fine-Tuning"); 339 | #endif 340 | 341 | best_swr = MAX_SWR; //Max Default 342 | 343 | //Start in the middle 344 | cap_step=fine_mid; 345 | ind_step=fine_mid; 346 | 347 | global.cap_relays = fine_cap[cap_step]; 348 | global.ind_relays = fine_ind[ind_step]; 349 | UTILI_SetRelays(); 350 | TUNE_delay = RELAY_DELAY; 351 | TUNE_step=30; 352 | 353 | break; 354 | 355 | 356 | //fine tuning 357 | case 30: 358 | #ifdef TUNE_DEBUG 359 | 360 | 361 | UART_WriteInt(cap_step); 362 | UART_WriteStr("_C-Step "); 363 | 364 | UTILI_GetCapValueStr(str, sizeof (str)); 365 | UART_WriteStr(str); 366 | 367 | UART_WriteInt(ind_step); 368 | UART_WriteStr("_I-Step "); 369 | 370 | UTILI_GetIndValueStr(str, sizeof (str)); 371 | UART_WriteStr(str); 372 | 373 | UART_WriteInt(global.SWR); 374 | UART_WriteStrLn("_SWR"); 375 | 376 | #endif 377 | 378 | if(global.SWR <= global.tune_stop_swr) 379 | { 380 | TUNE_state = TUNE_READY; 381 | break; 382 | } 383 | 384 | 385 | if (global.SWR < best_swr) 386 | { 387 | best_swr = global.SWR; 388 | best_cap_step = cap_step; 389 | best_ind_step = ind_step; 390 | } 391 | 392 | do 393 | { 394 | 395 | //cap-steps mid-> low -> high if different 396 | if (cap_step == fine_mid) 397 | { 398 | if (fine_cap[fine_low] != fine_cap[fine_mid]) 399 | { 400 | cap_step=fine_low; 401 | break; 402 | } else 403 | { 404 | if (fine_cap[fine_high] != fine_cap[fine_mid]) 405 | { 406 | cap_step=fine_high; 407 | break; 408 | } 409 | } 410 | } 411 | 412 | if (cap_step == fine_low) 413 | { 414 | if (fine_cap[fine_high] != fine_cap[fine_mid]) 415 | { 416 | cap_step=fine_high; 417 | break; 418 | } 419 | } 420 | cap_step=fine_mid; // cap row done 421 | 422 | 423 | //ind_steps mid-> low -> high if different 424 | if (ind_step == fine_mid) 425 | { 426 | if (fine_ind[fine_low] != fine_ind[fine_mid]) 427 | { 428 | ind_step=fine_low; 429 | break; 430 | } else 431 | { 432 | if (fine_ind[fine_high] != fine_ind[fine_mid]) 433 | { 434 | cap_step=fine_high; 435 | break; 436 | } 437 | } 438 | } 439 | 440 | if (ind_step == fine_low) 441 | { 442 | if (fine_ind[fine_high] != fine_ind[fine_mid]) 443 | { 444 | ind_step=fine_high; 445 | break; 446 | } 447 | } 448 | 449 | ind_step=fine_mid; //all done 450 | } while ((cap_step != fine_mid) || (ind_step != fine_mid)); 451 | 452 | 453 | //Check if loop ready 454 | if ((cap_step == fine_mid) && (ind_step == fine_mid)) 455 | { 456 | 457 | global.cap_relays = fine_cap[best_cap_step]; 458 | global.ind_relays = fine_ind[best_ind_step]; 459 | UTILI_SetRelays(); 460 | TUNE_state = TUNE_READY; 461 | break; 462 | } 463 | 464 | 465 | global.cap_relays = fine_cap[cap_step]; 466 | global.ind_relays = fine_ind[ind_step]; 467 | UTILI_SetRelays(); 468 | TUNE_delay = RELAY_DELAY; 469 | break; 470 | 471 | 472 | 473 | 474 | 475 | 476 | default: 477 | TUNE_state = TUNE_BREAK; 478 | break; 479 | } 480 | 481 | } 482 | 483 | 484 | 485 | 486 | //----------------------------------------------------- 487 | // //Calculate next differences 488 | // //Best value to the middle 489 | // fine_cap[fine_mid] = fine_cap[best_cap_step]; 490 | // fine_ind[fine_mid] = fine_ind[best_ind_step]; 491 | // 492 | // //Cal new cap differences 493 | // if (best_cap_step == fine_mid) 494 | // { 495 | // fine_cap_diff_low = fine_cap_diff_low / 2; 496 | // fine_cap_diff_high = fine_cap_diff_high / 2; 497 | // } 498 | // if (best_cap_step == fine_low) 499 | // { 500 | // fine_cap_diff_low = fine_cap_diff_low / 2; 501 | // fine_cap_diff_high = fine_cap_diff_low / 2; 502 | // } 503 | // if (best_cap_step == fine_high) 504 | // { 505 | // fine_cap_diff_low = fine_cap_diff_high / 2; 506 | // fine_cap_diff_high = fine_cap_diff_high / 2; 507 | // } 508 | // 509 | // //Cal new ind differences 510 | // if (best_ind_step == fine_mid) 511 | // { 512 | // fine_ind_diff_low = fine_ind_diff_low / 2; 513 | // fine_ind_diff_high = fine_ind_diff_high / 2; 514 | // } 515 | // if (best_ind_step == fine_low) 516 | // { 517 | // fine_ind_diff_low = fine_ind_diff_low / 2; 518 | // fine_ind_diff_high = fine_ind_diff_low / 2; 519 | // } 520 | // if (best_ind_step == fine_high) 521 | // { 522 | // fine_ind_diff_low = fine_ind_diff_high / 2; 523 | // fine_ind_diff_high = fine_ind_diff_high / 2; 524 | // } 525 | // 526 | // 527 | // 528 | // 529 | // //It ends when there are no differens 530 | // if ((fine_cap_diff_low <= 1) && 531 | // (fine_cap_diff_high <= 1) && 532 | // (fine_ind_diff_high <= 1) && 533 | // (fine_ind_diff_high <= 1)) 534 | // { 535 | // TUNE_state = TUNE_READY; 536 | // } 537 | // else 538 | // { 539 | // TUNE_step=35; //Call next round 540 | // } 541 | 542 | 543 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/configurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | uart.h 8 | utili.h 9 | disp.h 10 | defines.h 11 | font5x8.h 12 | button.h 13 | menu.h 14 | adc.h 15 | tune.h 16 | eeprom.h 17 | 18 | 21 | 22 | 25 | main.c 26 | uart.c 27 | utili.c 28 | disp.c 29 | button.c 30 | menu.c 31 | adc.c 32 | tune.c 33 | eeprom.c 34 | 35 | 38 | Makefile 39 | 40 | 41 | 42 | . 43 | 44 | Makefile 45 | 46 | 47 | 48 | localhost 49 | PIC16F1938 50 | 51 | 52 | PICkit3PlatformTool 53 | XC8 54 | 2.36 55 | 3 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | false 71 | false 72 | 73 | 74 | 75 | 76 | 77 | 78 | false 79 | false 80 | 81 | false 82 | 83 | false 84 | false 85 | false 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/nbproject/Makefile-default.mk: -------------------------------------------------------------------------------- 1 | # 2 | # Generated Makefile - do not edit! 3 | # 4 | # Edit the Makefile in the project folder instead (../Makefile). Each target 5 | # has a -pre and a -post target defined where you can add customized code. 6 | # 7 | # This makefile implements configuration specific macros and targets. 8 | 9 | 10 | # Include project Makefile 11 | ifeq "${IGNORE_LOCAL}" "TRUE" 12 | # do not include local makefile. User is passing all local related variables already 13 | else 14 | include Makefile 15 | # Include makefile containing local settings 16 | ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" 17 | include nbproject/Makefile-local-default.mk 18 | endif 19 | endif 20 | 21 | # Environment 22 | MKDIR=gnumkdir -p 23 | RM=rm -f 24 | MV=mv 25 | CP=cp 26 | 27 | # Macros 28 | CND_CONF=default 29 | ifeq ($(TYPE_IMAGE), DEBUG_RUN) 30 | IMAGE_TYPE=debug 31 | OUTPUT_SUFFIX=elf 32 | DEBUGGABLE_SUFFIX=elf 33 | FINAL_IMAGE=${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} 34 | else 35 | IMAGE_TYPE=production 36 | OUTPUT_SUFFIX=hex 37 | DEBUGGABLE_SUFFIX=elf 38 | FINAL_IMAGE=${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} 39 | endif 40 | 41 | ifeq ($(COMPARE_BUILD), true) 42 | COMPARISON_BUILD=-mafrlcsj 43 | else 44 | COMPARISON_BUILD= 45 | endif 46 | 47 | ifdef SUB_IMAGE_ADDRESS 48 | 49 | else 50 | SUB_IMAGE_ADDRESS_COMMAND= 51 | endif 52 | 53 | # Object Directory 54 | OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} 55 | 56 | # Distribution Directory 57 | DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} 58 | 59 | # Source Files Quoted if spaced 60 | SOURCEFILES_QUOTED_IF_SPACED=main.c uart.c utili.c disp.c button.c menu.c adc.c tune.c eeprom.c 61 | 62 | # Object Files Quoted if spaced 63 | OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.p1 ${OBJECTDIR}/uart.p1 ${OBJECTDIR}/utili.p1 ${OBJECTDIR}/disp.p1 ${OBJECTDIR}/button.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/adc.p1 ${OBJECTDIR}/tune.p1 ${OBJECTDIR}/eeprom.p1 64 | POSSIBLE_DEPFILES=${OBJECTDIR}/main.p1.d ${OBJECTDIR}/uart.p1.d ${OBJECTDIR}/utili.p1.d ${OBJECTDIR}/disp.p1.d ${OBJECTDIR}/button.p1.d ${OBJECTDIR}/menu.p1.d ${OBJECTDIR}/adc.p1.d ${OBJECTDIR}/tune.p1.d ${OBJECTDIR}/eeprom.p1.d 65 | 66 | # Object Files 67 | OBJECTFILES=${OBJECTDIR}/main.p1 ${OBJECTDIR}/uart.p1 ${OBJECTDIR}/utili.p1 ${OBJECTDIR}/disp.p1 ${OBJECTDIR}/button.p1 ${OBJECTDIR}/menu.p1 ${OBJECTDIR}/adc.p1 ${OBJECTDIR}/tune.p1 ${OBJECTDIR}/eeprom.p1 68 | 69 | # Source Files 70 | SOURCEFILES=main.c uart.c utili.c disp.c button.c menu.c adc.c tune.c eeprom.c 71 | 72 | 73 | 74 | CFLAGS= 75 | ASFLAGS= 76 | LDLIBSOPTIONS= 77 | 78 | ############# Tool locations ########################################## 79 | # If you copy a project from one host to another, the path where the # 80 | # compiler is installed may be different. # 81 | # If you open this project with MPLAB X in the new host, this # 82 | # makefile will be regenerated and the paths will be corrected. # 83 | ####################################################################### 84 | # fixDeps replaces a bunch of sed/cat/printf statements that slow down the build 85 | FIXDEPS=fixDeps 86 | 87 | .build-conf: ${BUILD_SUBPROJECTS} 88 | ifneq ($(INFORMATION_MESSAGE), ) 89 | @echo $(INFORMATION_MESSAGE) 90 | endif 91 | ${MAKE} -f nbproject/Makefile-default.mk ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} 92 | 93 | MP_PROCESSOR_OPTION=16F1938 94 | # ------------------------------------------------------------------------------------ 95 | # Rules for buildStep: compile 96 | ifeq ($(TYPE_IMAGE), DEBUG_RUN) 97 | ${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk 98 | @${MKDIR} "${OBJECTDIR}" 99 | @${RM} ${OBJECTDIR}/main.p1.d 100 | @${RM} ${OBJECTDIR}/main.p1 101 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/main.p1 main.c 102 | @-${MV} ${OBJECTDIR}/main.d ${OBJECTDIR}/main.p1.d 103 | @${FIXDEPS} ${OBJECTDIR}/main.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 104 | 105 | ${OBJECTDIR}/uart.p1: uart.c nbproject/Makefile-${CND_CONF}.mk 106 | @${MKDIR} "${OBJECTDIR}" 107 | @${RM} ${OBJECTDIR}/uart.p1.d 108 | @${RM} ${OBJECTDIR}/uart.p1 109 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/uart.p1 uart.c 110 | @-${MV} ${OBJECTDIR}/uart.d ${OBJECTDIR}/uart.p1.d 111 | @${FIXDEPS} ${OBJECTDIR}/uart.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 112 | 113 | ${OBJECTDIR}/utili.p1: utili.c nbproject/Makefile-${CND_CONF}.mk 114 | @${MKDIR} "${OBJECTDIR}" 115 | @${RM} ${OBJECTDIR}/utili.p1.d 116 | @${RM} ${OBJECTDIR}/utili.p1 117 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/utili.p1 utili.c 118 | @-${MV} ${OBJECTDIR}/utili.d ${OBJECTDIR}/utili.p1.d 119 | @${FIXDEPS} ${OBJECTDIR}/utili.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 120 | 121 | ${OBJECTDIR}/disp.p1: disp.c nbproject/Makefile-${CND_CONF}.mk 122 | @${MKDIR} "${OBJECTDIR}" 123 | @${RM} ${OBJECTDIR}/disp.p1.d 124 | @${RM} ${OBJECTDIR}/disp.p1 125 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/disp.p1 disp.c 126 | @-${MV} ${OBJECTDIR}/disp.d ${OBJECTDIR}/disp.p1.d 127 | @${FIXDEPS} ${OBJECTDIR}/disp.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 128 | 129 | ${OBJECTDIR}/button.p1: button.c nbproject/Makefile-${CND_CONF}.mk 130 | @${MKDIR} "${OBJECTDIR}" 131 | @${RM} ${OBJECTDIR}/button.p1.d 132 | @${RM} ${OBJECTDIR}/button.p1 133 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/button.p1 button.c 134 | @-${MV} ${OBJECTDIR}/button.d ${OBJECTDIR}/button.p1.d 135 | @${FIXDEPS} ${OBJECTDIR}/button.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 136 | 137 | ${OBJECTDIR}/menu.p1: menu.c nbproject/Makefile-${CND_CONF}.mk 138 | @${MKDIR} "${OBJECTDIR}" 139 | @${RM} ${OBJECTDIR}/menu.p1.d 140 | @${RM} ${OBJECTDIR}/menu.p1 141 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/menu.p1 menu.c 142 | @-${MV} ${OBJECTDIR}/menu.d ${OBJECTDIR}/menu.p1.d 143 | @${FIXDEPS} ${OBJECTDIR}/menu.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 144 | 145 | ${OBJECTDIR}/adc.p1: adc.c nbproject/Makefile-${CND_CONF}.mk 146 | @${MKDIR} "${OBJECTDIR}" 147 | @${RM} ${OBJECTDIR}/adc.p1.d 148 | @${RM} ${OBJECTDIR}/adc.p1 149 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/adc.p1 adc.c 150 | @-${MV} ${OBJECTDIR}/adc.d ${OBJECTDIR}/adc.p1.d 151 | @${FIXDEPS} ${OBJECTDIR}/adc.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 152 | 153 | ${OBJECTDIR}/tune.p1: tune.c nbproject/Makefile-${CND_CONF}.mk 154 | @${MKDIR} "${OBJECTDIR}" 155 | @${RM} ${OBJECTDIR}/tune.p1.d 156 | @${RM} ${OBJECTDIR}/tune.p1 157 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/tune.p1 tune.c 158 | @-${MV} ${OBJECTDIR}/tune.d ${OBJECTDIR}/tune.p1.d 159 | @${FIXDEPS} ${OBJECTDIR}/tune.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 160 | 161 | ${OBJECTDIR}/eeprom.p1: eeprom.c nbproject/Makefile-${CND_CONF}.mk 162 | @${MKDIR} "${OBJECTDIR}" 163 | @${RM} ${OBJECTDIR}/eeprom.p1.d 164 | @${RM} ${OBJECTDIR}/eeprom.p1 165 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -mdebugger=pickit3 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/eeprom.p1 eeprom.c 166 | @-${MV} ${OBJECTDIR}/eeprom.d ${OBJECTDIR}/eeprom.p1.d 167 | @${FIXDEPS} ${OBJECTDIR}/eeprom.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 168 | 169 | else 170 | ${OBJECTDIR}/main.p1: main.c nbproject/Makefile-${CND_CONF}.mk 171 | @${MKDIR} "${OBJECTDIR}" 172 | @${RM} ${OBJECTDIR}/main.p1.d 173 | @${RM} ${OBJECTDIR}/main.p1 174 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/main.p1 main.c 175 | @-${MV} ${OBJECTDIR}/main.d ${OBJECTDIR}/main.p1.d 176 | @${FIXDEPS} ${OBJECTDIR}/main.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 177 | 178 | ${OBJECTDIR}/uart.p1: uart.c nbproject/Makefile-${CND_CONF}.mk 179 | @${MKDIR} "${OBJECTDIR}" 180 | @${RM} ${OBJECTDIR}/uart.p1.d 181 | @${RM} ${OBJECTDIR}/uart.p1 182 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/uart.p1 uart.c 183 | @-${MV} ${OBJECTDIR}/uart.d ${OBJECTDIR}/uart.p1.d 184 | @${FIXDEPS} ${OBJECTDIR}/uart.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 185 | 186 | ${OBJECTDIR}/utili.p1: utili.c nbproject/Makefile-${CND_CONF}.mk 187 | @${MKDIR} "${OBJECTDIR}" 188 | @${RM} ${OBJECTDIR}/utili.p1.d 189 | @${RM} ${OBJECTDIR}/utili.p1 190 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/utili.p1 utili.c 191 | @-${MV} ${OBJECTDIR}/utili.d ${OBJECTDIR}/utili.p1.d 192 | @${FIXDEPS} ${OBJECTDIR}/utili.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 193 | 194 | ${OBJECTDIR}/disp.p1: disp.c nbproject/Makefile-${CND_CONF}.mk 195 | @${MKDIR} "${OBJECTDIR}" 196 | @${RM} ${OBJECTDIR}/disp.p1.d 197 | @${RM} ${OBJECTDIR}/disp.p1 198 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/disp.p1 disp.c 199 | @-${MV} ${OBJECTDIR}/disp.d ${OBJECTDIR}/disp.p1.d 200 | @${FIXDEPS} ${OBJECTDIR}/disp.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 201 | 202 | ${OBJECTDIR}/button.p1: button.c nbproject/Makefile-${CND_CONF}.mk 203 | @${MKDIR} "${OBJECTDIR}" 204 | @${RM} ${OBJECTDIR}/button.p1.d 205 | @${RM} ${OBJECTDIR}/button.p1 206 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/button.p1 button.c 207 | @-${MV} ${OBJECTDIR}/button.d ${OBJECTDIR}/button.p1.d 208 | @${FIXDEPS} ${OBJECTDIR}/button.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 209 | 210 | ${OBJECTDIR}/menu.p1: menu.c nbproject/Makefile-${CND_CONF}.mk 211 | @${MKDIR} "${OBJECTDIR}" 212 | @${RM} ${OBJECTDIR}/menu.p1.d 213 | @${RM} ${OBJECTDIR}/menu.p1 214 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/menu.p1 menu.c 215 | @-${MV} ${OBJECTDIR}/menu.d ${OBJECTDIR}/menu.p1.d 216 | @${FIXDEPS} ${OBJECTDIR}/menu.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 217 | 218 | ${OBJECTDIR}/adc.p1: adc.c nbproject/Makefile-${CND_CONF}.mk 219 | @${MKDIR} "${OBJECTDIR}" 220 | @${RM} ${OBJECTDIR}/adc.p1.d 221 | @${RM} ${OBJECTDIR}/adc.p1 222 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/adc.p1 adc.c 223 | @-${MV} ${OBJECTDIR}/adc.d ${OBJECTDIR}/adc.p1.d 224 | @${FIXDEPS} ${OBJECTDIR}/adc.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 225 | 226 | ${OBJECTDIR}/tune.p1: tune.c nbproject/Makefile-${CND_CONF}.mk 227 | @${MKDIR} "${OBJECTDIR}" 228 | @${RM} ${OBJECTDIR}/tune.p1.d 229 | @${RM} ${OBJECTDIR}/tune.p1 230 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/tune.p1 tune.c 231 | @-${MV} ${OBJECTDIR}/tune.d ${OBJECTDIR}/tune.p1.d 232 | @${FIXDEPS} ${OBJECTDIR}/tune.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 233 | 234 | ${OBJECTDIR}/eeprom.p1: eeprom.c nbproject/Makefile-${CND_CONF}.mk 235 | @${MKDIR} "${OBJECTDIR}" 236 | @${RM} ${OBJECTDIR}/eeprom.p1.d 237 | @${RM} ${OBJECTDIR}/eeprom.p1 238 | ${MP_CC} $(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=$(CND_CONF) -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits $(COMPARISON_BUILD) -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o ${OBJECTDIR}/eeprom.p1 eeprom.c 239 | @-${MV} ${OBJECTDIR}/eeprom.d ${OBJECTDIR}/eeprom.p1.d 240 | @${FIXDEPS} ${OBJECTDIR}/eeprom.p1.d $(SILENT) -rsi ${MP_CC_DIR}../ 241 | 242 | endif 243 | 244 | # ------------------------------------------------------------------------------------ 245 | # Rules for buildStep: assemble 246 | ifeq ($(TYPE_IMAGE), DEBUG_RUN) 247 | else 248 | endif 249 | 250 | # ------------------------------------------------------------------------------------ 251 | # Rules for buildStep: assembleWithPreprocess 252 | ifeq ($(TYPE_IMAGE), DEBUG_RUN) 253 | else 254 | endif 255 | 256 | # ------------------------------------------------------------------------------------ 257 | # Rules for buildStep: link 258 | ifeq ($(TYPE_IMAGE), DEBUG_RUN) 259 | ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk 260 | @${MKDIR} ${DISTDIR} 261 | ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.map -D__DEBUG=1 -mdebugger=pickit3 -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} 262 | @${RM} ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.hex 263 | 264 | else 265 | ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk 266 | @${MKDIR} ${DISTDIR} 267 | ${MP_CC} $(MP_EXTRA_LD_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -Wl,-Map=${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.map -DXPRJ_default=$(CND_CONF) -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="${DFP_DIR}/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto $(COMPARISON_BUILD) -Wl,--memorysummary,${DISTDIR}/memoryfile.xml -o ${DISTDIR}/ATU-100_YAF.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} 268 | 269 | endif 270 | 271 | 272 | # Subprojects 273 | .build-subprojects: 274 | 275 | 276 | # Subprojects 277 | .clean-subprojects: 278 | 279 | # Clean Targets 280 | .clean-conf: ${CLEAN_SUBPROJECTS} 281 | ${RM} -r ${OBJECTDIR} 282 | ${RM} -r ${DISTDIR} 283 | 284 | # Enable dependency checking 285 | .dep.inc: .depcheck-impl 286 | 287 | DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) 288 | ifneq (${DEPFILES},) 289 | include ${DEPFILES} 290 | endif 291 | -------------------------------------------------------------------------------- /ATU-100_YAF.X/menu.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | 3 | #define MENU_MEMORY_TIMEOUT 500 // x 10ms 4 | 5 | #define MENU_SUB_TIMEOUT 500 // x 10ms 6 | 7 | #define UPDATE_PERIODE 10 // x 10ms 8 | #define TUNE_UPDATE_PERIODE 50 // x 10ms 9 | 10 | #define CAL_STEP0_MAX 100 // x 0.1W = 10W 11 | #define CAL_STEP1_MAX 1000 // x 0.1W = 100W 12 | 13 | #define ADC_CAL_START 100 //mV 14 | #define ADC_CAL_STOP 5 //mV 15 | 16 | #define TUNE_AUTO_MIN_SWR 120 17 | #define TUNE_AUTO_MAX_SWR 200 18 | 19 | #define TUNE_STOP_MIN_SWR 100 20 | #define TUNE_STOP_MAX_SWR 150 21 | 22 | #define SLEEP_DELAY_MAX 300 23 | #define SLEEP_DELAY_STEP_SLOW 5 24 | #define SLEEP_DELAY_STEP_FAST 15 25 | #define SLEEP_DELAY_FAST_HIGHER 100 26 | 27 | typedef struct 28 | { 29 | const char* title; 30 | void (*Init)(void) ; 31 | void (*Run)(void) ; 32 | } menu_t; 33 | 34 | 35 | //variables 36 | const menu_t* current_menu; 37 | 38 | 39 | static union 40 | { 41 | 42 | struct 43 | { 44 | uint8_t cursor; 45 | uint16_t relais_backup; 46 | uint8_t update_cnt; 47 | } reltest; 48 | 49 | struct 50 | { 51 | uint8_t cursor; 52 | int16_t stop_swr; 53 | int16_t auto_swr; 54 | uint8_t auto_enable; 55 | } tparam; 56 | 57 | struct 58 | { 59 | uint8_t cursor; 60 | uint8_t enable; 61 | int16_t delay_sec; 62 | } sleep; 63 | 64 | struct 65 | { 66 | uint8_t update_cnt; 67 | int16_t old_pwr; 68 | int16_t sleep_timer; 69 | uint8_t counter_1sec; 70 | uint16_t relais_backup; 71 | } main; 72 | 73 | struct 74 | { 75 | uint8_t items; 76 | uint8_t cursor; 77 | uint8_t top; 78 | uint16_t timeout; 79 | const menu_t **ptrMenu; 80 | } sub; 81 | 82 | 83 | struct 84 | { 85 | uint8_t update_cnt; 86 | uint8_t blink; 87 | uint16_t relays_backup; 88 | } tune; 89 | 90 | struct 91 | { 92 | uint8_t cursor; 93 | uint8_t step; 94 | int16_t cal_point[2]; 95 | int16_t adc_value[2]; 96 | int16_t adc_value_old; 97 | 98 | } cal; 99 | struct 100 | { 101 | uint8_t step; 102 | } about; 103 | 104 | struct 105 | { 106 | uint16_t timeout; 107 | uint8_t cursor; 108 | uint8_t save_mode; 109 | uint8_t top; 110 | } memory; 111 | 112 | struct 113 | { 114 | uint8_t mem_index; 115 | uint8_t cursor; 116 | uint8_t button_repeat_delay; 117 | tunemem_t tunemem; 118 | }nameedit; 119 | 120 | struct 121 | { 122 | uint8_t mem_index; 123 | uint8_t cursor; 124 | tunemem_t tunemem; 125 | uint8_t str_terminate; //must stay direkt behind memory 126 | }startupsave; 127 | 128 | 129 | } MENU_var; 130 | 131 | 132 | static uint8_t MENU_cursor; 133 | 134 | 135 | 136 | 137 | 138 | //Prototypes 139 | 140 | static void MENU_Main_Init(void); 141 | static void MENU_Main_Run(void); 142 | 143 | static void MENU_SubSetup_Init(void); 144 | static void MENU_SubTop_Init(void); 145 | 146 | static void MENU_Sub_Run(void); 147 | static void MENU_Sub_Update(void); 148 | 149 | 150 | static void MENU_Reset_Init(void); 151 | static void MENU_Bypass_Init(void); 152 | 153 | static void MENU_TParam_Init(void); 154 | static void MENU_TParam_Run(void); 155 | 156 | static void MENU_TParam_Init(void); 157 | static void MENU_TParam_Run(void); 158 | 159 | static void MENU_Sleep_Init(void); 160 | static void MENU_Sleep_Run(void); 161 | 162 | static void MENU_CalPWR_Init(void); 163 | static void MENU_CalPWR_Run(void); 164 | 165 | static void MENU_RelTest_Init(void); 166 | static void MENU_RelTest_Run(void); 167 | 168 | static void MENU_Tune_Init(void); 169 | static void MENU_Tune_Run(void); 170 | 171 | static void MENU_MemorySave_Init(void); 172 | static void MENU_MemoryLoad_Init(void); 173 | static void MENU_Memory_Run(void); 174 | 175 | 176 | static void MENU_About_Init(void); 177 | static void MENU_About_Run(void); 178 | 179 | static void MENU_NameEdit_Init(void); 180 | static void MENU_NameEdit_Run(void); 181 | 182 | static void MENU_StartupSave_Init(void); 183 | static void MENU_StartupSave_Run(void); 184 | 185 | const menu_t menuMain ={NULL, MENU_Main_Init, MENU_Main_Run}; 186 | const menu_t menuSubTop ={NULL, MENU_SubTop_Init, MENU_Sub_Run}; 187 | const menu_t menuSubSetup ={str_MENU_Setup, MENU_SubSetup_Init, MENU_Sub_Run}; 188 | 189 | const menu_t menuBypass ={str_MENU_Bypass, MENU_Bypass_Init, NULL}; 190 | const menu_t menuReset ={str_MENU_Reset, MENU_Reset_Init, NULL}; 191 | 192 | const menu_t menuSave ={str_MENU_Save, MENU_MemorySave_Init, MENU_Memory_Run}; 193 | const menu_t menuLoad ={str_MENU_Load, MENU_MemoryLoad_Init, MENU_Memory_Run}; 194 | 195 | const menu_t menuAbout ={str_MENU_About, MENU_About_Init, MENU_About_Run}; 196 | 197 | 198 | 199 | const menu_t menuTParam ={str_MENU_TunePar, MENU_TParam_Init, MENU_TParam_Run}; 200 | 201 | const menu_t menuSleep ={str_MENU_Sleep, MENU_Sleep_Init, MENU_Sleep_Run}; 202 | const menu_t menuRelTest ={str_MENU_RelTest, MENU_RelTest_Init, MENU_RelTest_Run}; 203 | const menu_t menuCal ={str_MENU_Cal, MENU_CalPWR_Init, MENU_CalPWR_Run}; 204 | 205 | 206 | #define MENU_SUBTOP_ITEMS 6 207 | const menu_t* ptrSubTopMenu[MENU_SUBTOP_ITEMS] = { &menuBypass, &menuLoad, &menuSave, &menuReset, &menuSubSetup, &menuAbout}; 208 | 209 | #define MENU_SUBSETUP_ITEMS 4 210 | const menu_t* ptrSubSetupMenu[MENU_SUBSETUP_ITEMS] = { &menuTParam, &menuSleep, &menuCal, &menuRelTest }; 211 | 212 | const menu_t menuTune ={NULL, MENU_Tune_Init, MENU_Tune_Run}; 213 | const menu_t menuNameEdit ={NULL, MENU_NameEdit_Init, MENU_NameEdit_Run}; 214 | const menu_t menuStartupSave ={NULL, MENU_StartupSave_Init, MENU_StartupSave_Run}; 215 | 216 | 217 | //-- MENU_MAIN ------------------------------------------------------------------------------------------------- 218 | 219 | static void MENU_Main_Update(void) 220 | { 221 | uint8_t c_row = 2; 222 | uint8_t l_row = 3; 223 | 224 | const char *p_str = NULL; 225 | char str[7]; 226 | 227 | DISP_PWR(4, 0, global.PWR, 0); 228 | DISP_SWR(4, 1, global.SWR, 0); 229 | 230 | if (global.cap_sw) 231 | { 232 | c_row = 3; 233 | l_row = 2; 234 | } 235 | 236 | 237 | if (global.bypass_enable == TRUE) 238 | { 239 | DISP_Str(0, 3, str_Bypass, 1); 240 | } 241 | else 242 | { 243 | DISP_Str(0, c_row,str_C_, 0); 244 | UTILI_GetCapValueStr(str, sizeof (str)); 245 | DISP_Str(2, c_row, str, 0); 246 | 247 | DISP_Str(0, l_row,str_L_, 0); 248 | UTILI_GetIndValueStr(str, sizeof (str)); 249 | DISP_Str(2, l_row, str, 0); 250 | } 251 | 252 | //Display AUTO 253 | if((global.tune_auto_enable == TRUE) && (global.bypass_enable != TRUE)) 254 | { 255 | p_str = str_AUTO; 256 | for(uint8_t i=0; i<4; i++) 257 | { 258 | DISP_Char(9, i, p_str[i], 0); 259 | } 260 | } 261 | 262 | 263 | 264 | 265 | 266 | // UTILI_Int2Str(global.adc_f_mV, str, sizeof (str)); 267 | // DISP_Str(5, 2, str, 0); 268 | // 269 | // UTILI_Int2Str(global.adc_r_mV, str, sizeof (str)); 270 | // DISP_Str(5, 3, str, 0); 271 | 272 | 273 | } 274 | 275 | static void MENU_Main_Init(void) 276 | { 277 | DISP_Clr(); 278 | BUTTON_Reset(); 279 | DISP_Str(0, 0,str_PWR,0); 280 | DISP_Str(0, 1,str_SWR,0); 281 | MENU_var.main.update_cnt = 0; 282 | MENU_var.main.old_pwr = -1; //Dummy value 283 | MENU_var.main.counter_1sec =0; 284 | MENU_var.main.sleep_timer =0; 285 | MENU_var.main.relais_backup = UTILI_Get_LC_Relays(); 286 | } 287 | 288 | static void MENU_Main_Weakup(void) 289 | { 290 | UTILI_Set_LC_Relays(MENU_var.main.relais_backup); 291 | MENU_Main_Init(); //Restore display 292 | } 293 | 294 | static void MENU_Main_Run(void) 295 | { 296 | UTILI_CalPWR(); 297 | UTILI_CalSWR(); 298 | 299 | //----------------------------------------- 300 | //global.sleep_delay_sec = 100; 301 | //----------------------------------------- 302 | 303 | if ((global.PWR >= SLEEP_WAKEUP_PWR ) && (global.sleep_enable == TRUE)) 304 | { 305 | if (MENU_var.main.sleep_timer == global.sleep_delay_sec) 306 | { 307 | //sleeping weakup by power 308 | MENU_Main_Weakup(); 309 | } 310 | 311 | MENU_var.main.sleep_timer=0; //Reset sleeptimer if PWR >0 312 | } 313 | 314 | if ((global.sleep_enable == TRUE) && (global.bypass_enable != TRUE)) 315 | { 316 | if (MENU_var.main.sleep_timer < global.sleep_delay_sec) 317 | { 318 | MENU_var.main.counter_1sec++; 319 | if (MENU_var.main.counter_1sec == 100) 320 | { 321 | MENU_var.main.counter_1sec=0; 322 | MENU_var.main.sleep_timer++; 323 | if (MENU_var.main.sleep_timer == global.sleep_delay_sec) 324 | { 325 | //Sleeping 326 | DISP_Clr(); 327 | DISP_Str(DISP_COL_CENTER, 1, str_sleeping, 0); 328 | UTILI_Set_LC_Relays(0); //Reset all relays 329 | } 330 | } 331 | } 332 | } 333 | 334 | 335 | if ((MENU_var.main.sleep_timer < global.sleep_delay_sec) || (global.sleep_enable != TRUE)) 336 | { 337 | MENU_var.main.update_cnt++; 338 | if (MENU_var.main.update_cnt == UPDATE_PERIODE) 339 | { 340 | MENU_var.main.update_cnt = 0; 341 | if ((global.PWR > 0) || (MENU_var.main.old_pwr != 0)) //avoid display refresh when receiving 342 | { 343 | MENU_var.main.old_pwr = global.PWR; 344 | MENU_Main_Update(); 345 | } 346 | } 347 | 348 | //Auto Tune 349 | if((global.tune_auto_enable == TRUE) && (global.bypass_enable != TRUE)) 350 | { 351 | if((global.PWR > 0) && (global.SWR >= global.tune_auto_swr)) 352 | { 353 | current_menu = &menuTune; 354 | current_menu->Init(); 355 | } 356 | } 357 | 358 | 359 | //short press -> 360 | if (BUTTON_count == BUTTON_RELEASED) 361 | { 362 | if(global.bypass_enable == TRUE) //-> bypass reset 363 | { 364 | global.bypass_enable = FALSE; 365 | UTILI_Set_LC_Relays(global.bypass_save_relais); 366 | } 367 | else // -> Tuning 368 | { 369 | current_menu = &menuTune; 370 | } 371 | current_menu->Init(); 372 | } 373 | 374 | //long pressed -> 375 | if (BUTTON_count == BUTTON_LONG_PRESSED) 376 | { 377 | if(global.bypass_enable == TRUE) //-> bypass reset 378 | { 379 | global.bypass_enable = FALSE; 380 | UTILI_Set_LC_Relays(global.bypass_save_relais); 381 | } 382 | else //-> sub menu 383 | { 384 | current_menu = &menuSubTop; 385 | } 386 | current_menu->Init(); 387 | } 388 | } 389 | else 390 | { 391 | //sleeping weakup by button 392 | if (BUTTON_count == BUTTON_SHORT_PRESSED) 393 | { 394 | MENU_Main_Weakup(); 395 | } 396 | } 397 | 398 | 399 | 400 | } 401 | 402 | //-- Menu_Reset -------------------------------------------------------------------------------------------------- 403 | static void MENU_Reset_Init(void) 404 | { 405 | UTILI_Set_LC_Relays(0); 406 | global.bypass_enable = FALSE; 407 | MENU_Init(); 408 | } 409 | 410 | //-- Menu Bypass -------------------------------------------------------------------------------------------------- 411 | static void MENU_Bypass_Init(void) 412 | { 413 | global.bypass_enable = TRUE; 414 | global.bypass_save_relais = UTILI_Get_LC_Relays(); //Save current relais 415 | UTILI_Set_LC_Relays(0); //reset relais 416 | MENU_Init(); 417 | } 418 | 419 | //-- Menu_Tune -------------------------------------------------------------------------------------------------- 420 | 421 | static void MENU_Tune_Update(void) 422 | { 423 | uint8_t state = TUNE_state; 424 | if (state == TUNE_RUN) 425 | { 426 | if (MENU_var.tune.blink) 427 | { 428 | MENU_var.tune.blink = 0; 429 | state=0; 430 | } else 431 | { 432 | MENU_var.tune.blink = 1; 433 | } 434 | } 435 | DISP_Str(DISP_COL_CENTER, 2, str_TUNE_State[state], 0); 436 | } 437 | 438 | static void MENU_Tune_Init(void) 439 | { 440 | DISP_Clr(); 441 | BUTTON_Reset(); 442 | DISP_Str(DISP_COL_CENTER, 0, str__Tune_, 1); 443 | MENU_var.tune.blink=0; 444 | MENU_var.tune.relays_backup = UTILI_Get_LC_Relays(); 445 | TUNE_Init(); 446 | } 447 | 448 | static void MENU_Tune_Run(void) 449 | { 450 | 451 | //Tune 452 | TUNE_Run(); 453 | 454 | //Display update 455 | MENU_var.tune.update_cnt++; 456 | if (MENU_var.tune.update_cnt == TUNE_UPDATE_PERIODE) 457 | { 458 | MENU_var.tune.update_cnt = 0; 459 | MENU_Tune_Update(); 460 | } 461 | 462 | if (BUTTON_count == BUTTON_SHORT_PRESSED) 463 | { 464 | UTILI_Set_LC_Relays(MENU_var.tune.relays_backup); 465 | MENU_Init(); 466 | return; 467 | } 468 | 469 | if(TUNE_state == TUNE_READY) 470 | { 471 | MENU_Init(); 472 | return; 473 | } 474 | 475 | } 476 | 477 | //-- Menu_TParam -------------------------------------------------------------------------------------------------- 478 | static void MENU_TParam_Update(void) 479 | { 480 | uint8_t cursor = MENU_var.tparam.cursor; 481 | if(MENU_var.tparam.auto_enable == TRUE) 482 | { 483 | DISP_Str(7, 0, str_On, (cursor == 0)); 484 | } 485 | else 486 | { 487 | DISP_Str(7, 0, str_Off, (cursor == 0)); 488 | } 489 | 490 | DISP_SWR(6, 1, MENU_var.tparam.auto_swr, (cursor == 1)); 491 | DISP_SWR(6, 2, MENU_var.tparam.stop_swr, (cursor == 2)); 492 | DISP_Str(0,3,str_Save, (cursor == 3)); 493 | DISP_Str(7,3,str_Esc, (cursor == 4)); 494 | 495 | } 496 | 497 | static void MENU_TParam_Init(void) 498 | { 499 | DISP_Clr(); 500 | BUTTON_Reset(); 501 | DISP_Str(0, 0,str_Auto, 0); 502 | DISP_Str(0, 1,str_Start,0); 503 | DISP_Str(0, 2,str_Stop,0); 504 | MENU_var.tparam.cursor=0; 505 | MENU_var.tparam.auto_enable = global.tune_auto_enable; 506 | MENU_var.tparam.auto_swr = global.tune_auto_swr; 507 | MENU_var.tparam.stop_swr = global.tune_stop_swr; 508 | MENU_TParam_Update(); 509 | } 510 | 511 | static void MENU_TParam_Run(void) 512 | { 513 | 514 | if (BUTTON_count == BUTTON_RELEASED) 515 | { 516 | MENU_var.tparam.cursor++; 517 | if (MENU_var.tparam.cursor > 4) 518 | { 519 | MENU_var.tparam.cursor = 0; 520 | } 521 | 522 | MENU_TParam_Update(); 523 | } 524 | 525 | if (BUTTON_count == BUTTON_LONG_PRESSED) 526 | { 527 | BUTTON_count -= BUTTON_LONG_REPEAT_DELAY_MAX; 528 | 529 | //cursor at "Auto" 530 | if(MENU_var.tparam.cursor == 0) 531 | { 532 | if(MENU_var.tparam.auto_enable == TRUE) 533 | { 534 | MENU_var.tparam.auto_enable = FALSE; 535 | } 536 | else 537 | { 538 | MENU_var.tparam.auto_enable = TRUE; 539 | } 540 | MENU_TParam_Update(); 541 | } 542 | 543 | 544 | //cursor at "Start" 545 | if(MENU_var.tparam.cursor == 1) 546 | { 547 | MENU_var.tparam.auto_swr += 5; // step SWR 0.05 548 | if(MENU_var.tparam.auto_swr > TUNE_AUTO_MAX_SWR) 549 | { 550 | MENU_var.tparam.auto_swr = TUNE_AUTO_MIN_SWR; 551 | } 552 | MENU_TParam_Update(); 553 | } 554 | 555 | //cursor at "Stop" 556 | if(MENU_var.tparam.cursor == 2) 557 | { 558 | MENU_var.tparam.stop_swr += 5; // step SWR 0.05 559 | if(MENU_var.tparam.stop_swr > TUNE_STOP_MAX_SWR) 560 | { 561 | MENU_var.tparam.stop_swr = TUNE_STOP_MIN_SWR; 562 | } 563 | MENU_TParam_Update(); 564 | } 565 | 566 | if (MENU_var.tparam.cursor == 3) //cursor at "Save" 567 | { 568 | global.tune_auto_enable = MENU_var.tparam.auto_enable; 569 | global.tune_auto_swr = MENU_var.tparam.auto_swr; 570 | global.tune_stop_swr = MENU_var.tparam.stop_swr; 571 | 572 | EEPROM_Write((uint8_t)&ee_tune_stop_swr, &global.tune_stop_swr, sizeof(ee_tune_stop_swr)); 573 | EEPROM_Write((uint8_t)&ee_tune_auto_swr, &global.tune_auto_swr, sizeof(ee_tune_auto_swr)); 574 | EEPROM_Write((uint8_t)&ee_tune_auto_enable, &global.tune_auto_enable, sizeof(ee_tune_auto_enable)); 575 | MENU_Init(); 576 | return; 577 | } 578 | 579 | if (MENU_var.tparam.cursor == 4) //cursor at "ESC" 580 | { 581 | MENU_Init(); 582 | return; 583 | } 584 | 585 | } 586 | } 587 | 588 | 589 | //-- Menu_Sleep -------------------------------------------------------------------------------------------------- 590 | static void MENU_Sleep_Update(void) 591 | { 592 | uint8_t cursor = MENU_var.sleep.cursor; 593 | if(MENU_var.sleep.enable == TRUE) 594 | { 595 | DISP_Str(7, 0, str_On, (cursor == 0)); 596 | } 597 | else 598 | { 599 | DISP_Str(7, 0, str_Off, (cursor == 0)); 600 | } 601 | 602 | char str[4]; 603 | UTILI_Int2Str(MENU_var.sleep.delay_sec, str, sizeof(str)); 604 | DISP_Str(7,1,str,(cursor == 1)); 605 | DISP_Str(0,3,str_Save,(cursor == 2)); 606 | DISP_Str(7,3,str_Esc, (cursor == 3)); 607 | 608 | } 609 | 610 | static void MENU_Sleep_Init(void) 611 | { 612 | DISP_Clr(); 613 | BUTTON_Reset(); 614 | DISP_Str(0, 0, str_Sleep, 0); 615 | DISP_Str(0, 1, str_Delay,0); 616 | MENU_var.sleep.cursor=0; 617 | MENU_var.sleep.enable = global.sleep_enable; 618 | MENU_var.sleep.delay_sec = global.sleep_delay_sec; 619 | MENU_Sleep_Update(); 620 | } 621 | 622 | static void MENU_Sleep_Run(void) 623 | { 624 | 625 | if (BUTTON_count == BUTTON_RELEASED) 626 | { 627 | MENU_var.sleep.cursor++; 628 | if (MENU_var.sleep.cursor > 3) 629 | { 630 | MENU_var.sleep.cursor = 0; 631 | } 632 | MENU_Sleep_Update(); 633 | } 634 | 635 | if (BUTTON_count == BUTTON_LONG_PRESSED) 636 | { 637 | BUTTON_count -= BUTTON_LONG_REPEAT_DELAY_MAX; 638 | 639 | //cursor at "Sleep" 640 | if(MENU_var.sleep.cursor == 0) 641 | { 642 | if(MENU_var.sleep.enable == TRUE) 643 | { 644 | MENU_var.sleep.enable = FALSE; 645 | } 646 | else 647 | { 648 | MENU_var.sleep.enable = TRUE; 649 | } 650 | MENU_Sleep_Update(); 651 | } 652 | 653 | 654 | //cursor at "Delay" 655 | if(MENU_var.sleep.cursor == 1) 656 | { 657 | 658 | if(MENU_var.sleep.delay_sec >= SLEEP_DELAY_FAST_HIGHER) 659 | { 660 | MENU_var.sleep.delay_sec += SLEEP_DELAY_STEP_FAST; 661 | } 662 | else 663 | { 664 | MENU_var.sleep.delay_sec += SLEEP_DELAY_STEP_SLOW; 665 | } 666 | 667 | if(MENU_var.sleep.delay_sec > SLEEP_DELAY_MAX) 668 | { 669 | MENU_var.sleep.delay_sec = SLEEP_DELAY_STEP_SLOW; 670 | } 671 | 672 | MENU_Sleep_Update(); 673 | } 674 | 675 | 676 | if (MENU_var.tparam.cursor == 2) //cursor at "Save" 677 | { 678 | global.sleep_delay_sec = MENU_var.sleep.delay_sec; 679 | global.sleep_enable = MENU_var.sleep.enable; 680 | EEPROM_Write((uint8_t)&ee_sleep_delay_sec, &global.sleep_delay_sec, sizeof(ee_sleep_delay_sec)); 681 | EEPROM_Write((uint8_t)&ee_sleep_enable, &global.sleep_enable, sizeof(ee_sleep_enable)); 682 | MENU_Init(); 683 | return; 684 | } 685 | 686 | if (MENU_var.tparam.cursor == 3) //cursor at "Esc" 687 | { 688 | MENU_Init(); 689 | return; 690 | } 691 | 692 | 693 | } 694 | } 695 | 696 | 697 | 698 | //-- Menu_RelTest -------------------------------------------------------------------------------------------------- 699 | 700 | static void MENU_RelTest_Update(void) 701 | { 702 | uint8_t cursor = MENU_var.reltest.cursor; 703 | uint8_t c_row = 1; 704 | uint8_t l_row = 2; 705 | char str[7]; 706 | 707 | 708 | 709 | //switch off : Input -> C -> L -> Output 710 | //switch on : Input -> L -> C -> Output 711 | if (global.cap_sw) 712 | { 713 | c_row = 2; 714 | l_row = 1; 715 | } 716 | 717 | 718 | DISP_Str(0, c_row, str_C_, 0); 719 | UTILI_GetCapValueStr(str, sizeof (str)); 720 | DISP_Str(4, c_row, str, (cursor == (c_row - 1))); 721 | 722 | DISP_Str(0, l_row, str_L_, 0); 723 | UTILI_GetIndValueStr(str, sizeof (str)); 724 | DISP_Str(4, l_row, str, (cursor == (l_row - 1))); 725 | 726 | if (!global.cap_sw) 727 | { 728 | DISP_Str(0, 3, str_C_L, (cursor == 2)); 729 | } else 730 | { 731 | DISP_Str(0, 3, str_L_C, (cursor == 2)); 732 | } 733 | 734 | DISP_Str(7, 3, str_Esc, (cursor == 3)); 735 | } 736 | 737 | static void MENU_RelTest_Init(void) 738 | { 739 | DISP_Clr(); 740 | BUTTON_Reset(); 741 | MENU_var.reltest.cursor = 0; 742 | MENU_var.reltest.relais_backup = UTILI_Get_LC_Relays(); 743 | MENU_var.reltest.update_cnt = 0; 744 | global.cap_sw = 0; 745 | global.cap_relays = 0; 746 | global.ind_relays = 0; 747 | UTILI_SetRelays(); 748 | MENU_RelTest_Update(); 749 | } 750 | 751 | static void MENU_RelTest_Run(void) 752 | { 753 | 754 | MENU_var.reltest.update_cnt++; 755 | if (MENU_var.reltest.update_cnt == UPDATE_PERIODE) 756 | { 757 | MENU_var.reltest.update_cnt = 0; 758 | UTILI_CalPWR(); 759 | UTILI_CalSWR(); 760 | DISP_SWR(0, 0, global.SWR, 0); 761 | DISP_PWR(6, 0, global.PWR, 0); 762 | } 763 | 764 | if (BUTTON_count == BUTTON_RELEASED) 765 | { 766 | MENU_var.reltest.cursor++; 767 | if (MENU_var.reltest.cursor > 3) 768 | { 769 | MENU_var.reltest.cursor = 0; 770 | } 771 | 772 | MENU_RelTest_Update(); 773 | } 774 | 775 | 776 | if (BUTTON_count == BUTTON_LONG_PRESSED) 777 | { 778 | BUTTON_count -= BUTTON_LONG_REPEAT_DELAY_MAX; 779 | 780 | //cursor at "cap" 781 | if ((!global.cap_sw && (MENU_var.reltest.cursor == 0)) 782 | || (global.cap_sw && (MENU_var.reltest.cursor == 1))) 783 | { 784 | if (global.cap_relays == 0) 785 | { 786 | global.cap_relays = 1; 787 | } else 788 | { 789 | global.cap_relays = (uint8_t) (global.cap_relays << 1) & 0x7f; 790 | } 791 | } 792 | 793 | 794 | //cursor at "ind" 795 | if ((!global.cap_sw && (MENU_var.reltest.cursor == 1)) 796 | || (global.cap_sw && (MENU_var.reltest.cursor == 0))) 797 | { 798 | if (global.ind_relays == 0) 799 | { 800 | global.ind_relays = 1; 801 | } else 802 | { 803 | global.ind_relays = (uint8_t) (global.ind_relays << 1) & 0x7f; 804 | } 805 | } 806 | 807 | if (MENU_var.reltest.cursor == 2) //cursor at "C-SW" 808 | { 809 | if (global.cap_sw == 0) 810 | { 811 | global.cap_sw = 1; 812 | } else 813 | { 814 | global.cap_sw = 0; 815 | } 816 | 817 | BUTTON_count = BUTTON_RESET; 818 | 819 | } 820 | 821 | if (MENU_var.reltest.cursor == 3) //cursor at "Esc" 822 | { 823 | //Restore C/L settings 824 | UTILI_Set_LC_Relays(MENU_var.reltest.relais_backup); 825 | MENU_Init(); 826 | return; 827 | } 828 | else 829 | { 830 | MENU_RelTest_Update(); 831 | } 832 | 833 | UTILI_SetRelays(); 834 | } 835 | 836 | 837 | //- Buttons Auto and Bypass for fine tuning 838 | 839 | uint8_t update =0; 840 | 841 | //cursor at "cap" 842 | if ((!global.cap_sw && (MENU_var.reltest.cursor == 0)) 843 | || (global.cap_sw && (MENU_var.reltest.cursor == 1))) 844 | { 845 | if(BUTTON_Bypass_count == 1) 846 | { 847 | if(global.cap_relays > 0) global.cap_relays--; 848 | update=1; 849 | } 850 | 851 | if(BUTTON_Auto_count == 1) 852 | { 853 | if(global.cap_relays < 0x7f) global.cap_relays++; 854 | update=1; 855 | } 856 | } 857 | 858 | 859 | //cursor at "ind" 860 | if ((!global.cap_sw && (MENU_var.reltest.cursor == 1)) 861 | || (global.cap_sw && (MENU_var.reltest.cursor == 0))) 862 | { 863 | if(BUTTON_Bypass_count == 1) 864 | { 865 | if(global.ind_relays > 0) global.ind_relays--; 866 | update=1; 867 | } 868 | 869 | if(BUTTON_Auto_count == 1) 870 | { 871 | if(global.ind_relays < 0x7f) global.ind_relays++; 872 | update=1; 873 | } 874 | } 875 | 876 | 877 | if(update) 878 | { 879 | UTILI_SetRelays(); 880 | MENU_RelTest_Update(); 881 | } 882 | 883 | 884 | } 885 | 886 | 887 | //-- MENU_CalMenu ------------------------------------------------------------------------------------------------- 888 | 889 | static void MENU_CalPWR_Update(void) 890 | { 891 | char str[2] = " "; 892 | 893 | str[0] = MENU_var.cal.step + '1'; 894 | DISP_Str(0, 0,str_Point,0); 895 | DISP_Str(9, 0, str, 0); 896 | DISP_Str(0, 1,str_WaitForHF, 0); 897 | 898 | DISP_Str(0, 2, str_Power, 0); 899 | DISP_PWR(6, 2, MENU_var.cal.cal_point[MENU_var.cal.step], (MENU_var.cal.cursor == 0)); 900 | 901 | DISP_Str(7, 3,str_Esc, (MENU_var.cal.cursor == 1)); 902 | } 903 | 904 | static void MENU_CalPWR_Init(void) 905 | { 906 | DISP_Clr(); 907 | MENU_var.cal.cursor = 0; 908 | MENU_var.cal.step = 0; 909 | MENU_var.cal.cal_point[0] = global.cal_point[0]; 910 | MENU_var.cal.cal_point[1] = global.cal_point[1]; 911 | BUTTON_Reset(); 912 | 913 | MENU_CalPWR_Update(); 914 | 915 | } 916 | 917 | static void MENU_CalPWR_Run(void) 918 | { 919 | if (BUTTON_count == BUTTON_RELEASED) 920 | { 921 | MENU_var.cal.cursor = MENU_var.cal.cursor ^ 0x01; // value 0 or 1 922 | MENU_CalPWR_Update(); 923 | } 924 | 925 | 926 | if (BUTTON_count == BUTTON_LONG_PRESSED) 927 | { 928 | BUTTON_count -= BUTTON_LONG_REPEAT_DELAY_MAX; 929 | 930 | 931 | if ((MENU_var.cal.cursor == 0)&&(MENU_var.cal.step <=1)) //cursor at "Power" 932 | { 933 | int16_t value = MENU_var.cal.cal_point[MENU_var.cal.step]; 934 | 935 | if (value < 100) value += 5; 936 | else value += 50; 937 | 938 | if (MENU_var.cal.step == 0) 939 | { 940 | if (value > CAL_STEP0_MAX) value = 0; 941 | } 942 | else 943 | { 944 | //Value in step 1 could not be smaller than in step 0 945 | if (value > CAL_STEP1_MAX) value = MENU_var.cal.cal_point[0]; 946 | } 947 | 948 | MENU_var.cal.cal_point[MENU_var.cal.step] = value; 949 | 950 | MENU_CalPWR_Update(); 951 | 952 | } 953 | else //cursor at "ESC" 954 | { 955 | MENU_Init(); 956 | return; 957 | } 958 | } 959 | 960 | //ADC 961 | if (MENU_var.cal.step <= 1) //step 0 & 1 962 | { 963 | if (global.adc_f_mV > ADC_CAL_START) 964 | { 965 | if (global.adc_f_mV == MENU_var.cal.adc_value_old) //stable value current == old 966 | { 967 | MENU_var.cal.adc_value[MENU_var.cal.step] = global.adc_f_mV; //save 968 | 969 | DISP_Clr(); 970 | DISP_Str(DISP_COL_CENTER, 1, str_Ok, 0); 971 | MENU_var.cal.step += 2; //steps 0->2 & 1->3 972 | } 973 | } 974 | } 975 | else //step 2 & 3 976 | { 977 | //Wait end of power 978 | if (global.adc_f_mV < ADC_CAL_STOP) 979 | { 980 | 981 | MENU_var.cal.step--; //steps 2->1 & 3->2 982 | if (MENU_var.cal.step == 1) 983 | { 984 | DISP_Clr(); 985 | MENU_CalPWR_Update(); 986 | } 987 | else 988 | { 989 | global.cal_point[0] = MENU_var.cal.cal_point[0]; 990 | global.cal_point[1] = MENU_var.cal.cal_point[1]; 991 | 992 | // char str[8]; 993 | // UART_WriteStr("Point 0: "); 994 | // UTILI_Int2Str(global.cal_point[0],str,sizeof(str)); 995 | // UART_WriteStrLn(str); 996 | 997 | // UART_WriteStr("Point 1: "); 998 | // UTILI_Int2Str(global.cal_point[1],str,sizeof(str)); 999 | // UART_WriteStrLn(str); 1000 | 1001 | int16_t y1 = UTILI_deciWatt_to_centiVolt(global.cal_point[0]); 1002 | int16_t y2 = UTILI_deciWatt_to_centiVolt(global.cal_point[1]); 1003 | 1004 | // UART_WriteStr("Point V 0: "); 1005 | // UTILI_Int2Str(y1,str,sizeof(str)); 1006 | // UART_WriteStrLn(str); 1007 | 1008 | // UART_WriteStr("Point V 1: "); 1009 | // UTILI_Int2Str(y2,str,sizeof(str)); 1010 | // UART_WriteStrLn(str); 1011 | 1012 | global.cal_gain = (int16_t) (((y2 - y1) * (int32_t) CAL_GAIN_MULTIPLIER) / (MENU_var.cal.adc_value[1] - MENU_var.cal.adc_value[0])); 1013 | 1014 | // UART_WriteStr("Gain: "); 1015 | // UTILI_Int2Str(global.cal_gain,str,sizeof(str)); 1016 | // UART_WriteStrLn(str); 1017 | 1018 | global.cal_offset = y1 - (int16_t) (((int32_t) global.cal_gain * MENU_var.cal.adc_value[0]) / CAL_GAIN_MULTIPLIER); 1019 | 1020 | // UART_WriteStr("Offset: "); 1021 | // UTILI_Int2Str(global.cal_offset,str,sizeof(str)); 1022 | // UART_WriteStrLn(str); 1023 | 1024 | //Save new cal values to eeprom 1025 | EEPROM_Write((uint8_t)&ee_cal_point_0, &global.cal_point[0], sizeof (ee_cal_point_0)); 1026 | EEPROM_Write((uint8_t)&ee_cal_point_1, &global.cal_point[1], sizeof (ee_cal_point_1)); 1027 | EEPROM_Write((uint8_t)&ee_cal_offset, &global.cal_offset, sizeof (ee_cal_offset)); 1028 | EEPROM_Write((uint8_t)&ee_cal_gain, &global.cal_gain, sizeof (ee_cal_gain)); 1029 | 1030 | MENU_Init(); 1031 | return; 1032 | } 1033 | } 1034 | } 1035 | 1036 | MENU_var.cal.adc_value_old = global.adc_f_mV; 1037 | 1038 | 1039 | 1040 | } 1041 | 1042 | 1043 | 1044 | 1045 | //static void MENU_Back_Init(void) 1046 | //{ 1047 | // const menu_t* ptrMenu; 1048 | // if(stack_index > 1) 1049 | // { 1050 | // stack_index--; 1051 | // stack_index--; 1052 | // ptrMenu = (menu_t*) stack_menu[stack_index]; 1053 | // ptrMenu->Init(); 1054 | // 1055 | // } 1056 | //} 1057 | 1058 | 1059 | //-- MENU_Setup ------------------------------------------------------------------------------------------------- 1060 | static void MENU_SubSetup_Init(void) 1061 | { 1062 | DISP_Clr(); 1063 | BUTTON_Reset(); 1064 | 1065 | MENU_var.sub.cursor =0; 1066 | MENU_var.sub.top=0; 1067 | MENU_var.sub.timeout =0; 1068 | MENU_var.sub.items = MENU_SUBSETUP_ITEMS; 1069 | MENU_var.sub.ptrMenu = ptrSubSetupMenu; 1070 | 1071 | MENU_Sub_Update(); 1072 | 1073 | } 1074 | 1075 | //-- MENU_Sub ------------------------------------------------------------------------------------------------- 1076 | 1077 | 1078 | static void MENU_SubTop_Init(void) 1079 | { 1080 | DISP_Clr(); 1081 | BUTTON_Reset(); 1082 | 1083 | MENU_var.sub.cursor =0; 1084 | MENU_var.sub.top=0; 1085 | MENU_var.sub.timeout =0; 1086 | MENU_var.sub.items = MENU_SUBTOP_ITEMS; 1087 | MENU_var.sub.ptrMenu = ptrSubTopMenu; 1088 | 1089 | MENU_Sub_Update(); 1090 | 1091 | } 1092 | 1093 | 1094 | static void MENU_Sub_Update(void) 1095 | { 1096 | //Show 4 lines of the sub menu and highlight the current cursor item 1097 | uint8_t pos = MENU_var.sub.top; 1098 | 1099 | 1100 | for(uint8_t i = 0; i < 4; i++) 1101 | { 1102 | DISP_Str(DISP_COL_CENTER, i, MENU_var.sub.ptrMenu[pos]->title, (pos == MENU_var.sub.cursor)); 1103 | pos++; 1104 | } 1105 | } 1106 | 1107 | 1108 | 1109 | static void MENU_Sub_Run(void) 1110 | { 1111 | 1112 | //Timeout 1113 | MENU_var.sub.timeout++; 1114 | if(MENU_var.sub.timeout >= MENU_SUB_TIMEOUT) 1115 | { 1116 | MENU_Init(); 1117 | return; 1118 | } 1119 | 1120 | if(BUTTON_count == BUTTON_RELEASED) 1121 | { 1122 | MENU_var.sub.timeout=0; 1123 | 1124 | uint8_t cursor_pos = MENU_var.sub.cursor - MENU_var.sub.top; 1125 | 1126 | switch (cursor_pos) 1127 | { 1128 | //cursor in the 1st or in the 3rd line 1129 | case 0: 1130 | case 2: 1131 | MENU_var.sub.cursor++; 1132 | break; 1133 | 1134 | //cursor in the 2nd. line 1135 | case 1: 1136 | //Are more than 4 items ahead -> increase top position and cursor 1137 | //if not only move cursor to 3rd line 1138 | if((MENU_var.sub.top +4) < MENU_var.sub.items) 1139 | { 1140 | MENU_var.sub.top++; 1141 | } 1142 | MENU_var.sub.cursor++; 1143 | break; 1144 | 1145 | //cursor in the 4th line 1146 | //case 3: 1147 | default: 1148 | //Redraw menu from top 1149 | MENU_var.sub.top=0; 1150 | MENU_var.sub.cursor=0; 1151 | break; 1152 | } 1153 | 1154 | MENU_Sub_Update(); 1155 | 1156 | } 1157 | 1158 | if (BUTTON_count == BUTTON_LONG_PRESSED) 1159 | { 1160 | current_menu = MENU_var.sub.ptrMenu[MENU_var.sub.cursor]; 1161 | current_menu->Init(); 1162 | } 1163 | 1164 | 1165 | } 1166 | 1167 | //-- MENU_Load_Save_Memory ------------------------------------------------------------------------------------------------- 1168 | 1169 | static void MENU_Memory_Update(void) 1170 | { 1171 | char str_index[3] = "0:"; 1172 | uint8_t index; 1173 | union 1174 | { 1175 | tunemem_t tunemem; 1176 | uint8_t bytes[sizeof(tunemem_t) +1]; //make the union one byte longer 1177 | }memory; 1178 | 1179 | 1180 | 1181 | for(uint8_t i = 0; i < 3; i++) 1182 | { 1183 | index = MENU_var.memory.top + i; 1184 | str_index[0] = '0' + index; 1185 | DISP_Str(0, i+1,str_index,(index == MENU_var.memory.cursor)); 1186 | 1187 | //Load item from eeprom 1188 | EEPROM_Read((uint8_t)&ee_tunemem + (sizeof(tunemem_t) * index) , &memory, sizeof(tunemem_t)); 1189 | memory.bytes[sizeof(tunemem_t)] =0; //Terminat string 1190 | DISP_Str(2,i+1,memory.tunemem.str_name, (index == MENU_var.memory.cursor)); 1191 | } 1192 | } 1193 | 1194 | 1195 | static void MENU_Memory_Init(void) 1196 | { 1197 | MENU_var.memory.cursor =0; 1198 | MENU_var.memory.top=0; 1199 | MENU_var.memory.timeout =0; 1200 | MENU_Memory_Update(); 1201 | BUTTON_Reset(); 1202 | } 1203 | 1204 | static void MENU_MemoryLoad_Init(void) 1205 | { 1206 | DISP_Clr(); 1207 | DISP_Str(0,0,str_MENU_Load,0); 1208 | MENU_var.memory.save_mode =0; 1209 | MENU_Memory_Init(); 1210 | } 1211 | 1212 | static void MENU_MemorySave_Init(void) 1213 | { 1214 | DISP_Clr(); 1215 | DISP_Str(0,0,str_MENU_Save,0); 1216 | MENU_var.memory.save_mode =1; 1217 | MENU_Memory_Init(); 1218 | } 1219 | 1220 | 1221 | 1222 | 1223 | 1224 | static void MENU_Memory_Run(void) 1225 | { 1226 | 1227 | //Timeout 1228 | MENU_var.memory.timeout++; 1229 | if(MENU_var.memory.timeout >= MENU_MEMORY_TIMEOUT) 1230 | { 1231 | MENU_Init(); 1232 | return; 1233 | } 1234 | 1235 | if(BUTTON_count == BUTTON_RELEASED) 1236 | { 1237 | MENU_var.memory.timeout=0; 1238 | 1239 | uint8_t cursor_pos = MENU_var.memory.cursor - MENU_var.memory.top; 1240 | 1241 | switch (cursor_pos) 1242 | { 1243 | //cursor in the 1st or in the 3rd line 1244 | case 0: 1245 | MENU_var.memory.cursor++; 1246 | break; 1247 | 1248 | //cursor in the 2nd. line 1249 | case 1: 1250 | //Are more than 2 items ahead -> increase top position and cursor 1251 | //if not only move cursor to 3rd line 1252 | if((MENU_var.memory.top +3) < TUNEMEM_ITEMS) 1253 | { 1254 | MENU_var.memory.top++; 1255 | } 1256 | MENU_var.memory.cursor++; 1257 | break; 1258 | 1259 | //cursor in the 4th line 1260 | //case 3: 1261 | default: 1262 | //Redraw menu from top 1263 | MENU_var.memory.top=0; 1264 | MENU_var.memory.cursor=0; 1265 | break; 1266 | } 1267 | 1268 | MENU_Memory_Update(); 1269 | 1270 | } 1271 | 1272 | if (BUTTON_count == BUTTON_LONG_PRESSED) 1273 | { 1274 | if (MENU_var.memory.save_mode == TRUE) 1275 | { 1276 | if(MENU_var.memory.cursor == 0) //Startup 1277 | { 1278 | current_menu = &menuStartupSave; 1279 | 1280 | } 1281 | else 1282 | { 1283 | MENU_var.nameedit.mem_index = MENU_var.memory.cursor; 1284 | current_menu = &menuNameEdit; 1285 | } 1286 | 1287 | current_menu->Init(); 1288 | return; 1289 | } 1290 | else 1291 | { 1292 | //Load 1293 | tunemem_t tunemem; 1294 | EEPROM_Read((uint8_t) & ee_tunemem + (sizeof (tunemem_t) * MENU_var.memory.cursor) , &tunemem, sizeof (tunemem_t)); 1295 | UTILI_Set_LC_Relays(tunemem.relays); 1296 | MENU_Init(); 1297 | return; 1298 | } 1299 | } 1300 | 1301 | 1302 | } 1303 | 1304 | //-- MENU_NameEdit ------------------------------------------------------------------------------------------------- 1305 | 1306 | static void MENU_NameEdit_Update(void) 1307 | { 1308 | uint8_t i; 1309 | 1310 | 1311 | //name 1312 | for(i=0; i= (sizeof(NameEditChar)-1) ) 1341 | { 1342 | i=0; 1343 | } 1344 | DISP_Char(2+x,1,NameEditChar[i],0); 1345 | } 1346 | } 1347 | else //is cursor at save or ESC print empty line 1348 | { 1349 | DISP_Str(0, 1, str_SpaceLine,0); 1350 | } 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | DISP_Str(0,3,str_Save, (MENU_var.nameedit.cursor == TUNEMEM_STRLEN) ); 1358 | DISP_Str(7,3,str_Esc, (MENU_var.nameedit.cursor == TUNEMEM_STRLEN+1)); 1359 | } 1360 | 1361 | 1362 | static void MENU_NameEdit_Init(void) 1363 | { 1364 | 1365 | //print memory slot 1366 | char str_index[3] = "0:"; 1367 | str_index[0] = '0' + MENU_var.nameedit.mem_index; 1368 | DISP_Clr(); 1369 | DISP_Str(0, 0,str_index,0); 1370 | 1371 | EEPROM_Read((uint8_t)&ee_tunemem + (sizeof(tunemem_t) * MENU_var.nameedit.mem_index) , &MENU_var.nameedit.tunemem, sizeof(tunemem_t)); 1372 | MENU_var.nameedit.cursor=0; 1373 | MENU_var.nameedit.button_repeat_delay = BUTTON_LONG_REPEAT_DELAY_MAX; 1374 | BUTTON_Reset(); 1375 | MENU_NameEdit_Update(); 1376 | 1377 | } 1378 | 1379 | static void MENU_NameEdit_Run(void) 1380 | { 1381 | 1382 | if(BUTTON_count == BUTTON_IDLE) 1383 | { 1384 | MENU_var.nameedit.button_repeat_delay = BUTTON_LONG_REPEAT_DELAY_MAX; 1385 | } 1386 | 1387 | 1388 | if(BUTTON_count == BUTTON_RELEASED) 1389 | { 1390 | //move cursor 1391 | MENU_var.nameedit.cursor++; 1392 | if(MENU_var.nameedit.cursor > TUNEMEM_STRLEN+1) 1393 | { 1394 | MENU_var.nameedit.cursor=0; 1395 | } 1396 | MENU_NameEdit_Update(); 1397 | } 1398 | 1399 | if (BUTTON_count == BUTTON_LONG_PRESSED) 1400 | { 1401 | BUTTON_count -= MENU_var.nameedit.button_repeat_delay; 1402 | 1403 | if(MENU_var.nameedit.button_repeat_delay > BUTTON_LONG_REPEAT_DELAY_MIN) 1404 | { 1405 | MENU_var.nameedit.button_repeat_delay -= BUTTON_LONG_REPEAT_DELAY_STEP; 1406 | } 1407 | 1408 | 1409 | if(MENU_var.nameedit.cursor < TUNEMEM_STRLEN) 1410 | { 1411 | 1412 | char c = MENU_var.nameedit.tunemem.str_name[MENU_var.nameedit.cursor]; 1413 | 1414 | uint8_t i=0; 1415 | while( (c != NameEditChar[i]) && (i= (sizeof(NameEditChar)-1) ) 1421 | { 1422 | i=0; 1423 | } 1424 | MENU_var.nameedit.tunemem.str_name[MENU_var.nameedit.cursor] = NameEditChar[i]; 1425 | 1426 | MENU_NameEdit_Update(); 1427 | } 1428 | 1429 | 1430 | 1431 | //Save 1432 | if(MENU_var.nameedit.cursor == TUNEMEM_STRLEN) 1433 | { 1434 | MENU_var.nameedit.tunemem.relays = UTILI_Get_LC_Relays(); //Save current relais 1435 | EEPROM_Write((uint8_t)ee_tunemem + (sizeof(tunemem_t) * MENU_var.nameedit.mem_index) , &MENU_var.nameedit.tunemem, sizeof(tunemem_t)); 1436 | MENU_Init(); 1437 | return; 1438 | } 1439 | 1440 | //Esc 1441 | if(MENU_var.nameedit.cursor == TUNEMEM_STRLEN+1) 1442 | { 1443 | MENU_Init(); 1444 | return; 1445 | } 1446 | 1447 | 1448 | } 1449 | } 1450 | 1451 | 1452 | 1453 | //-- MENU_StartupSave ------------------------------------------------------------------------------------------------- 1454 | 1455 | static void MENU_StartupSave_Update(void) 1456 | { 1457 | DISP_Str(0,3,str_Save, (MENU_var.startupsave.cursor == 0)); 1458 | DISP_Str(7,3,str_Esc, (MENU_var.startupsave.cursor == 1)); 1459 | } 1460 | 1461 | 1462 | static void MENU_StartupSave_Init(void) 1463 | { 1464 | DISP_Clr(); 1465 | char str_index[3] = "0:"; 1466 | DISP_Str(0, 1,str_index,0); 1467 | 1468 | EEPROM_Read((uint8_t)&ee_tunemem , &MENU_var.startupsave.tunemem, sizeof(tunemem_t)); 1469 | MENU_var.startupsave.str_terminate=0; //Terminat string 1470 | DISP_Str(2, 1,MENU_var.startupsave.tunemem.str_name, 0); 1471 | 1472 | MENU_var.startupsave.cursor=0; 1473 | BUTTON_Reset(); 1474 | MENU_StartupSave_Update(); 1475 | } 1476 | 1477 | static void MENU_StartupSave_Run(void) 1478 | { 1479 | if(BUTTON_count == BUTTON_RELEASED) 1480 | { 1481 | //move cursor 1482 | MENU_var.startupsave.cursor++; 1483 | if(MENU_var.startupsave.cursor > 1) 1484 | { 1485 | MENU_var.startupsave.cursor=0; 1486 | } 1487 | MENU_StartupSave_Update(); 1488 | } 1489 | 1490 | if (BUTTON_count == BUTTON_LONG_PRESSED) 1491 | { 1492 | //Save 1493 | if(MENU_var.startupsave.cursor == 0) 1494 | { 1495 | MENU_var.startupsave.tunemem.relays = UTILI_Get_LC_Relays(); //Save current relais 1496 | EEPROM_Write((uint8_t)ee_tunemem , &MENU_var.startupsave.tunemem, sizeof(tunemem_t)); 1497 | } 1498 | 1499 | MENU_Init(); 1500 | return; 1501 | } 1502 | } 1503 | 1504 | 1505 | 1506 | //-- MENU About -------------------------------------------------------------------------------------------- 1507 | 1508 | static void MENU_About_Init(void) 1509 | { 1510 | DISP_Clr(); 1511 | DISP_Str(DISP_COL_CENTER,0,str_Hardware,0); 1512 | DISP_Str(DISP_COL_CENTER,1,str_designed,0); 1513 | DISP_Str(DISP_COL_CENTER,2,str_by,0); 1514 | DISP_Str(DISP_COL_CENTER,3,str_N7DCC,0); 1515 | BUTTON_Reset(); 1516 | MENU_var.about.step=0; 1517 | } 1518 | 1519 | static void MENU_About_Run(void) 1520 | { 1521 | 1522 | if(BUTTON_count == BUTTON_SHORT_PRESSED) 1523 | { 1524 | if(MENU_var.about.step ==0) 1525 | { 1526 | MENU_var.about.step++; 1527 | DISP_Clr(); 1528 | DISP_Str(DISP_COL_CENTER,0,str_YetAnother,0); 1529 | DISP_Str(DISP_COL_CENTER,1,str_Firmware,0); 1530 | DISP_Str(DISP_COL_CENTER,2,str_by,0); 1531 | DISP_Str(DISP_COL_CENTER,3,str_DG4SN,0); 1532 | } 1533 | else 1534 | { 1535 | MENU_Init(); 1536 | return; 1537 | } 1538 | } 1539 | } 1540 | 1541 | 1542 | //-- MENU ------------------------------------------------------------------------------------------------- 1543 | void MENU_Init(void) 1544 | { 1545 | current_menu = (menu_t*) & menuMain; 1546 | MENU_Main_Init(); 1547 | } 1548 | 1549 | void MENU_Run(void) 1550 | { 1551 | if(current_menu->Run != NULL) 1552 | { 1553 | current_menu->Run(); 1554 | } 1555 | } 1556 | 1557 | -------------------------------------------------------------------------------- /dist/ATU-100_YAF_0V68.hex: -------------------------------------------------------------------------------- 1 | :040000008031132810 2 | :100008007E1480312000911C0A280B281128911099 3 | :100018000130F00070082100B9077E100900803116 4 | :10002800152865308400A5308500E530860000304D 5 | :1000380087000B308731F9278031DB308400A73007 6 | :100048008500483086000130870025308731F92740 7 | :100058008031FC015D308400003085000930A53115 8 | :100068004E258031A0308400003085004530A53110 9 | :100078004E25803120308400013085002830A5319C 10 | :100088004E2580317E102000913136290330200022 11 | :100098006206031950285128FE2B05306206031DFD 12 | :1000A800562857285828FE2B2100310803195D28A7 13 | :1000B8005E2861280130B102FE2B9D3193258031E5 14 | :1000C8009031342080312100320803196C286D28C2 15 | :1000D800E62B3B08803A2000BD0080303D02031D1E 16 | :1000E80078280A3021003A0203187B287C28E62B5E 17 | :1000F80004302000BD003D08E200FE2B21003B0833 18 | :10010800803A2000BD0080303D02031D8E280A3051 19 | :1001180021003A02031C91289228FE2B0A30200065 20 | :10012800BD003D082100B20002302000BD003D089E 21 | :10013800E200E7302100AA000330AB00E730A80056 22 | :100148000330A900E730A6000330A700FC01200017 23 | :10015800E1010230BD003D082100B100FE2B210065 24 | :100168003F08803A2000BD0021003D08803A200069 25 | :100178003D02031DC22821003C083E02031CC5287D 26 | :10018800C628CC2805302000BD003D08E200FE2B23 27 | :1001980021003D08803A2000BD0021002908803A4E 28 | :1001A80020003D02031DDB28210028083C0203181B 29 | :1001B800DE28DF28E42821003D08A9003C08A80023 30 | :1001C80021003D08803A2000BD0021002B08803A1C 31 | :1001D80020003D02031DF32821002A083C020318D1 32 | :1001E800F628F7280C2921003D08AB003C08AA0096 33 | :1001F80020006108BD003D08E0007C08BD003D0806 34 | :10020800DF00210055082000BD003D082100B00096 35 | :1002180001302000BD003D08E1070B3061020318E2 36 | :10022800162917293F291430F1000030F200210067 37 | :100238002908F4002808F3009E314A26803121005D 38 | :10024800280871072000BD0021002908723D200000 39 | :10025800BE003E08803ABF0021003D08803A2000D9 40 | :100268003F02031D3B2921003C0820003D020318E2 41 | :100278003E293F29A5292000E1010130BD003D08A4 42 | :10028800FC071430F1000030F20021002708F400C8 43 | :100298002608F3009E314A2680312100260871077E 44 | :1002A8002000BD0021002708723D2000BE003E0846 45 | :1002B800803ABF0021002908803A20003F02031D30 46 | :1002C80069292100280820003D0203186C296D299E 47 | :1002D800892921005503031D722973297A291430AD 48 | :1002E8002000BD003D082100B200FE2BD501D50A33 49 | :1002F8002000E101FC01E7302100A8000330A9003B 50 | :10030800E730A6000330A7008E2921002908A7009E 51 | :100318002808A600E730A8000330A9000B307C02AB 52 | :10032800031C97299829A529FC01E730A800033068 53 | :10033800A9005503031DA129A229A3297329D501C1 54 | :10034800D50A20006108273E8400A8300318013E22 55 | :1003580085000008BD003D082100D6007C081C3E31 56 | :100368008400A8300318013E850000082000BD0065 57 | :100378003D082100D7009031B420803102302000A0 58 | :10038800BD003D082100B100FE2B210030082000EF 59 | :10039800BD003D082100D50020006008273E8400EC 60 | :1003A800A8300318013E85000008BD003D08210063 61 | :1003B800D60020005F081C3E8400A8300318013EC8 62 | :1003C80085000008BD003D082100D7002000600816 63 | :1003D800273E8400A8300318013E85000008BD00B0 64 | :1003E8003D082100A40020005F081C3E8400A830BE 65 | :1003F8000318013E85000008BD003D082100A1004A 66 | :10040800200060080319092A0A2A232A6008263EC0 67 | :100418008400A8300318013E85000008BD0060086C 68 | :10042800273E8400A8300318013E85000008BE005E 69 | :100438003D083E02BF003F082100AF00252A2100E9 70 | :10044800AF010A302000600203182B2A2C2A452A03 71 | :100458006008273E8400A8300318013E8500000884 72 | :10046800BD006008283E8400A8300318013E8500BE 73 | :100478000008BE003D083E02BF003F082100AE0054 74 | :10048800472A2100AE0120005F0803194C2A4D2A93 75 | :10049800662A5F081B3E8400A8300318013E8500C9 76 | :1004A8000008BD005F081C3E8400A8300318013E08 77 | :1004B80085000008BE003D083E02BF003F0821003D 78 | :1004C800AD00682A2100AD010A3020005F02031840 79 | :1004D8006E2A6F2A882A5F081C3E8400A8300318F9 80 | :1004E800013E85000008BD005F081D3E8400A8305D 81 | :1004F8000318013E85000008BE003D083E02BF000B 82 | :100508003F082100AC008A2A2100AC010230F1002A 83 | :100518000030F2002F082000BD00BE013D08F300A6 84 | :100528003E08F4009E314A26803171082000BF0041 85 | :100538003F082100AF000230F1000030F2002E0821 86 | :100548002000BD00BE013D08F3003E08F4009E31C6 87 | :100558004A26803171082000BF003F082100AE0004 88 | :100568000230F1000030F2002D082000BD00BE016D 89 | :100578003D08F3003E08F4009E314A268031710898 90 | :100588002000BF003F082100AD000230F10000301C 91 | :10059800F2002C082000BD00BE013D08F3003E0813 92 | :1005A800F4009E314A26803171082000BF003F08C0 93 | :1005B8002100AC002F0824022000BD003D082100C6 94 | :1005C800A30024082E072000BD003D082100A50037 95 | :1005D8002D0821022000BD003D082100A0002108AF 96 | :1005E8002C072000BD003D082100A200E730AA002A 97 | :1005F8000330AB002000E101E10AFC01FC0A210004 98 | :1006080024082000BD003D082100D6002108200054 99 | :10061800BD003D082100D7009031B4208031023060 100 | :100628002000BD003D082100B1001E302000BD00A3 101 | :100638003D082100B200FE2B21003F08803A20002F 102 | :10064800BD0021003D08803A20003D02031D2F2BEC 103 | :1006580021003C083E02031C322B332B342BC628C6 104 | :1006680021003D08803A2000BD0021002B08803A77 105 | :1006780020003D02031D432B21002A083C020318D9 106 | :10068800462B472B552B21003D08AB003C08AA0000 107 | :1006980020006108BD003D08E0007C08BD003D0861 108 | :1006A800DF0020006103031D5A2B5B2B712B2100F7 109 | :1006B800240823060319612B622B652B2000E10116 110 | :1006C800AB2B2508240603196A2B6B2B712B0230E0 111 | :1006D8002000BD003D08E100AB2B20006108031D90 112 | :1006E800762B772B7F2B21002508240603197D2BD9 113 | :1006F8007E2B7F2B6B2B2000E101E10A7C03031D7D 114 | :10070800862B872B972B21002108200603198D2B78 115 | :100718008E2B902BFC01AB2B220821060319952B5D 116 | :10072800962B972B6B2B7C08031D9B2B9C2BA92BA3 117 | :100738002100220821060319A22BA32BA92B023082 118 | :100748002000BD003D08FC00AB2BFC01FC0A20008A 119 | :100758006103031DB02BB12BCD2B7C03031DB52BDF 120 | :10076800B62BCD2B6008A33E860087010108BD008B 121 | :100778003D082100D60020005F08A03E86008701C2 122 | :100788000108BD003D082100D7009031B420803118 123 | :10079800C6286108A33E860087010108BD003D0800 124 | :1007A8002100D6007C08A03E8600870101082000B1 125 | :1007B800BD003D082100D700BF290330BD003D081A 126 | :1007C800E200FE2B210032082000BD00BE013E08D9 127 | :1007D800003A0319F02BE12B3D08003A031982284F 128 | :1007E8000A3A0319B3281E3A0319C9290A3A031900 129 | :1007F800202BE12B0800003400340034003400348E 130 | :10080800003400345F3400340034003407340034DA 131 | :100818000734003414347F3414347F3414342434CB 132 | :100828002A347F342A341234233413340834643499 133 | :100838006234363449345534223450340034053463 134 | :1008480003340034003400341C342234413400347E 135 | :100858000034413422341C34003408342A341C3423 136 | :100868002A340834083408343E3408340834003450 137 | :100878005034303400340034083408340834083430 138 | :100888000834003430343034003400342034103428 139 | :100898000834043402343E345134493445343E3447 140 | :1008A800003442347F3440340034423461345134AB 141 | :1008B800493446342134413445344B3431341834C6 142 | :1008C800143412347F3410342734453445344534D5 143 | :1008D80039343C344A34493449343034013471347D 144 | :1008E8000934053403343634493449344934363408 145 | :1008F80006344934493429341E3400343634363405 146 | :1009080000340034003456343634003400340034B3 147 | :100918000834143422344134143414341434143460 148 | :100928001434413422341434083400340234013489 149 | :1009380051340934063432344934793441343E343C 150 | :100948007E341134113411347E347F3449344934BF 151 | :10095800493436343E3441344134413422347F34CE 152 | :100968004134413422341C347F34493449344934C5 153 | :1009780041347F3409340934013401343E3441347C 154 | :100988004134513432347F340834083408347F34E5 155 | :10099800003441347F34413400342034403441340D 156 | :1009A8003F3401347F3408341434223441347F34E2 157 | :1009B80040344034403440347F3402340434023408 158 | :1009C8007F347F340434083410347F343E34413467 159 | :1009D800413441343E347F3409340934093406340F 160 | :1009E8003E344134513421345E347F34093419346F 161 | :1009F800293446344634493449344934313401348D 162 | :100A080001347F34013401343F34403440344034BD 163 | :100A18003F341F342034403420341F347F34203492 164 | :100A2800183420347F346334143408341434633471 165 | :100A3800033404347834043403346134513449348D 166 | :100A480045344334003400347F3441344134023473 167 | :100A58000434083410342034413441347F340034B1 168 | :100A68000034043402340134023404344034403451 169 | :100A78004034403440340034013402340434003407 170 | :100A8800203454345434543478347F34483444341F 171 | :100A980044343834383444344434443420343834D6 172 | :100AA8004434443448347F3438345434543454341B 173 | :100AB800183408347E3409340134023408341434C8 174 | :100AC800543454343C347F34083404340434783493 175 | :100AD800003444347D3440340034203440344434C9 176 | :100AE8003D34003400347F34103428344434003426 177 | :100AF80041347F34403400347C34043418340434B2 178 | :100B080078347C3408340434043478343834443445 179 | :100B18004434443438347C341434143414340834AD 180 | :100B280008341434143418347C347C3408340434D1 181 | :100B38000434083448345434543454342034043499 182 | :100B48003F344434403420343C344034403420343E 183 | :100B58007C341C342034403420341C343C3440343D 184 | :100B6800303440343C344434283410342834443449 185 | :100B78000C345034503450343C3444346434543499 186 | :100B88004C344434003408343634413400340034AE 187 | :100B980000347F34003400340034413436340834AF 188 | :100BA8000034083408342A341C34083408341C341B 189 | :100BB8002A3408340834FB3020006406031DE52D70 190 | :100BC800E62DF12D21005808013A2000C9004908F6 191 | :100BD8002100D8009F3189278531503020006406D4 192 | :100BE800031DF72DF82D672E2830E4022100580840 193 | :100BF800031DFF2D002E632E023059020318052E07 194 | :100C0800062E632E5935DA3E86008701403F2000C4 195 | :100C1800D300413FD4005408803AC90080304902CB 196 | :100C2800031D182E6430530203181B2E1C2E222E6F 197 | :100C380005302000D3070030D43D272E3230200065 198 | :100C4800D3070030D43D21005908031D2C2E2D2E2A 199 | :100C58003F2E20005408803AC90080304902031D05 200 | :100C6800372E65305302031C3A2E3B2E552E20009A 201 | :100C7800D301D401552E20005408803AC90083308E 202 | :100C88004902031D492EE9305302031C4C2E4D2EF8 203 | :100C9800552E21005B082000D40021005A082000AE 204 | :100CA800D30021005935DA3E860087012000530819 205 | :100CB800C03F5408C13F9F3189278531672EA53130 206 | :100CC8005C258531972F02302100590203186D2EBB 207 | :100CD8006E2EA62E5408803A2000C90080304902A2 208 | :100CE800031D792E653021005302031C7C2E7D2EB6 209 | :100CF800922F210063085406031D842E62085306B0 210 | :100D0800031D872E882E922F5935DE3E86008701D7 211 | :100D18005308C03F5408C13F983104208531200052 212 | :100D2800A001A00AED30A100A930A200A3018030E3 213 | :100D38008E317E26853102302000C9004908210005 214 | :100D4800D907922F5408803A2000C9008030490200 215 | :100D5800031DB12E0530210053020318B42EB52E01 216 | :100D6800922F01302100D9025903031DBC2EBD2E3C 217 | :100D7800C42E9831042085319F3189278531922FDF 218 | :100D88005B08CA005A08C9005D08CC005C08CB00A3 219 | :100D98004A082000B300210049082000B20095311C 220 | :100DA8004125853120003308D2003208D1002100C6 221 | :100DB8004C082000B30021004B082000B2009531F8 222 | :100DC8004125853120003308D0003208CF00063095 223 | :100DD800D83E860087010830D83E84008501403F10 224 | :100DE8000002A4000131413F003BA500A601A51B5C 225 | :100DF800A6032608A70051084F02C9005208503B15 226 | :100E0800CA004908CB004A08CC000030CC1BFF3090 227 | :100E1800CD00CE000C30CB35CC0DCD0DCE0D890BD1 228 | :100E28000F2F4E08AB004D08AA004C08A9004B082C 229 | :100E3800A8009231D3228531200025082100D00056 230 | :100E4800200024082100CF0000302000A700003037 231 | :100E5800A6001030A5000030A40021004F08F100C2 232 | :100E68005008F200890D893B8909F300F4005E08F7 233 | :100E7800F5005F08F600890D893B8909F700F8003D 234 | :100E88009931D621853174082000AB007308AA0077 235 | :100E98007208A9007108A8009231D3228531200078 236 | :100EA800240851022100CD0020002508523B2100D2 237 | :100EB800CE00C9302000C9004908F5000230CA0038 238 | :100EC8004A08F6006A30A73195278531CB302000D3 239 | :100ED800C9004908F5000230CA004A08F60068301F 240 | :100EE800A73195278531CD302000C9004908F50084 241 | :100EF8000230CA004A08F6006630A73195278531C6 242 | :100F0800CF302000C9004908F5000230CA004A085D 243 | :100F1800F6006430A73195278531632E21005408E7 244 | :100F2800E3005308E20008002000BE00BF01BF0A2A 245 | :100F38003A08803ABC0080303C02031DA52F64307B 246 | :100F48003902031CA82FA92FBB2F0A30F10000304B 247 | :100F5800F20020003A08F4003908F3009E314A26CE 248 | :100F6800873172082000BA007108B900BF0120005B 249 | :100F78003A08A1003908A0004030BC003C08A20093 250 | :100F88000430BD003D08A3008831002087312000CF 251 | :100F98003F080319D02FD12FE32F4108BC003C088C 252 | :100FA800C00020304006031DDA2FDB2FDF2F303042 253 | :100FB800BC003C08C0002E30BC003C08C1005730C3 254 | :100FC800BC003C08C300C4013808BC003C08A000B1 255 | :100FD8004030A1000030A2003B08BD003D08A3003E 256 | :100FE8003E088E317E2687310800FE0012001E0062 257 | :060FF800FE0BFA2F00348D 258 | :101000002000A40102302302031807280828092819 259 | :101010008A282308FF3EFA007A08A500220825073F 260 | :10102000FA007A08A6002608860087018101A11F20 261 | :101030001A281B282228A401A40AA009A109A00A91 262 | :101040000319A10A0130A5020130A6022108803A45 263 | :10105000FA0080307A02031D2F2801302002031C81 264 | :101060003228332859280A30F1000030F2002000DD 265 | :101070002108F4002008F3009D31402588317108D3 266 | :10108000303EFA0020002608860087017A08810099 267 | :101090000A30F1000030F2002108F4002008F300CB 268 | :1010A0009E314A26883172082000A1007108A000F4 269 | :1010B000852820002308FE3EFA00FF300318003088 270 | :1010C000FB0025087A067B04031D67286828702822 271 | :1010D0003030FA002608860087017A0881008528CA 272 | :1010E00024080319742875287E282D30FA00260854 273 | :1010F000860087017A088100A40185282030FA0043 274 | :101100002608860087017A0881002508031D8928A2 275 | :101110008A282228080002302000C5004508D20095 276 | :101120000330C5004508D300B80121003B0820006A 277 | :10113000BA0021003A082000B900BB010430873111 278 | :10114000982788312000B801B80A21003D08200006 279 | :10115000BA0021003C082000B900BB0104309C31DA 280 | :10116000AD248831210055080319B728B828C128B3 281 | :1011700003302000C5004508D2000230C5004508F4 282 | :10118000D30021004603031DC628C728D7280330F3 283 | :101190002000C5004508A000F630A100A830A2003C 284 | :1011A000A301A30A00308E317E2688312129200038 285 | :1011B0005208C5004508A000F030A100A930A200E7 286 | :1011C000A30100308E317E26883107302000C50013 287 | :1011D0004508A7004B309A310C2288312000520874 288 | :1011E000C5004508A0004B30A1000030A200A301BB 289 | :1011F00002308E317E26883120005308C500450814 290 | :10120000A000F330A100A930A200A30100308E316C 291 | :101210007E26883107302000C5004508A7004B30E6 292 | :101220009A314322883120005308C5004508A000A8 293 | :101230004B30A1000030A200A30102308E317E2687 294 | :10124000883121004203031D2629272955294603F9 295 | :1012500003192B292C295529CA302000C900A9308F 296 | :10126000CA00D4015408C5004508B8004A08C700A0 297 | :101270004908C60054084607840047080318470A6F 298 | :1012800085000008C8004808B900BA010930A63135 299 | :10129000B426883101302000C5004508D407043049 300 | :1012A0005402031C54295529322908002000C20188 301 | :1012B000B8014208DD3E860087010108BE003E08F5 302 | :1012C000B9002100590820004206031968296A293B 303 | :1012D00001306B290030BF003F08BA004208023ECF 304 | :1012E000A631B426893101302000BE003E08C20775 305 | :1012F00008304202031C7D297E295829083021002C 306 | :101300005902031884298529E0295908DD3E860001 307 | :10131000870101082000BE003E08C000C2019429D8 308 | :101320000130BE003E08C2074208003E8400A030E3 309 | :101330000318013E8500000840060319A029A129D1 310 | :10134000A72949304202031CA629A7299029B801E0 311 | :10135000B80A4008BE003E08B900BA01BA0A023015 312 | :10136000A631B42689312000C101C10A0130BE0076 313 | :101370003E08C20748304202031CBF29C029C129C8 314 | :10138000C201B801B80A4208003E8400A030031828 315 | :10139000013E85000008BE003E08B900BA014108C0 316 | :1013A000023EA631B426893101302000BE003E083D 317 | :1013B000C10708304102031CDE29DF29B629EC29C8 318 | :1013C0002000A001A00A6930A100A830A200A3015A 319 | :1013D00000308E317E26893103302000BE003E0869 320 | :1013E000A000BB30A100A930A2000830210059069E 321 | :1013F0000319FB29FD290130FE2900302000BF0020 322 | :101400003F08A30000308E317E2689310330200052 323 | :10141000BE003E08A000E130A100A930A2000930C2 324 | :10142000210059060319152A172A0130182A0030FD 325 | :101430002000BF003F08A30007308E317E2689318F 326 | :101440000800210058082000B8003808C500C30172 327 | :10145000C30A0230B8003808C40021005508031937 328 | :10146000322A332A3A2A02302000B8003808C30052 329 | :10147000C401C40A20004308B8003808A000F030B6 330 | :10148000A100A930A200A30100308E317E268A314E 331 | :1014900007302000B8003808A7003C309A310C22F1 332 | :1014A0008A3120004308B8003808A0003C30A10071 333 | :1014B0000030A2004308FF3EB900FF30031800309F 334 | :1014C000BA00450839063A040319672A692A013027 335 | :1014D0006A2A0030BB003B08A30004308E317E2610 336 | :1014E0008A3120004408B8003808A000F330A10079 337 | :1014F000A930A200A30100308E317E268A31073048 338 | :101500002000B8003808A7003C309A3143228A31C5 339 | :1015100020004408B8003808A0003C30A10000308A 340 | :10152000A2004408FF3EB900FF3003180030BA00A3 341 | :10153000450839063A0403199E2AA02A0130A12A37 342 | :101540000030BB003B08A30004308E317E268A3178 343 | :1015500021005508031DAD2AAE2AC72A03302000FA 344 | :10156000B8003808A000D430A100A930A200023091 345 | :1015700045060319BC2ABE2A0130BF2A0030B90033 346 | :101580003908A30000308E317E268A31DF2A0330ED 347 | :101590002000B8003808A000CF30A100A930A20078 348 | :1015A000023045060319D52AD72A0130D82A00303F 349 | :1015B000B9003908A30000308E317E268A3103300D 350 | :1015C0002000B8003808A000E130A100A930A20036 351 | :1015D000033045060319ED2AEF2A0130F02A0030C6 352 | :1015E000B9003908A30007308E317E268A31080001 353 | :1015F00000302000BB000030BA000030B9000030DD 354 | :10160000B8000030BF000030BE000030BD00003028 355 | :10161000BC00C101C0010130B2003208C107413530 356 | :10162000343E860001308700403FB200413FB300A6 357 | :101630004035343E8600013087003208C03F330811 358 | :10164000C13F3208B4003308B5000030B51BFF308D 359 | :10165000B600B7003408B8073508B93D3608BA3DBA 360 | :101660003708BB3D4135203E860001308700403FB2 361 | :10167000B200413FB3004035203E86000130870074 362 | :101680003208C03F3308C13F3208B4003308B50008 363 | :101690000030B51BFF30B600B7003408BC07350872 364 | :1016A000BD3D3608BE3D3708BF3D0130B2003208AF 365 | :1016B000C00709304002031C5E2B5F2B0B2B01304F 366 | :1016C0009A317A228A3120004135343E8600013039 367 | :1016D00087007108C03F7208C13F7108B2007208EC 368 | :1016E000B3000030B31BFF30B400B5003208B807B8 369 | :1016F0003308B93D3408BA3D3508BB3D00309A3156 370 | :101700007A228A3120004135203E86000130870050 371 | :101710007108C03F7208C13F7108B2007208B3007F 372 | :101720000030B31BFF30B400B5003208BC073308EB 373 | :10173000BD3D3408BE3D3508BF3D0030A700003038 374 | :10174000A6000030A5000A30A4003B08AB003A0810 375 | :10175000AA003908A9003808A8009231D3228A319A 376 | :10176000200025082100D400200024082100D300F7 377 | :1017700000302000A7000030A6000030A5000A308D 378 | :10178000A4003F08AB003E08AA003D08A9003C08A1 379 | :10179000A8009231D3228A31200025082100D200EE 380 | :1017A000200024082100D100080001302000C600DC 381 | :1017B00046082100DB070A305B06031DE02BE12B06 382 | :1017C000062CDB019D3193258B31903134208B31F8 383 | :1017D0002000B80121003D082000BA0021003C088B 384 | :1017E0002000B900BB0100309C31AD248B312000BA 385 | :1017F000B80121003B082000BA0021003A0820006F 386 | :10180000B900BB010630873198278B31FB302000AF 387 | :101810006406031D0C2C0D2C1C2C0130C600460840 388 | :101820002100D80704305802031C172C182C192C3F 389 | :10183000D8018A3121228B31503020006406031DEB 390 | :10184000222C232C982C2830E40221005508031D5B 391 | :101850002A2C2B2C302C580803192F2C302C3A2CE6 392 | :1018600055080319342C352C492C5803031D392CE9 393 | :101870003A2C492C5608031D3E2C3F2C422CD601F5 394 | :10188000D60A492C56357F392000C600460821006B 395 | :10189000D6005508031D4D2C4E2C532C580303190C 396 | :1018A000522C532C5D2C55080319572C582C6C2C9A 397 | :1018B0005808031D5C2C5D2C6C2C5708031D612CF3 398 | :1018C000622C652CD701D70A6C2C57357F39200044 399 | :1018D000C60046082100D70002305806031D712CAF 400 | :1018E000722C802C5508031D762C772C7A2CD50170 401 | :1018F000D50A7B2CD501FF302000C6004608E40045 402 | :10190000033021005806031D862C872C922C5A0880 403 | :10191000F4005908F300A6319C268B31A5315C25D3 404 | :101920008B311A2D8A3121228B319031B4208B31A9 405 | :101930002000C70121005508031D9F2CA02CA52CB9 406 | :1019400058080319A42CA52CAF2C55080319A92C51 407 | :10195000AA2CD42C5803031DAE2CAF2CD42C34034A 408 | :10196000031DB32CB42CBE2C56080319B82CB92C6B 409 | :10197000BB2C0130D6022000C701C70A2000630338 410 | :10198000031DC32CC42CD42C7F3021005602031815 411 | :10199000CA2CCB2CD12C01302000C60046082100D7 412 | :1019A000D6072000C701C70A21005508031DD92CFE 413 | :1019B000DA2CDF2C58030319DE2CDF2CE92C550818 414 | :1019C0000319E32CE42C0E2D5808031DE82CE92CF8 415 | :1019D0000E2D3403031DED2CEE2CF82C57080319A3 416 | :1019E000F22CF32CF52C0130D7022000C701C70AD6 417 | :1019F00020006303031DFD2CFE2C0E2D7F302100E3 418 | :101A000057020318042D052D0B2D01302000C600B0 419 | :101A100046082100D7072000C701C70A2000470851 420 | :101A20000319132D142D1A2D9031B4208B318A31C6 421 | :101A300021228B3108009D3193258D319031342046 422 | :101A40008D3121003B08803A2000D50080305502BE 423 | :101A5000031D2D2D053021003A02031C302D312DA0 424 | :101A6000472D21004303031D362D372D472D4508F3 425 | :101A70005C06031D3D2D44085B06031D402D412DD2 426 | :101A8000442DA53170258D312100DB01DC012100C1 427 | :101A90004303031D4C2D4D2D952D46030319512D48 428 | :101AA000522D952D5C08803A2000D5002100450874 429 | :101AB000803A20005502031D602D210044085B027E 430 | :101AC0000318632D642D952D01302000D500550895 431 | :101AD0002100DD0764305D06031D6F2D702D952DEF 432 | :101AE000DD010130DB070030DC3D45085C06031DED 433 | :101AF0007B2D44085B06031D7E2D7F2D952D98318F 434 | :101B000004208D312000A001A00AED30A100A830F2 435 | :101B1000A200A30180308E317E268D310030F3008B 436 | :101B2000F400A6319C268D31952D21005C08803A69 437 | :101B30002000D50021004508803A20005502031DF1 438 | :101B4000A42D210044085B02031CA72DA82DAE2D57 439 | :101B5000210043030319AD2DAE2D742E013020005A 440 | :101B6000D50055082100D8070A305806031DB92DA5 441 | :101B7000BA2DD92DD8013B08803A2000D5008030FD 442 | :101B80005502031DC62D013021003A020318C92D4C 443 | :101B9000CA2DD12D210059085A040319D02DD12D59 444 | :101BA000D92D21003B08DA003A08D90088318B2072 445 | :101BB0008D3121004203031DDE2DDF2D1B2E460338 446 | :101BC0000319E32DE42D1B2E3B08803A2000D5009D 447 | :101BD00080305502031DEF2D013021003A02031C15 448 | :101BE000F22DF32D1B2E21003D08803A2000D50058 449 | :101BF00021004108803A20005502031D022E2100D9 450 | :101C000040083C02031C052E062E1B2E3D302000F2 451 | :101C1000DD00A930DE005E08D6005D08D500023088 452 | :101C20005507840056080318560A8500013F8A00AC 453 | :101C3000003F0A008E31FB3020006406031D212E78 454 | :101C4000222E472E21004603031D272E282E312E3B 455 | :101C5000C6014808F4004708F300A6319C268D31E0 456 | :101C6000362E3D302000DD00A930DE0020005E0869 457 | :101C7000D6005D08D50002305507840056080318C9 458 | :101C8000560A8500013F8A00003F0A008E3150301D 459 | :101C900020006406031D4D2E4E2E7D2E210046038E 460 | :101CA000031D532E542E5D2EC6014808F40047082C 461 | :101CB000F300A6319C268D31622E7F302000DD009E 462 | :101CC000A930DE0020005E08D6005D08D500023095 463 | :101CD0005507840056080318560A8500013F8A00FC 464 | :101CE000003F0A008E317D2E20006403031D792EF3 465 | :101CF0007A2E7D2EA53170258D3108002000AB0095 466 | :101D000023080319842E852E8A2EFF30A400240870 467 | :101D1000B3008B2EB3012035A4002408AC00803022 468 | :101D20002B06031D942E952ECD2EB0012208B50052 469 | :101D30002108B400A32E0130A4002408B00701300C 470 | :101D4000B4070030B53D3408840035088500120022 471 | :101D5000031DAB2EAC2E9B2E0C30A4002408F100EA 472 | :101D60003008A63104268E312000A5002508B000D9 473 | :101D70000230F1000030F2008030A400300824026C 474 | :101D8000F300F401031CF4039E314A268E317108DE 475 | :101D90002000A5002508AF00D92E0C30A40024088F 476 | :101DA000F1002B08A63104268E312000A50025085D 477 | :101DB000AF002F08A4002408F4002C089831D92083 478 | :101DC0008E3120002208B5002108B400612F3408AC 479 | :101DD0008400350885000008E03EF100FF3003185C 480 | :101DE0000030F2000530F3000030F400A731352751 481 | :101DF0008E3172082000AE007108AD00B1013108CB 482 | :101E0000A400A501FF30A6008330A7002408260700 483 | :101E1000A8002508273DA90028082D0784002908C7 484 | :101E20002E3D85000008AA002A08B700B613B71D8A 485 | :101E30001A2FB61720003613371D1F2F3617200014 486 | :101E4000B612371D242FB61620003612B71C292FC4 487 | :101E500036162000B611B71C2E2FB61520003611ED 488 | :101E6000371C332F36152000B610371C382FB61408 489 | :101E70002000361036083306A4002408B6003608C1 490 | :101E80009A31B3228E31200036089A31B3228E3136 491 | :101E900001302000A4002408B10705303102031CE2 492 | :101EA000522F532FFF2E33089A31B3228E31200048 493 | :101EB00033089A31B3228E3101302000B40700304C 494 | :101EC000B53D34088400350885001200031D692FD4 495 | :101ED0006A2FE72E2F08A4002408F4002C08013EE6 496 | :101EE0009831D9208E3120002208B5002108B40095 497 | :101EF000F32F34088400350885000008E03EF10027 498 | :101F0000FF3003180030F2000530F3000030F40019 499 | :101F1000A73135278E3172082000AE007108AD0060 500 | :101F2000B2013208A400A501FF30A6008330A7004B 501 | :101F300024082607A8002508273DA90028082D0702 502 | :101F4000840029082E3D85000008AA002A08B70051 503 | :101F5000B6133613371FAD2F36172000B612371FB2 504 | :101F6000B22FB61620003612B71EB72F3616200035 505 | :101F7000B611B71EBC2FB61520003611371EC12F63 506 | :101F800036152000B610371EC62FB61420003610A6 507 | :101F9000B71DCB2F3614200036083306A4002408C2 508 | :101FA000B60036089A31B3228E31200036089A31B5 509 | :101FB000B3228E3101302000A4002408B20705307E 510 | :101FC0003202031CE42FE52F912F33089A31B322FC 511 | :101FD0008E31200033089A31B3228E310130200037 512 | :101FE000B4070030B53D3408840035088500120080 513 | :101FF000031DFB2FFC2F792FA531B3258E3108004F 514 | :102002000330FA007A082000A000BB30A100A930FA 515 | :10201200A2002100590803190F28112801301228A3 516 | :102022000030FB007B082000A30000308E317E26AA 517 | :1020320090310330FA007A082000A000E130A100BC 518 | :10204200A930A20021005903031928282A280130A7 519 | :102052002B280030FB007B082000A30007308E31C4 520 | :102062007E26903108002000B201B30121005408FD 521 | :10207200803AFA0080307A02031D4128643053020C 522 | :10208200031C44284528AB2821005208803AFA0054 523 | :102092005408803A7A02031D50285308510203184B 524 | :1020A20053285428A6281730BA3E860087011930D3 525 | :1020B200BA3E84008501403F00022000A4000131A5 526 | :1020C200413F003BA500A601A51BA6032608A700C9 527 | :1020D2001730BA3E860087011930BA3E8400850166 528 | :1020E200403F0007F1000131413F003DF200F301A2 529 | :1020F200F21BF3037308F4000030F8000030F7001D 530 | :102102000030F6006430F5009931D6219031740820 531 | :102112002000AB007308AA007208A9007108A80089 532 | :102122009231D322903120002508B3002408B20056 533 | :102132003308803AFA0083307A02031DA228E8307D 534 | :102142003202031CA528A628AB28E7302000B200E3 535 | :102152000330B300200033082100BD002000320804 536 | :102162002100BC00080021005708F1007108F200AC 537 | :102172007218BC28BF2822008D15C12822008D119B 538 | :10218200F218C428C72822000C15C92822000C11F5 539 | :102192007219CC28CF2822000D16D12822000D1248 540 | :1021A200F219D428D72822008C15D92822008C11A4 541 | :1021B200721ADC28DF2822008D16E12822008D12F7 542 | :1021C200F21AE428E72822008C16E92822008C1251 543 | :1021D200721BEC28EF2822000C16F12822000C12A8 544 | :1021E20021005608F1007108F2007218F928FC2843 545 | :1021F20022008E17FE2822008E13F21801290429CC 546 | :1022020022008E15062922008E11721909290C2925 547 | :1022120022000E170E2922000E13F2191129142979 548 | :1022220022000E15162922000E11721A19291C29D4 549 | :1022320022008E161E2922008E12F21A212924292A 550 | :1022420022008E14262922008E10721B29292C2985 551 | :1022520022000E162E2922000E122100550C2200F9 552 | :10226200031C0E1003180E14080099313721913106 553 | :102272009E31A9269131A53194259131A631582656 554 | :102282009131F430F1000130F200A631E5269131AE 555 | :10229200FA01783094319B2491312000A001223040 556 | :1022A200A100A930A200A30180308E317E26913197 557 | :1022B2002000A001A00A1A30A100A930A200A301A7 558 | :1022C20080308E317E26913102302000DC005C08A5 559 | :1022D200A000B530A100A930A200A30180308E3148 560 | :1022E2007E269131DC30F1000530F200A631E52680 561 | :1022F2009131983104209131A5315C259131A03082 562 | :10230200F5000130F6000A302000DC005C08F7001E 563 | :102312000030A7317427913123002108F4002008EE 564 | :10232200F300A6319C2691312100380839060319A1 565 | :102332009B299C29AB2901302000DC005C0821008C 566 | :10234200B80701302000DC005C082100B7078A31A1 567 | :10235200F82291310A3021003706031DB129B22932 568 | :102362009529B7019D31EE259131A731B6279131DB 569 | :10237200640095298031132801302100DB070030E9 570 | :10238200DC3D01305C02F43003195B02031CCA29F4 571 | :10239200CB29CF29A5315C259131442AFB3020007D 572 | :1023A2006406031DD529D629202A2100DB01DC0180 573 | :1023B2005A0859022000BE003E08C1000A2A013014 574 | :1023C2002000BE003E082100D9071D2A21005A081C 575 | :1023D200043E2000BE00003003180130BF003F0859 576 | :1023E200803AC00080304002031DFB2921005808BA 577 | :1023F20020003E020318FE29FF29E02901302000B7 578 | :10240200BE003E082100DA07E0292100DA01D901E5 579 | :102412001D2A4108BE00BF013F08003A0319122AD3 580 | :10242200062A3E08003A0319E029013A0319E7296E 581 | :10243200033A0319E029062A9B31E22391315030F5 582 | :1024420020006406031D262A272A442A2100593522 583 | :102452005D072000BE003E08860001308700403F35 584 | :10246200DD00413FDE005E08BF005D08BE000230B5 585 | :102472003E0784003F0803183F0A8500013F8A0097 586 | :10248200003F0A0092310800210058082000B800DD 587 | :102492003808BE0021005903031D502A512A662A1A 588 | :1024A2002000A001D930A100A930A2003E080319E2 589 | :1024B2005B2A5D2A01305E2A0030B8003808A3008A 590 | :1024C20007308E317E2692317A2A2000A001DD303B 591 | :1024D200A100A930A2003E080319702A722A013015 592 | :1024E200732A0030B8003808A30007308E317E26E8 593 | :1024F200923121005B082000A10021005A0820002F 594 | :10250200A0003A30B8003808A2000430B9003908F7 595 | :10251200A3008831002092312000A001A00A3A30A5 596 | :10252200A1000030A2003E030319982A9A2A013022 597 | :102532009B2A0030B8003808A30007308E317E266F 598 | :10254200923103302000B8003808A000BB30A1004F 599 | :10255200A930A20002303E060319B02AB22A013085 600 | :10256200B32A0030B9003908A30000308E317E262C 601 | :10257200923103302000B8003808A000E130A100F9 602 | :10258200A930A20003303E060319C82ACA2A013024 603 | :10259200CB2A0030B9003908A30007308E317E26DD 604 | :1025A200923108002000AD01A71FD82AD92AE62AB5 605 | :1025B200A409A509A609A709A40A0319A50A0319CA 606 | :1025C200A60A0319A70AAD01AD0AAB1FE92AEA2A36 607 | :1025D200F92AA809A909AA09AB09A80A0319A90A8B 608 | :1025E2000319AA0A0319AB0A0130F9007908AD06EA 609 | :1025F2000030B1000030B0000030AF000030AE005B 610 | :1026020027082604250424040319082B092B4A2B26 611 | :10261200AC01AC0A172B0130A435A50DA60DA70DF0 612 | :10262200890B0D2B0130F9007908AC07A71F1A2B73 613 | :102632001B2B0C2B0130AE35AF0DB00DB10D890B3C 614 | :102642001C2B27082B02031D302B26082A02031DF0 615 | :10265200302B25082902031D302B24082802031CD5 616 | :10266200332B342B3D2B2408A8022508A93B26082E 617 | :10267200AA3B2708AB3B2E140130A736A60CA50CAB 618 | :10268200A40C890B3E2B0130AC02031D492B4A2BB3 619 | :102692001B2B2D0803194E2B4F2B5A2BAE09AF09BA 620 | :1026A200B009B109AE0A0319AF0A0319B00A031936 621 | :1026B200B10A3108A7003008A6002F08A5002E088D 622 | :1026C200A4000800210058082000C4004408C600E5 623 | :1026D20021005D03031D6E2B6F2B842B2000A001B4 624 | :1026E200D930A100A930A20046080319792B7B2B0F 625 | :1026F20001307C2B0030C4004408A30007308E3127 626 | :102702007E269331982B2000A001DD30A100A93054 627 | :10271200A200460803198E2B902B0130912B00301A 628 | :10272200C4004408A30007308E317E269331200076 629 | :10273200B801B80A21005C082000BA0021005B0839 630 | :102742002000B90046030319A72BA92B0130AA2B9D 631 | :102752000030C4004408BB0006309C31AD249331E4 632 | :1027620002302000C4004408B80021005A082000AA 633 | :10277200BA00210059082000B900023046060319A8 634 | :10278200C32BC52B0130C62B0030C5004508BB004A 635 | :1027920006309C31AD24933103302000C40044083C 636 | :1027A200A000BB30A100A930A200033046060319E5 637 | :1027B200DB2BDD2B0130DE2B0030C5004508A300EA 638 | :1027C20000308E317E26933103302000C40044084D 639 | :1027D200A000E130A100A930A2000430460603198E 640 | :1027E200F32BF52B0130F62B0030C5004508A30072 641 | :1027F20007308E317E2693310800FB3020006406BC 642 | :10280200031D042C052C142C0130BF003F082100AD 643 | :10281200D80704305802031C0F2C102C112CD8019D 644 | :10282200923145229331503020006406031D1A2C48 645 | :102832001B2C9A2C2830E40221005808031D222C5C 646 | :10284200232C2F2C5903031D272C282C2A2CD90189 647 | :102852002C2CD901D90A92314522933121005803F7 648 | :10286200031D342C352C662C5B08803A2000BF00F7 649 | :1028720080303F02031D402C643021005A02031CA9 650 | :10288200432C442C4A2C0F302100DA070030DB3D68 651 | :102892004F2C05302100DA070030DB3D5B08803A1F 652 | :1028A2002000BF0081303F02031D5A2C2D30210031 653 | :1028B2005A02031C5D2C5E2C632C05302100DA00C9 654 | :1028C2000030DB009231452293310230210058065C 655 | :1028D200031D6C2C6D2C932C5B08C5005A08C40098 656 | :1028E20059082000BF003F082100C300C430200067 657 | :1028F200BF003F08F5000230C0004008F6006C300F 658 | :10290200A73195279331C3302000BF003F08F5005F 659 | :10291200F601F60A7230A73195279331A5315C256D 660 | :1029220093319A2C03305806031D982C992C9A2C1B 661 | :102932008F2C08002000A0002008FB007B08E50087 662 | :102942007A08FB007B082100B6000D178D172200C4 663 | :102952000D138D130630890BAC2C0032A631CC2618 664 | :102962009431200065089A31B322943100309A31B3 665 | :10297200B3229431AE309A31B3229431D5309A31A8 666 | :10298200B322943180309A31B3229431A8309A31F3 667 | :10299200B32294313F309A31B3229431D3309A31F9 668 | :1029A200B322943100309A31B322943140309A31BB 669 | :1029B200B32294318D309A31B322943114309A314A 670 | :1029C200B322943181309A31B3229431FF309A315B 671 | :1029D200B3229431D9309A31B3229431F1309A3101 672 | :1029E200B322943120309A31B322943102309A3199 673 | :1029F200B322943121309A31B322943100309A318A 674 | :102A0200B32294317F309A31B32294312E309A31ED 675 | :102A1200B322943121003603031D102D112D1A2DDE 676 | :102A2200A0309A31B3229431C0309A31B32294311A 677 | :102A3200222DA1309A31B3229431C8309A31B32277 678 | :102A42009431DA309A31B322943112309A31B3226E 679 | :102A52009431DB309A31B322943140309A31B3222F 680 | :102A62009431A4309A31B3229431A6309A31B322F0 681 | :102A72009431A531B3259431983104209431080062 682 | :102A820020003208F1003308F200890D893B8909E0 683 | :102A9200F300F4000030F8000030F700C330F60015 684 | :102AA2005030F5009931D621953174082000BF00CD 685 | :102AB2007308BE007208BD007108BC000030A70098 686 | :102AC2000030A6000030A5000230A4003F08AB0091 687 | :102AD2003E08AA003D08A9003C08A8009231D32272 688 | :102AE200953120002708C3002608C2002508C1002E 689 | :102AF2002408C0000030C7000030C6000030C50006 690 | :102B02000030C400D02D4308C7004208C600410867 691 | :102B1200C5004008C4004708A7004608A6004508AB 692 | :102B2200A5004408A4003F08AB003E08AA003D08E7 693 | :102B3200A9003C08A8009231D32295312000240834 694 | :102B42004407B4002508453DB5002608463DB600B9 695 | :102B52002708473DB7003708BB003608BA003508DA 696 | :102B6200B9003408B8000030A7000030A6000030D9 697 | :102B7200A5000230A4003B08AB003A08AA003908BD 698 | :102B8200A9003808A8009231D322953120002708E5 699 | :102B9200C3002608C2002508C1002408C000470857 700 | :102BA2004306031DDE2D46084206031DDE2D4508A1 701 | :102BB2004106031DDE2D44084006031DE12DE22DD2 702 | :102BC200842D4108B3004008B200080020006408C8 703 | :102BD200031DEC2DED2DF22D2830C30043082100FA 704 | :102BE200DA00FB3020006406031DF82DF92D082EB3 705 | :102BF2000130C30043082100D9070A305902031CDF 706 | :102C0200032E042E052ED9018931562195315030DB 707 | :102C120020006406031D0E2E0F2E932E21005A084B 708 | :102C22002000E4020B3021005A02031C192E1A2E36 709 | :102C32001C2E0530DA02083059020318212E222EEA 710 | :102C4200632E5908DD3E8600870101082000C3007B 711 | :102C52004308C600C701312E0130C3004308C7072D 712 | :102C62004708003E8400A0300318013E850000089A 713 | :102C7200460603193D2E3E2E442E49304702031CC0 714 | :102C8200432E442E2D2E0130C3004308C70748307F 715 | :102C92004702031C4D2E4E2E4F2EC7014708003E01 716 | :102CA2008400A0300318013E85000008C300210003 717 | :102CB2005908DD3E860087012000430881008931E2 718 | :102CC20056219531083021005906031D692E6A2EBE 719 | :102CD2008C2EA631FF26953172082100DC00710886 720 | :102CE200DB00DB302000C3004308F5000A30C400DB 721 | :102CF2004408F6000A30C5004508F10021005808D2 722 | :102D0200A63104269531003EA73195279531A5318C 723 | :102D12005C259531932E09305906031D912E922E72 724 | :102D2200932E882E080001302100D8070030D93DAB 725 | :102D320001305902F43003195802031CA12EA22EAD 726 | :102D4200A62EA5315C259631452FFB302000640666 727 | :102D5200031DAC2EAD2EF22E2100D801D9015C0844 728 | :102D62005A022000CA004A08CD00DF2E013020009E 729 | :102D7200CA004A082100DA07EF2E21005C08033E50 730 | :102D82002000CA00003003180130CB004B08803A03 731 | :102D9200CC0080304C02031DD02E0A304A020318A8 732 | :102DA200D32ED42EB72E01302000CA004A082100AB 733 | :102DB200DC07B72E2100DC01DA01EF2E4D08CA0034 734 | :102DC200CB014B08003A0319E72EDB2E4A08003AE2 735 | :102DD2000319B72E013A0319BE2EDB2E9F31192794 736 | :102DE2009631503020006406031DF82EF92E452F2F 737 | :102DF20021005B03031DFE2EFF2E262F5A08031D02 738 | :102E0200032F042F0A2F31302000DD00A930DE000D 739 | :102E1200152F5A082000CA004A082100D80037306E 740 | :102E22002000DD00A930DE005E08CB005D08CA008C 741 | :102E320002304A0784004B0803184B0A8500013F01 742 | :102E42008A00003F0A009731452F4E30F5000030CE 743 | :102E5200F6000A302000CA004A08F7000A30CB0008 744 | :102E62004B08F10021005A08A63104269631003E93 745 | :102E7200A7317427963120004F08F4004E08F30062 746 | :102E8200A6319C269631A22E0800FB302000640653 747 | :102E9200031D4C2F4D2F5C2F0130C7004708210026 748 | :102EA200D80705305802031C572F582F592FD80125 749 | :102EB200933163239731503020006406031D622F43 750 | :102EC200632FFF2F2830E40221005808031D6A2FC8 751 | :102ED2006B2F772F5D03031D6F2F702F722FDD0174 752 | :102EE200742FDD01DD0A93316323973121005803EA 753 | :102EF200031D7C2F7D2F982F0530DB070030DC3D32 754 | :102F02005C08803A2000C70080304702031D8C2FE6 755 | :102F1200C93021005B02031C8F2F902F952F783030 756 | :102F22002100DB000030DC00933163239731023053 757 | :102F320021005806031D9E2F9F2FBA2F0530D90757 758 | :102F42000030DA3D5A08803A2000C700803047023C 759 | :102F5200031DAE2F973021005902031CB12FB22F4F 760 | :102F6200B72F64302100D9000030DA009331632397 761 | :102F72009731033021005806031DC02FC12FF82FAF 762 | :102F82005D082000C70047082100C2005C08C1009C 763 | :102F92005B08C0005A08BF005908BE00BE302000BE 764 | :102FA200C7004708F5000230C8004808F600703034 765 | :102FB200A73195279731C0302000C7004708F50098 766 | :102FC2000230C8004808F6006E30A73195279731C5 767 | :102FD200C2302000C7004708F500F601F60A733038 768 | :102FE200A73195279731A5315C259731FF2F043002 769 | :0E2FF2005806031DFD2FFE2FFF2FF42F0800A1 770 | :10300800A53144259831F901F40179089831D9207E 771 | :103018009831F80100309A31B32298310130F70025 772 | :103028007708F80780307802031C1B281C280E2814 773 | :103038000130F7007708F90708307902031C2528C2 774 | :1030480026280828A531B3259831A5314925983176 775 | :103058000800F40023009518322833282E28740815 776 | :10306800F200F3017208910073089200710893004E 777 | :103078003F30F20072089505200003108B1F452889 778 | :103088004628472803148B1323001515553096003E 779 | :10309800AA309600951415112000031C54285528B1 780 | :1030A80056288B17080020006208FA007A08FB00EF 781 | :1030B80002307B06031D612862286D28210059080B 782 | :1030C8000319672868286B28D901FB016D28D901E5 783 | :1030D800D90A0230FA007A082000A0007B35483E61 784 | :1030E800860001308700403FA100413FA200A301B4 785 | :1030F80080308E317E26983108009831042098312E 786 | :10310800A531542598312000A0019130A100A930A3 787 | :10311800A200A30100308E317E2698312000A00144 788 | :10312800A00A9730A100A930A200A30100308E3177 789 | :103138007E2698312100D8014308FA007A08D90080 790 | :103148004508DB004408DA0092314522983108002E 791 | :1031580080314A20983101302000C0004008210009 792 | :10316800D80732305806031DBA28BB28BF28D80113 793 | :1031780098315720983120006403031DC428C528BE 794 | :10318800D12821005B08F4005A08F300A6319C26D8 795 | :103198009831A5315C259831D82805306206031D81 796 | :1031A800D628D728D828CD280800F600A631CC265E 797 | :1031B8009831200065089A31B322983100309A314D 798 | :1031C800B32298317608B03E9A31B3229831740808 799 | :1031D8000F399A31B32298317408F5000430F53666 800 | :1031E800890BF3287508103E9A31B3229831A6311D 801 | :1031F800CC269831200065089A31B32298314030A6 802 | :103208009A31B32298310800983104209931A531B8 803 | :10321800542599312000A001E530A100A930A20071 804 | :10322800A30100308E317E2699312000A001A00A2A 805 | :10323800E930A100A930A200A30100308E317E261A 806 | :1032480099312100D801FF30D900FF30DA00DD01C3 807 | :10325800DB01DC01A631FF26993172082100DF006D 808 | :103268007108DE0008007A302100990022008C01E4 809 | :103278008D018E0120001C08FC3902389C00873023 810 | :103288009C05FA309B00210091140B1720001C1597 811 | :103298008B17C03023008D05220091139313210052 812 | :1032A8008E138E110E130E118E128E100E120E101A 813 | :1032B8008D110C110D128C118D128C120C12D7015C 814 | :1032C800D601D5016430BE000030BF009513080058 815 | :1032D800F701F801F9010130F300790A7429F3358F 816 | :1032E800890B732973082100560503197C297D2948 817 | :1032F80092297908F300F401F335F40D0E307307C1 818 | :103308008400A830743D8500003FF500013FF600B9 819 | :1033180077087507F7007808763DF8000130F30064 820 | :103328007308F90707307902031C9B299C296F2928 821 | :103338007808F2007708F1000800F701F801F901B0 822 | :103348000130F300790AA929F335890BA8297308F4 823 | :10335800210057050319B129B229C7297908F300B3 824 | :10336800F401F335F40D003073078400A830743D80 825 | :103378008500003FF500013FF60077087507F70064 826 | :103388007808763DF8000130F3007308F907073034 827 | :103398007902031CD029D129A4297808F2007708DA 828 | :1033A800F100080000302000A3000030A200003027 829 | :1033B800A1000030A000711CE229E329EC2975085E 830 | :1033C8002000A0077608A13D7708A23D7808A33D14 831 | :1033D8000130F535F60DF70DF80D890BED290130A3 832 | :1033E800F436F30CF20CF10C890BF429740873040D 833 | :1033F80072047104031D012A022ADF292000230810 834 | :10340800F4002208F3002108F2002008F100080067 835 | :103418002000AC00073027020318132A142A152AA3 836 | :10342800422A99316C219A3172082000AB00710848 837 | :10343800AA002B08A1002A08A0002C08A800280828 838 | :10344800A2000530A9002908A300883100209A317C 839 | :1034580070302000A8002C08043E86008701280848 840 | :1034680081004630A8002C08053E86008701280800 841 | :1034780081002C08063E8600870181010800200093 842 | :10348800AC000730270203184A2A4B2A4C2A792A0B 843 | :103498009931A1219A3172082000AB007108AA0065 844 | :1034A8002B08A1002A08A0002C08A8002808A200C0 845 | :1034B8000530A9002908A300883100209A316E3010 846 | :1034C8002000A8002C08043E8600870128088100F7 847 | :1034D8004830A8002C08053E86008701280881008E 848 | :1034E8002C08063E86008701810108002000A00004 849 | :1034F8002008F300F30DF30D21001D08730683392E 850 | :1035080073069D000630890B872A003221009D141E 851 | :103518009D188F2A902A8C2A1C08F300F40173083E 852 | :103528002000A1007408A20021001B08F300F40188 853 | :1035380020002208F6002108F5007508F600F501BC 854 | :1035480073087507F8007408763DF900F835F90D29 855 | :10355800F835F90D7808F1007908F2000800F20052 856 | :10356800F301F21BB82AB92ABC2A21008D13BE2AFE 857 | :1035780021008D170630890BBF2A003221000D1754 858 | :103588000630890BC52A003221000D130630890B3D 859 | :10359800CB2A00327235F1007108F2000130F100D7 860 | :1035A8007108F30708307302031CDB2ADC2AB52AEA 861 | :1035B80021008D170630890BDF2A003221000D17F4 862 | :1035C8000630890BE52A003221000D130630890BDD 863 | :1035D800EB2A00320800983104209A312000A0011B 864 | :1035E8000830A100A930A200A30180308E317E26C8 865 | :1035F8009A312000A001A00AFF30A100A830A20043 866 | :10360800A30180308E317E269A310230FA007A0882 867 | :103618002000A000F630A100A930A200A30180304C 868 | :103628008E317E269A310330FA007A082000A000F5 869 | :10363800AF30A100A930A200A30180308E317E26D0 870 | :103648009A31A53154259A312100D8010800FB3060 871 | :1036580020006406031D312B322B412B0130B800AA 872 | :1036680038082100D90702305902031C3C2B3D2B96 873 | :103678003E2BD901903101209B3150302000640647 874 | :10368800031D472B482B662B21005908031D4D2B82 875 | :103698004E2B632BA631FF269B3172082100DB00DD 876 | :1036A8007108DA00DA302000B8003808F5000A306E 877 | :1036B800B9003908F6000030A73195279B31A531AC 878 | :1036C8005C259B310800983104209B31A531542595 879 | :1036D8009B312000A001C530A100A930A200A301A0 880 | :1036E80000308E317E269B312000A001A00A8B304D 881 | :1036F800A100A930A200A30100308E317E269B31A3 882 | :103708000230FA007A082000A000C030A100A930D9 883 | :10371800A200A30100308E317E269B312100D80102 884 | :103728004208FA007A08DD004108DC004008DB00A6 885 | :103738003F08DA003E08D900933163239B31080023 886 | :10374800983104209B31210065082000B900210030 887 | :1037580066082000BA00210067082000BB00A0010D 888 | :10376800A00A3930A1000030A200A30100308E3138 889 | :103778007E269B31DA30F5000030F6000A30200052 890 | :10378800B8003808F7000030A73174279B312100B2 891 | :10379800E4012000A001A00ADC30A1000030A20052 892 | :1037A800A30102308E317E269B312100D901A5313B 893 | :1037B80054259B31903101209B31080021005A0883 894 | :1037C8002000B8003808FA00FB017B08B800380868 895 | :1037D800A0007A3521005D072000B900390886006D 896 | :1037E80001308700403FBA00413FBB003A088400DF 897 | :1037F8003B088500003FA100013FA20021005908B5 898 | :103808007A060319082C0A2C01300B2C00302000F2 899 | :10381800BD003D08A30080308E317E269B310130EB 900 | :103828002000B8003808FA070130B8003808FB074C 901 | :1038380004307B02031C212C222CE92B08000030C9 902 | :103848002000A7000030A600C330A5005030A40017 903 | :10385800A830B4006130B5000030B6000030B700C1 904 | :103868003208F1003308F200890D893B8909F30019 905 | :10387800F4003208F5003308F600890D893B890900 906 | :10388800F700F8009931D6219C3171082000B4075F 907 | :103898007208B53D7308B63D7408B73D3708AB00EC 908 | :1038A8003608AA003508A9003408A8009231D322A6 909 | :1038B8009C3120002508FB002408FA007B08B3008F 910 | :1038C8007A08B2000800210068082000BA00210028 911 | :1038D80069082000BB0021006A082000BC00210004 912 | :1038E8005808303E2000B8003808BA009831042043 913 | :1038F8009C312000A0013A30A1000030A200A301B1 914 | :1039080000308E317E269C31DB30F5000030F60029 915 | :103918000A302000B8003808F7000A30B900390822 916 | :10392800F10021005808A63104269C31003EA73139 917 | :1039380074279C312100D90128302000B8003808AC 918 | :103948002100DA00A53154259C31893156219C315A 919 | :1039580008002000BE0054308600013087003F3048 920 | :103968008400003085000530BC0016001A00BC0B2E 921 | :10397800B92C3A08803ABC0080303C02031DC62CA2 922 | :1039880064303902031CC92CCA2CE32C20003A08E5 923 | :10399800A1003908A0004030BC003C08A200043057 924 | :1039A800BD003D08A300883100209C31200040085C 925 | :1039B800BC003C08BF002E30BC003C08C000200002 926 | :1039C8003808BC003C08A0003F30A1000030A2002D 927 | :1039D8003B08BD003D08A3003E088E317E269C3181 928 | :1039E800080020006403031DFA2CFB2C3F2D210046 929 | :1039F8005808031D002D012D3C2D0130FA007A08CE 930 | :103A0800D807983104209C312000A001E230A100A1 931 | :103A1800A830A200A30180308E317E269C31200080 932 | :103A2800A001A00A1130A100A930A200A301803092 933 | :103A38008E317E269C310230FA007A082000A000E0 934 | :103A4800F630A100A930A200A30180308E317E2675 935 | :103A58009C310330FA007A082000A000A930A100A8 936 | :103A6800A930A200A30180308E317E269C313F2DE3 937 | :103A7800A5315C259C310800F701F41F442D452D24 938 | :103A88004C2DF309F409F30A0319F40AF701F70AAC 939 | :103A9800F21F4F2D502D552DF109F209F10A031986 940 | :103AA800F20A7108720403195A2D5B2D842DF60150 941 | :103AB800F60A672D0130F135F20D890B5F2D0130C3 942 | :103AC800F5007508F607F21F6A2D6B2D5E2D72083A 943 | :103AD8007402031D712D71087302031C742D752D5A 944 | :103AE800792D7108F3027208F43B0130F236F10CBB 945 | :103AF800890B7A2D0130F602031D832D842D6B2D41 946 | :103B080077080319882D892D8E2DF309F409F30AF6 947 | :103B18000319F40A7408F2007308F100080013305E 948 | :103B2800BA3E8600870100302000A7000030A600BA 949 | :103B38001030A5000030A40021004F08F100500803 950 | :103B4800F200890D893B8909F300F4005308F50058 951 | :103B58005408F600890D893B8909F700F800993166 952 | :103B6800D6219D3174082000AB007308AA007208A2 953 | :103B7800A9007108A8009231D3229D31403F20004E 954 | :103B88002407B900413F253DBA003A08B300390877 955 | :103B9800B2009C3123249D3120003308BC00320838 956 | :103BA800BB003C08803AB80080303802031DDE2D87 957 | :103BB80002303B020318E12DE22DE52D2000BB0168 958 | :103BC800BC0120003C082100BB0020003B0821006C 959 | :103BD800BA00080020000D18F22DF32D072EFA3038 960 | :103BE80064020318F82DF92DFD2D0130F10071083C 961 | :103BF800E40750306406031D022E032E222E2100F6 962 | :103C0800B501B50A222E21003508031D0C2E0D2EF4 963 | :103C18001E2E200064080319122E132E1E2EFB30B0 964 | :103C280064020318182E192E1E2EFB30F10071089D 965 | :103C3800E400202E2000E4012100B50120008D18A9 966 | :103C4800262E272E342E0130F1007108E307143098 967 | :103C58006302031C302E312E352EE301E30A352E84 968 | :103C6800E3010D19382E392E472E0130F100710865 969 | :103C78002100B40714303402031C432E442E492E6D 970 | :103C8800B401B40A492E2100B4010800F701F21F5B 971 | :103C98004E2E4F2E562EF109F209F10A0319F20A97 972 | :103CA800F701F70AF41F592E5A2E632EF309F40967 973 | :103CB800F30A0319F40A0130F5007508F706F8014C 974 | :103CC800F9017108720403196A2E6B2E9A2EF601F7 975 | :103CD800F60A772E0130F135F20D890B6F2E01307F 976 | :103CE800F5007508F607F21F7A2E7B2E6E2E01302E 977 | :103CF800F835F90D890B7C2E72087402031D862E87 978 | :103D080071087302031C892E8A2E8F2E7108F30204 979 | :103D18007208F43B78140130F236F10C890B902EBE 980 | :103D28000130F602031D992E9A2E7B2E770803196F 981 | :103D38009E2E9F2EA42EF809F909F80A0319F90AEC 982 | :103D48007908F2007808F1000800BE30F50000306C 983 | :103D5800F60002302000A0002008F7007030A731DC 984 | :103D680074279E31C030F5000030F6000230200084 985 | :103D7800A0002008F7006E30A73174279E31C230AA 986 | :103D8800F5000030F600F701F70A7330A731742701 987 | :103D98009E31C430F5000030F60002302000A0004B 988 | :103DA8002008F7006C30A73174279E31C330F50026 989 | :103DB8000030F600F701F70A7230A73174279E31F8 990 | :103DC800C930F5000030F60002302000A0002008BD 991 | :103DD800F7006A30A73174279E31CB30F5000030E8 992 | :103DE800F60002302000A0002008F7006830A73154 993 | :103DF80074279E31CD30F5000030F60002302000E7 994 | :103E0800A0002008F7006630A73174279E31CF3014 995 | :103E1800F5000030F60002302000A0002008F7006E 996 | :103E28006430A73174279E31080021006B082000F8 997 | :103E3800BA0021006C082000BB0021006D0820009A 998 | :103E4800BC00BE0121005C0820003E07B80038080D 999 | :103E5800BD003D08303EB8003808BA003E08013EB3 1000 | :103E6800B8003808A0003A30A1000030A2002100B4 1001 | :103E78005A0820003D060319422F442F0130452FD0 1002 | :103E88000030B9003908A30000308E317E269F31FA 1003 | :103E98003F30F5000030F6000A302000B80038083E 1004 | :103EA800F7000A30B9003908F1003D08A6310426A8 1005 | :103EB8009F31003EA73174279F312000C9013E0879 1006 | :103EC800013EB8003808A0004130A1000030A2002F 1007 | :103ED80021005A0820003D060319732F752F013061 1008 | :103EE800762F0030B9003908A30002308E317E26C3 1009 | :103EF8009F3101302000B8003808BE0703303E0269 1010 | :103F0800031C872F882F262F080021006F08200008 1011 | :103F1800C80021006E082000C70021005908313E62 1012 | :103F28002000C5004508C700A0019D30A100A930A8 1013 | :103F3800A200A30100308E317E269F312000A0010F 1014 | :103F48004730A1000030A200A30109308E317E263F 1015 | :103F58009F312000A001A00A5E30A100A830A20075 1016 | :103F6800A30100308E317E269F3102302000C5002B 1017 | :103F78004508A000A330A100A930A200A301003089 1018 | :103F88008E317E269F3102302000C5004508B800DA 1019 | :103F980021005935DA3E86008701403F2000B900EC 1020 | :103FA800413FBA00210058080319DB2FDD2F0130EB 1021 | :103FB800DE2F00302000C6004608BB0006308731DF 1022 | :103FC80098279F3103302000C5004508A000E13044 1023 | :103FD800A100A930A200210058030319F42FF62FDD 1024 | :103FE8000130F72F00302000C6004608A300073034 1025 | :103FF8008E317E269F3108002034303431343234FB 1026 | :10400800333434343534363437343834393461342D 1027 | :1040180062346334643465346634673468346934CC 1028 | :104028006A346B346C346D346E346F34703471347C 1029 | :10403800723473347434753476347734783479342C 1030 | :104048007A34413442344334443445344634473472 1031 | :10405800483449344A344B344C344D344E344F345C 1032 | :10406800503451345234533454345534563457340C 1033 | :10407800583459345A343F3421342F342B342D34A6 1034 | :0A4088002334253424345F3400345F 1035 | :104A8800AE30A531DA25A5310800AF30A531DA25D9 1036 | :104A9800A5310800640080010131890B4F2D0034D5 1037 | :104AA800FF30F10071082000E4002100B501080082 1038 | :104AB80085302000DD00A930DE0099310821A531BC 1039 | :104AC800080030343A34003430343A340034303466 1040 | :104AD8003A3400342034003421005F08F4005E08C2 1041 | :104AE800F300A6319C26A53199310821A53108008B 1042 | :104AF8002100DA01DC01D801D9019F311927A5313C 1043 | :104B0800A5315425A53108000030F300F400A63182 1044 | :104B18009C26A5312100C601A5315C25A5310800D8 1045 | :104B280021000D1424000D1421008D1424008D146F 1046 | :104B380021000D1524000D1508002000E201E20AED 1047 | :104B48002100B201B101D501D601D7019031B420BD 1048 | :104B5800A5310230F30073082100B10008002100DC 1049 | :104B68008D130630890BB62D003221000D17063043 1050 | :104B7800890BBC2D003221008D170630890BC22D00 1051 | :104B88000032080098310420A5312000A001B63079 1052 | :104B9800A100A830A200A30100308E317E26A531E5 1053 | :104BA8002100DB01A5317C25A5310800F400A631E0 1054 | :104BB800CC26A531200065089A31B322A531803072 1055 | :104BC8009A31B322A53174089A31B322A531A5319F 1056 | :104BD800B325A5310800F400640023009518F52DCD 1057 | :104BE800F62DF02D7408F100F20171089100720899 1058 | :104BF80092003F30F3007308950515141308080058 1059 | :104C0800F400F301741C092E0A2E0E2E7108F2000E 1060 | :104C18007208F3070310F10D0310F40C7408031D58 1061 | :104C2800162E172E062E730808002100C601C60A84 1062 | :104C3800A631FF26A63172082100C8007108C700F6 1063 | :104C48000030F300F400A6319C26A631A5315C257E 1064 | :104C5800A631080098310420A6312000A001C130F7 1065 | :104C6800A100A830A200A30100308E317E26A63113 1066 | :104C78002100DB01DB0AA5317C25A631080098312B 1067 | :104C88000420A6312100D801D9014A08DB004908CF 1068 | :104C9800DA004C08DD004B08DC00A5315425A631AC 1069 | :104CA8009F318927A631080021000C1423000C1419 1070 | :104CB80021008C1423008C148330220097002100DB 1071 | :104CC8009E171E088F3920389E001E1103309E043F 1072 | :104CD8001D14080098310420A631A5315425A631A9 1073 | :104CE8002100D901DA01DB01DC010630FA007A087B 1074 | :104CF800D8005930FA007A08DD009B31E223A6314A 1075 | :104D0800080098310420A631A5315425A631210088 1076 | :104D1800D901DA01DB01DC010430FA007A08D80095 1077 | :104D28006530FA007A08DD009B31E223A6310800DD 1078 | :104D3800F41F9F2EA02EA42E2100D501D50AA62E41 1079 | :104D48002100D50174087F39F5007508D60073086D 1080 | :104D58007F39F5007508D7009031B420A6310800D6 1081 | :104D68002000BB003908FA007A08BC00BD013808E9 1082 | :104D7800FA007A08A0003C30A1000030A2003A08EE 1083 | :104D8800FB007B08A3003B088E317E26A631080075 1084 | :104D980021000D170630890BCF2E003221008D1708 1085 | :104DA8000630890BD52E003221008D130630890B71 1086 | :104DB800DB2E003221000D130630890BE12E003264 1087 | :104DC80008007208F5007108F4006400F82E063037 1088 | :104DD800F3003030890BEE2EF30BEE2E0032640018 1089 | :104DE8000130F4020030F53B74087504031DFD2EF4 1090 | :104DF800FE2EEB2E080021005708F300F401560898 1091 | :104E0800F500F6017508F600F50173087507F80056 1092 | :104E18007408763DF90055080319132F142F152F20 1093 | :104E2800F9177908F2007808F10008009831042091 1094 | :104E3800A731A5315425A7312100D801A631FF2675 1095 | :104E4800A73172082100DA007108D900DB01D50109 1096 | :104E5800D601D7019031B420A7318A312122A73158 1097 | :104E68000800F501F601711C3A2F3B2F3F2F7308FC 1098 | :104E7800F5077408F63D0130F335F40D890B402F22 1099 | :104E88000130F236F10C890B452F71087204031DAD 1100 | :104E98004E2F4F2F372F7608F2007508F1000800C3 1101 | :104EA80098310420A731A5315425A7312000A0014D 1102 | :104EB8002A30A100A930A200A301A30A80308E31B4 1103 | :104EC8007E26A7312100D901A631FF26A731720815 1104 | :104ED8002100DB007108DA00A531A125A7310800FF 1105 | :104EE800F9007608FB007508FA008F2F7908A531BC 1106 | :104EF800EF25A731F8007A0886007B088700780834 1107 | :104F080081000130F7020130F8007808F907013014 1108 | :104F1800FA070030FB3D7708031D932F942F7A2F53 1109 | :104F28000800F8007508F7007708F900B02F79082D 1110 | :104F3800860087010108F7007708F10078089831A2 1111 | :104F48002D20A7310130F6020130F7007708F80765 1112 | :104F58000130F7007708F9077608031DB42FB52F3D 1113 | :104F68009B2F080020005E08D9005D08D800043097 1114 | :104F78005807840059080318590A85001200DA00F6 1115 | :104F88001200DA040319C92FCA2FDA2F5E08D900D4 1116 | :104F98005D08D80004305807840059080318590AD6 1117 | :104FA8008500013F8A00003F0A00A73108006934E4 1118 | :104FB800A8345E34A8345334A8344834A8343D3473 1119 | :104FC800A8343234A83430342E34303430340034F9 1120 | :104FD8007334A9346134A9346734A9346D34A934DD 1121 | :104FE8007934A9345B34A9345534A9344F34A934FD 1122 | :104FF8004334A9344934A934323400346434003495 1123 | :10500800DC340034C2340134E834033498340834CE 1124 | :10501800303411340A340034163400342F34003458 1125 | :1050280064340034DC340034D6340134E8340334D6 1126 | :105038000034013402340434083410342034403449 1127 | :10504800603470347F34003401340234043408345A 1128 | :10505800103420344034603470347F3420342034A9 1129 | :105068005234653461346434793420342034203443 1130 | :105078000034203450345734523420346C346F3474 1131 | :1050880077342034203400342034203442347234CD 1132 | :10509800653461346B3420342034203400342034B7 1133 | :1050A800523475346E346E3469346E346734203457 1134 | :1050B80020340034773461346934743420346634ED 1135 | :1050C8002E342034483446340034203420342034FC 1136 | :1050D8002034203420342034203420342034003448 1137 | :1050E800413462346F3475347434203420342034BD 1138 | :1050F80020342034003453346534743475347034B7 1139 | :1051080020342034203420342034003443346134B3 1140 | :105118006C346934623472346134743465342034E4 1141 | :1051280000345434653473347434203420342034D7 1142 | :10513800203420342034003453346C3465346534DE 1143 | :105148007034203420342034203420340034543453 1144 | :1051580075346E3469346E34673420342034203426 1145 | :10516800203400344C346F34613464342034543483 1146 | :1051780075346E34653420340034533461347634F5 1147 | :1051880065342034543475346E3465342034003436 1148 | :1051980042347934703461347334733420342034B5 1149 | :1051A8002034203400345234653473346534743414 1150 | :1051B80020342034203420342034003459346534E9 1151 | :1051C800743441346E346F347434683465347234F2 1152 | :1051D800003473346C3465346534703469346E3437 1153 | :1051E8006734003420344234793470346134733491 1154 | :1051F8007334203400346434653473346934673468 1155 | :105208006E34653464340034483461347234643440 1156 | :105218007734613472346534003446346934723416 1157 | :105228006D3477346134723465340034453458341D 1158 | :1052380054342D34593441344634003441345434D0 1159 | :1052480055342D343134303430340034203454342F 1160 | :1052580075346E3465342034003400340034A4349A 1161 | :105268001B342B341B340034003467341C34E734CB 1162 | :1052780015340034003454342734AC3418348A34A8 1163 | :10528800A83443342634DF3405349534A8341A342A 1164 | :105298002734D5340B34A034A83481341834FE3480 1165 | :1052A8001334AB34A83467341B344634173474349D 1166 | :1052B800A834EF341A34F5341C34B634A834C63460 1167 | :1052C800253494341634C134A8342E342634943416 1168 | :1052D8001634D734A8348834253400340034CC3418 1169 | :1052E800A83419342634003400347F34A834853483 1170 | :1052F8002634BD341134003400346E342634BD34C1 1171 | :10530800113400340034083419341B340D34533448 1172 | :105318007434613472347434003453346C34653406 1173 | :10532800653470340034443465346C346134793411 1174 | :10533800003450346F3469346E347434003450346B 1175 | :105348006F34773465347234003444344734343439 1176 | :1053580053344E3400344E343734443444344334B4 1177 | :105368000034563430342E34363438340034533420 1178 | :105378006134763465340034533474346F347034A3 1179 | :1053880000344134753474346F3400344134553446 1180 | :1053980054344F3400343E344C342D3443340034C8 1181 | :1053A8003E3443342D344C34003420344F346E347E 1182 | :1053B80000344F346634663400344534733463340F 1183 | :1053C8000034503457345234003453345734523440 1184 | :1053D80000344F346B34003443343D3400344C349F 1185 | :0A53E8003D3400346234793400349F 1186 | :020000040001F9 1187 | :08000000FF3FFF3FFF3FFF3F00 1188 | :04000E00FF3FFF3F72 1189 | :10E00000000000005300740061007200740075008D 1190 | :10E0100070002000000000002000200020002000F0 1191 | :10E020002000200020002000000000002000200030 1192 | :10E030002000200020002000200020000000000020 1193 | :10E0400020002000200020002000200020002000D0 1194 | :10E050000000000020002000200020002000200000 1195 | :10E0600020002000000000002000200020002000F0 1196 | :10E0700020002000200020000000000020002000E0 1197 | :10E0800020002000200020002000200000000000D0 1198 | :10E090002000200020002000200020002000200080 1199 | :10E0A00000000000200020002000200020002000B0 1200 | :10E0B00020002000000000002000200020002000A0 1201 | :10E0C0002000200020002000E0002E00960000002C 1202 | :10E0D0001E0000000A0000001E0000008C0000006E 1203 | :08E0E0007800000000000000C0 1204 | :00000001FF 1205 | --------------------------------------------------------------------------------