Full Code of trichl/TickTagOpenSource for AI

main 2730cc4e01e6 cached
261 files
13.5 MB
3.5M tokens
205 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (14,169K chars total). Download the full file to get everything.
Repository: trichl/TickTagOpenSource
Branch: main
Commit: 2730cc4e01e6
Files: 261
Total size: 13.5 MB

Directory structure:
gitextract_c417dd8h/

├── .gitattributes
├── LICENSE
├── README.md
├── TickTag3DPrints/
│   └── REV3/
│       ├── TTHousing165mAh_Bottom.stl
│       ├── TTHousing165mAh_Lid.stl
│       ├── TTHousing30mAhV2_Bottom.stl
│       ├── TTHousing30mAhV2_Lid.stl
│       ├── TTHousing30mAh_Bottom.stl
│       ├── TTHousing30mAh_Lid.stl
│       ├── TTHousingLiPoOutside_Bottom.stl
│       └── TTHousingLiPoOutside_Lid.stl
├── TickTagAndroidApp/
│   ├── .gitignore
│   ├── .idea/
│   │   ├── codeStyles/
│   │   │   └── Project.xml
│   │   ├── gradle.xml
│   │   ├── misc.xml
│   │   ├── runConfigurations.xml
│   │   └── vcs.xml
│   ├── app/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── timm/
│   │       │               └── ticktagandroidapp/
│   │       │                   └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── timm/
│   │       │   │           └── ticktagandroidapp/
│   │       │   │               ├── LogDataStorage.java
│   │       │   │               ├── MainActivity.java
│   │       │   │               ├── RawDataStorage.java
│   │       │   │               └── StorageGeneral.java
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── ic_launcher_background.xml
│   │       │       ├── drawable-v24/
│   │       │       │   ├── chart_fade.xml
│   │       │       │   └── ic_launcher_foreground.xml
│   │       │       ├── layout/
│   │       │       │   ├── activity_decoder.xml
│   │       │       │   ├── activity_detail.xml
│   │       │       │   └── activity_main.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   └── ic_launcher.xml
│   │       │       ├── values/
│   │       │       │   ├── colors.xml
│   │       │       │   ├── strings.xml
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           └── device_filter.xml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── timm/
│   │                       └── ticktagandroidapp/
│   │                           └── ExampleUnitTest.java
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── settings.gradle
├── TickTagData/
│   ├── 01_StationaryPosition_1s_Interval/
│   │   ├── 20220221_1s_Interval_10527_fixes.csv
│   │   ├── 20220221_1s_Interval_10527_fixes.txt
│   │   ├── 20220222_1s_Interval_10842_fixes.csv
│   │   ├── 20220222_1s_Interval_10842_fixes.txt
│   │   ├── 20220302_1s_Interval_9323_fixes.csv
│   │   ├── 20220302_1s_Interval_9323_fixes.txt
│   │   ├── 20220309_1s_Interval_10069_fixes.csv
│   │   └── 20220309_1s_Interval_10069_fixes.txt
│   ├── 02_StationaryPosition_5s_Interval/
│   │   ├── 20220223_5s_Interval_2060_fixes.csv
│   │   ├── 20220223_5s_Interval_2060_fixes.txt
│   │   ├── 20220223_5s_Interval_2113_fixes.csv
│   │   └── 20220223_5s_Interval_2113_fixes.txt
│   ├── 03_StationaryPosition_30s_Interval/
│   │   ├── 20220225_30s_Interval_683_fixes.csv
│   │   ├── 20220225_30s_Interval_683_fixes.txt
│   │   ├── 20220226_30s_Interval_309_fixes.csv
│   │   └── 20220226_30s_Interval_309_fixes.txt
│   ├── 04_StationaryPosition_60s_Interval/
│   │   ├── 20220227_60s_Interval_474_fixes.csv
│   │   ├── 20220227_60s_Interval_474_fixes.txt
│   │   ├── 20220228_60s_Interval_372_fixes.csv
│   │   └── 20220228_60s_Interval_372_fixes.txt
│   ├── 05_StationaryPosition_300s_Interval/
│   │   ├── 20220301_300s_Interval_94_fixes.csv
│   │   ├── 20220301_300s_Interval_94_fixes.txt
│   │   ├── 20220302_300s_Interval_283_fixes.csv
│   │   ├── 20220302_300s_Interval_283_fixes.txt
│   │   ├── 20220304_300s_Interval_153_fixes.csv
│   │   ├── 20220304_300s_Interval_153_fixes.txt
│   │   ├── 20220307_300s_Interval_176_fixes.csv
│   │   ├── 20220307_300s_Interval_176_fixes.txt
│   │   ├── 20220310_300s_Interval_202_fixes.csv
│   │   ├── 20220310_300s_Interval_202_fixes.txt
│   │   ├── 20220311_300s_Interval_91_fixes.csv
│   │   ├── 20220311_300s_Interval_91_fixes.txt
│   │   ├── 20220312_300s_Interval_218_fixes.csv
│   │   ├── 20220312_300s_Interval_218_fixes.txt
│   │   ├── 20220312_300s_Interval_314_fixes.csv
│   │   └── 20220312_300s_Interval_314_fixes.txt
│   ├── 06_StationaryPosition_10s_Burst_Every_30s/
│   │   ├── 20220303_10s_Burst_Every_30s_5331_fixes.csv
│   │   ├── 20220303_10s_Burst_Every_30s_5331_fixes.txt
│   │   ├── 20220304_10s_Burst_Every_30s_5863_fixes.csv
│   │   └── 20220304_10s_Burst_Every_30s_5863_fixes.txt
│   ├── 07_StationaryPosition_20s_Burst_Every_120s/
│   │   ├── 20220311_20s_Burst_Every_120s_1766_fixes.csv
│   │   ├── 20220311_20s_Burst_Every_120s_1766_fixes.txt
│   │   ├── 20220311_20s_Burst_Every_120s_4656_fixes.csv
│   │   ├── 20220311_20s_Burst_Every_120s_4656_fixes.txt
│   │   ├── 20220313_20s_Burst_Every_120s_4280_fixes.csv
│   │   └── 20220313_20s_Burst_Every_120s_4280_fixes.txt
│   ├── 08_PetDogWalk_1s_Interval/
│   │   ├── 20220303_PetDog_1s_Interval_10309_fixes.csv
│   │   ├── 20220303_PetDog_1s_Interval_10309_fixes.txt
│   │   ├── 20220304_PetDog_1s_Interval_13105_fixes.csv
│   │   ├── 20220304_PetDog_1s_Interval_13105_fixes.txt
│   │   ├── 20220307_PetDog_1s_Interval_12445_fixes.csv
│   │   └── 20220307_PetDog_1s_Interval_12445_fixes.txt
│   ├── 09_PetDogWalk_10s_Burst_Every_15s/
│   │   ├── 20220308_PetDog_10s_Burst_Every_15s_7830_fixes.csv
│   │   ├── 20220308_PetDog_10s_Burst_Every_15s_7830_fixes.txt
│   │   ├── 20220309_PetDog_10s_Burst_Every_15s_7075_fixes.csv
│   │   ├── 20220309_PetDog_10s_Burst_Every_15s_7075_fixes.txt
│   │   ├── 20220311_PetDog_10s_Burst_Every_15s_6955_fixes.csv
│   │   └── 20220311_PetDog_10s_Burst_Every_15s_6955_fixes.txt
│   ├── 10_AntiPoachingHound_1s_Interval/
│   │   ├── 20220209_AntiPoachingHound_1s_Interval_5096_fixes.csv
│   │   ├── 20220209_AntiPoachingHound_1s_Interval_5096_fixes.txt
│   │   └── 20220209_AntiPoachingHound_1s_Interval_eobs.csv
│   └── 11_MyotisMyotis/
│       ├── 20210706_MyotisMyotis_Tag03_29_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag04_241_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag09_75_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag12_410_fixes.csv
│       └── 20210706_MyotisMyotis_completeDownload.txt
├── TickTagHardware/
│   ├── GerberProductionFiles/
│   │   ├── CONFIGURATION/
│   │   │   ├── PCBWay_2_layer.cam
│   │   │   └── PCBWay_2_layer_with_milling.cam
│   │   ├── TickTag-UIB/
│   │   │   └── BOMTickTag-UIB.xlsx
│   │   ├── TickTagREV3/
│   │   │   └── BOM-TickTagREV3.xls
│   │   └── TickTagREV4/
│   │       └── BOM-TickTagREV4.xlsx
│   ├── TickTag-UIB.brd
│   ├── TickTag-UIB.sch
│   ├── TickTagREV3.brd
│   ├── TickTagREV3.sch
│   ├── TickTagREV4.brd
│   └── TickTagREV4.sch
├── TickTagProgramming/
│   ├── FinalFirmwareBinaries/
│   │   ├── TickTagSoftwareBurst_V201/
│   │   │   ├── EEPROM_CAT24M01.d
│   │   │   ├── EEPROM_CAT24M01.o
│   │   │   ├── GPS_L70_Light.d
│   │   │   ├── GPS_L70_Light.o
│   │   │   ├── HelperFunctions.d
│   │   │   ├── HelperFunctions.o
│   │   │   ├── I2C.d
│   │   │   ├── I2C.o
│   │   │   ├── Makefile
│   │   │   ├── TestFunctions.d
│   │   │   ├── TestFunctions.o
│   │   │   ├── TickTag.d
│   │   │   ├── TickTag.o
│   │   │   ├── TickTagSoftwareBurst.eep
│   │   │   ├── TickTagSoftwareBurst.elf
│   │   │   ├── TickTagSoftwareBurst.hex
│   │   │   ├── TickTagSoftwareBurst.lss
│   │   │   ├── TickTagSoftwareBurst.srec
│   │   │   ├── Time.d
│   │   │   ├── Time.o
│   │   │   ├── UART.d
│   │   │   ├── UART.o
│   │   │   ├── main.d
│   │   │   ├── main.o
│   │   │   └── makedep.mk
│   │   ├── TickTagSoftwareBurst_V202_ATTINY1626/
│   │   │   ├── EEPROM_CAT24M01.d
│   │   │   ├── EEPROM_CAT24M01.o
│   │   │   ├── GPS_L70_Light.d
│   │   │   ├── GPS_L70_Light.o
│   │   │   ├── HelperFunctions.d
│   │   │   ├── HelperFunctions.o
│   │   │   ├── I2C.d
│   │   │   ├── I2C.o
│   │   │   ├── Makefile
│   │   │   ├── TestFunctions.d
│   │   │   ├── TestFunctions.o
│   │   │   ├── TickTag.d
│   │   │   ├── TickTag.o
│   │   │   ├── TickTagSoftwareBurst.eep
│   │   │   ├── TickTagSoftwareBurst.elf
│   │   │   ├── TickTagSoftwareBurst.hex
│   │   │   ├── TickTagSoftwareBurst.lss
│   │   │   ├── TickTagSoftwareBurst.srec
│   │   │   ├── Time.d
│   │   │   ├── Time.o
│   │   │   ├── UART.d
│   │   │   ├── UART.o
│   │   │   ├── main.d
│   │   │   ├── main.o
│   │   │   └── makedep.mk
│   │   └── TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/
│   │       ├── EEPROM_CAT24M01.d
│   │       ├── EEPROM_CAT24M01.o
│   │       ├── GPS_L70_Light.d
│   │       ├── GPS_L70_Light.o
│   │       ├── HelperFunctions.d
│   │       ├── HelperFunctions.o
│   │       ├── I2C.d
│   │       ├── I2C.o
│   │       ├── Makefile
│   │       ├── TestFunctions.d
│   │       ├── TestFunctions.o
│   │       ├── TickTag.d
│   │       ├── TickTag.o
│   │       ├── TickTagSoftwareBurst.eep
│   │       ├── TickTagSoftwareBurst.elf
│   │       ├── TickTagSoftwareBurst.hex
│   │       ├── TickTagSoftwareBurst.lss
│   │       ├── TickTagSoftwareBurst.srec
│   │       ├── Time.d
│   │       ├── Time.o
│   │       ├── UART.d
│   │       ├── UART.o
│   │       ├── main.d
│   │       ├── main.o
│   │       └── makedep.mk
│   ├── avrdude/
│   │   ├── ReadmeAVRDUDE.txt
│   │   ├── ScriptWriteFusesAndFirmware_V202_ATTINY1626.bat
│   │   ├── ScriptWriteFusesAndFirmware_V203_ATTINY1626_BonnetedBats.bat
│   │   ├── ScriptWriteFuses_ATTINY1616.bat
│   │   ├── ScriptWriteFuses_ATTINY1626.bat
│   │   ├── bin/
│   │   │   └── avrdude.conf
│   │   └── etc/
│   │       └── avrdude.conf
│   └── jtag2updi-master/
│       ├── LICENSE
│       ├── README.md
│       ├── avrdude.conf
│       ├── avrdude.conf.arduino
│       ├── build/
│       │   ├── JTAG2UPDI.elf
│       │   ├── JTAG2UPDI.hex
│       │   └── JTAG2UPDI.lss
│       ├── jtag2updi/
│       │   ├── JICE_io.cpp
│       │   ├── JICE_io.h
│       │   ├── JTAG2.cpp
│       │   ├── JTAG2.h
│       │   ├── NVM.h
│       │   ├── NVM_v2.h
│       │   ├── UPDI_hi_lvl.cpp
│       │   ├── UPDI_hi_lvl.h
│       │   ├── UPDI_lo_lvl.cpp
│       │   ├── UPDI_lo_lvl.h
│       │   ├── crc16.cpp
│       │   ├── crc16.h
│       │   ├── dbg.cpp
│       │   ├── dbg.h
│       │   ├── jtag2updi.cpp
│       │   ├── jtag2updi.ino
│       │   ├── parts.h
│       │   ├── sys.cpp
│       │   ├── sys.h
│       │   ├── updi_io.cpp
│       │   ├── updi_io.h
│       │   └── updi_io_soft.cpp
│       ├── make.bat
│       ├── make.sh
│       └── tools/
│           └── avrjtagicev2/
│               └── README.md
├── TickTagSerialDownload/
│   ├── README.md
│   ├── TickTag_Serial_Download.py
│   └── requirements.txt
└── TickTagSoftwareBurst/
    ├── .vs/
    │   └── TickTagSoftwareBurst/
    │       └── v14/
    │           └── .atsuo
    ├── TickTagSoftwareBurst/
    │   ├── Configuration.h
    │   ├── EEPROM_CAT24M01.cpp
    │   ├── EEPROM_CAT24M01.h
    │   ├── GPS_L70_Light.cpp
    │   ├── GPS_L70_Light.h
    │   ├── HelperFunctions.cpp
    │   ├── HelperFunctions.h
    │   ├── I2C.cpp
    │   ├── I2C.h
    │   ├── TestFunctions.cpp
    │   ├── TestFunctions.h
    │   ├── TickTag.cpp
    │   ├── TickTag.h
    │   ├── TickTagSoftwareBurst.componentinfo.xml
    │   ├── TickTagSoftwareBurst.cppproj
    │   ├── Time.cpp
    │   ├── Time.h
    │   ├── UART.cpp
    │   ├── UART.h
    │   └── main.cpp
    └── TickTagSoftwareBurst.atsln

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2022 trichl

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<img src="https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/icon.png" width="100">

# I Repository Introduction
This repository contains the entire production-ready design (hardware, software, user interface, 3D-printable housing, assembly instructions) of the open-source TickTag GPS logger.

# II Hardware Production
* See sub folder [TickTagHardware](TickTagHardware)
* Schematics (.sch) and boards (.brd) are designed in Autodesk Eagle 9.5.2
* PCBs were produced and assembled by [PCBWay](https://www.pcbway.com) (production-ready Gerber files and PCBWay settings in [TickTagHardware/GerberProductionFiles](TickTagHardware/GerberProductionFiles))
* Production settings:
   * **REV3**: 24.9 x 10.5 mm, 2 layers, 0.15 mm thickness (flex), 0.35 mm min hole size, immersion gold (ENIG) surface finish (1U"), 0.06 mm min track spacing, 1 oz Cu finished copper, polyimide flex material

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3.jpg?raw=true)

   * **REV4**: 23.61 x 10.06 mm, 2 layers, 0.2 mm thickness, 0.25 mm min hole size, immersion gold (ENIG) surface finish (1U"), tenting vias, 5/5 mil min track spacing, 1 oz Cu finished copper, FR-4 TG150 material

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev4top.png?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev4bottom.png?raw=true)

   * **User interface board**: 66.4 x 17.8 mm, 2 layers, 1 mm thickness, 0.3 mm min hole size, immersion gold (ENIG) surface finish (1U"), tenting vias, 6/6 mil min track spacing, 1 oz Cu finished copper, FR-4 TG130 material
* Differences between REV3 and REV4:
   * 0.2 mm PCB instead of 0.15 mm (more robust)
   * PCB slots instead of pads for soldering LiPos directly to the PCB
   * New load switch (SiP32431DNP3-T1GE4), as the old load switch has long lead times
   * Reduced the footprint sizes of some of the capacitors and resistors from 0402 to 0201

# III Programming and Assembly

## IDE for Software Development (Windows)
* Atmel Studio 7.0: https://www.microchip.com/en-us/tools-resources/develop/microchip-studio
* Programming language: C / C++

## Android App
* Developed in Android Studio 3.5.1: https://developer.android.com/studio

## Using an Arduino Nano for Flashing
* Follow the instructions on https://github.com/ElTangas/jtag2updi
* The 4.7k resistor is already integrated on the user interface board and does not need to be added
* Alternatively software can be flashed with the official Atmel-ICE: https://www.microchip.com/en-us/development-tool/ATATMEL-ICE

## Flashing the Firmware
Flashing should be done before soldering a battery to the tag.

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uibsettings3.png?raw=true)

1. Check if the yellow jumper (E) connects "1" and "2" ("ldo")
2. Gently click the tag on the user interface board (without battery attached to it) (A), mind the correct orientation of the tag
3. Connect D6 of the Arduino Nano to the UPDI pin of the user interface board (or use an Atmel-ICE instead of an Arduino Nano)
4. Connect the user interface board to a computer (red LED turns on) (G), connect the Arduino Nano to the same computer
5. Slide the UPDI button on the user interface board (H) to ON
6. Go to [TickTagProgramming/avrdude](TickTagProgramming/avrdude), open ScriptWriteFuses_ATTINY1626.bat (or ScriptWriteFuses_ATTINY1616.bat, if you use the 1616) with a text editor and enter the COM port of the Arduino Nano on your computer
7. Execute ScriptWriteFuses_ATTINY1626.bat to write the configuration fuses of the ATTINY.
( It may be possible that executing the script raises an error ie. missing dll file. In this case, try to download and install WinAVR [here](https://sourceforge.net/projects/winavr/) )
8. Open Atmel Studio 7.0 and load the project [TickTagSoftwareBurst](TickTagSoftwareBurst) (you might need to setup the project first, and set the current device to ATtiny1626)
9.  
    1.  Configure the ATTINY programming via Arduino Nano under Tools -> External Tools
    2.  To choose the command, select the three dots and find the location of the TickTagOpenSource repository. Then navigate to TickTagProgramming\avrdude\bin and select avrdude.exe
    3.  For the Arguments: "-P COM7 -c jtag2updi -p t1626 -U flash:w:$(ProjectDir)Debug\\$(TargetName).hex:i", COM7 needs to be replaced with the COM port of the Arduino Nano:

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/atmelconfig.png?raw=true)

10. Press F7 to compile the firmware
11. Press Tools -> jtag2updi ATtiny1626 to flash the firmware

## Tag Assembly

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3soldered.jpg?raw=true)

* If the firmware is successfully flashed onto the microcontroller you can solder a battery to the TickTag battery terminals (plus and minus is written on the tag)
* No battery protection circuit is needed, the battery is protected by software
* You can use a glass fiber pen to roughen the LiPo tabs, which makes soldering of the aluminium tabs more easy (e.g., with a Laeufer 69119 pen)
* Keep the soldering work on the LiPo very short, otherwise the battery might be damaged due to high temperatures
* Keep the area below the TickTag as flat as possible, otherwise you might not be able to click the tag on the user interface board anymore

# IV Tag Manual

## Charging the Battery
**WARNING**: never connect the TickTag to the user interface board when the 3-pin jumper is set to "ldo", otherwise the LiPo will be damaged permanently. The battery can be recharged directly on the breakout board:

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uib2.jpg?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uibsettings1.png?raw=true)

1. Check if the yellow jumper connects (E) "3" and "2" ("lipo")
2. Gently click the tag on the user interface board (with battery attached to it) (A), mind the correct orientation of the tag
3. Connect the USB connector to a computer or powerbank (red LED turns on) (G)
4. Slide the charge button on the user interface board (F) to the left (ON)
5. A green LED on the user interface board turns on and indicates that the battery is being charged
6. In case the tag was previously activated, it first needs to be deactivated:
   * Wait some minutes until battery is charged a bit
   * Press the white button (D) for 5 seconds to restart the tag and enter menue
   * Green LED on the tag will blink 5 times to indicate download mode and system restart
7. Wait until the green LED on the user interface board turns off (battery charged)
   * This can take hours (default charge current: 15 mA)
   * For example: an empty 30 mAh lipo battery needs 2 hours to be fully charged
   * For example an empty 120 mAh lipo battery needs 8 hours to be fully charged
8. The tag can be activated again (see chapter "Activation")
   * Warning: If the memory is full the tag can not be reactivated (data download necessary, see chapter "Data Download, Configuration and Memory Reset")

## Activation
* Prerequisites
   * The tags need to be connected to a charged lithium polymer battery (plus and minus pads on the tag are soldered to the battery)
   * If the battery voltage is too low, the tag won’t start (please charge the battery), see chapter "Charge Battery"
   * If the data memory is full, the tag won't start (please download the data and reset the memory), see chapter "Data Download, Configuration and Memory Reset"
   * Check the location of the green LED on the tag (it will give you visual feedback):

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3led.jpg?raw=true)

### Activation option 1: by a wire

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3activation1.jpg?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/activationwire.png?raw=true)

1. Gently touch with one end of a conducting wire the ground connection where the battery minus is soldered to
2. Gently touch with the other end of the wire the hole marked with "A" (or "ST")
3. Once the tag starts blinking green, remove the wire immediately (should not take longer than 2 seconds)
4. The tag blinks 7 times to indicate that it’s activated, then waits for 700 ms and is blinking again to indicate battery status (1 time = battery low, 7 times = battery is full)
5. The green LED is located on the back side of the tag, so it's best to hold the breakout board sideways to see the blinking LED under the tag
6. If it doesn't blink at all: battery voltage might be low or the tag is already activated
7. If the tag blinks 5 times it entered download mode (was already activated), please wait a minute and start again from the beginning
8. The tag is activated and will start sampling GPS data after 10 seconds (default configuration, can be changed, see chapter "Data Download, Configuration and Memory Reset")

### Activation option 2: on breakout board

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3click.jpg?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uibsettings1.png?raw=true)

1. Locate the click connector on the tag (see picture above)
2. Take a look at the breakout board, do not connect the USB power connector (G) to the computer or phone (no external power needed for activation)
3. Gently click the tag on the user interface board (with battery attached to it) (A), mind the correct orientation of the tag
      * Take care of the correct orientation of the tag as shown in the photo, otherwise a short circuit might permanently damage the tag
4. Now press the white button (D) for two seconds until the tag starts to blink
      * Do not press the button longer than some seconds
      * The tag blinks 7 times to indicate that it’s activated, then waits for 700 ms and is blinking again to indicate battery status (1 time = battery low, 7 times = battery is full)
      * The green LED is located on the back side of the tag, so it's best to hold the breakout board sideways to see the blinking LED under the tag
      * If it doesn't blink at all: battery voltage might be low or the tag is already activated
      * If the tag blinks 5 times it entered download mode (was already activated), please wait a minute and start again from the beginning
5. The tag is activated and will start sampling GPS data after 10 seconds (default configuration, can be changed, see chapter "Data Download, Configuration and Memory Reset")

## After the Activation (Data Sampling)
* After the activation delay, the tag starts blinking green every second and tries to get the current time via GPS satellites. If it can’t obtain the time within 120 seconds, it will sleep for 15 minutes and will try again.
   * **IMPORTANT**: If blinking configuration is set to false the tag will completely stop blinking at all after getting the current UTC time
   * If you have configured the tag to only sample GPS at certain times:
       * **IMPORTANT**: Before attaching the tag to the animal (e.g., the day before): go outside, activate the tag, wait until it starts blinking, wait until the green LED stays on for 2 seconds (tag got the time and went to sleep mode).
* The tag samples GPS data (continuously or from time to time, depending on the configuration)
* The module deactivates itself if the battery voltage is low (default configuration: 3.3V) or if the memory is full (maximum 13,100 fixes)

## On-Animal Mounting
* **IMPORTANT**: The small antenna of the TickTag is disturbed by any electrically conducting material nearby, so keep the antenna away from other tags, VHF/UHF tags, batteries, screws or similar materials (at least 5 cm).
* **IMPORTANT**: The antenna can easily break if bent too strong. Try to protect the antenna with a 3D-printed housing (for example with ASA material).
* **IMPORTANT**: The battery needs to be located behind the tag (see picture below), never under the tag, as it will disturb the antenna.
* **IMPORTANT**: Mount the tag on the flat side (connector facing down, top side with antenna facing the sky). The photo shows the top side that should face the sky:

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/antenna.png?raw=true)

* **IMPORTANT**: Do not glue anything on the connector that can't be removed, otherwise data cannot be downloaded (Bostik Blu Tack is a glue that can be easily removed afterwards):

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/rev3click.jpg?raw=true)

## Data Download, Configuration and Memory Reset

![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uibsettings1.png?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/uibphone.jpg?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/termite.png?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/mobaxterm.png?raw=true)
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/app.png?raw=true)

1. Choose a serial software
   * **Option 1**: Download a serial program for your computer
       * For example (Windows 10): Termite: https://www.compuphase.com/software_termite.htm (see screenshot above for configuration)
       * For example (Windows 10): MobaXTerm: https://mobaxterm.mobatek.net/ (see screenshot above for configuration)
       * The Arduino Serial Monitor also works fine
   * **Option 2**: Use the TickTag Android app [TickTagAndroidApp](TickTagAndroidApp) and an USB OTG adapter to connect the breakout board with the phone
2. The battery needs to be connected (soldered) to the tag
3. Check if the yellow jumper connects (E) "3" and "2" ("lipo")
4. Gently click the tag on the user interface board (with battery attached to it) (A), mind the correct orientation of the tag
5. Connect the USB connector to a computer or Android phone (red LED turns on) (G)
6. Slide the charge button on the user interface board (F) to the left (ON) to charge the battery while downloading data (not mandatory, but recommended)
7. **For option 1**: Open the serial program on your computer with following settings:
   * COM port: select the CP2104N COM port from the list
   * Baud rate: 9600
   * Default serial settings (8 data bits, 1 stop bit, no parity)
8. Click on CONNECT in your serial program or the Android app
9. Press the download button (D) for 5 seconds (not longer) until the green LED on the tag blinks for 5 times
10. Data download is shown in your serial program (in CSV format)
11. After the download the tag shows a little menu for configuration
       * Data download might take some minutes (if memory is full)
       * Data download can be interrupted by pressing the download button once (short), data will not be deleted
12. In the command line of your serial program enter "1" and press return to reset the memory (when using the Android app: press the "Reset memory" button)
13. The tag will confirm that the memory is now empty
14. The tag will restart into the activation state after some time (waiting on tag activation, see chapter "Activation")

Example data output of the serial program (or Android app):

```
---TICK-TAG---
*START MEMORY*
UVs: 0, TOs: 0/0, ErrorsOrGF: 0, TTFF: 68
Fixes: 10, Avg. TTF: 11 s, Avg. HDOP (x10): 16
count,timestamp,lat,lon
1,1635235981,47.74340,8.99910
2,1635236130,47.74346,8.99922
3,1635236352,47.74340,8.99889
4,1635236506,47.74327,8.99894
5,1635236682,47.74336,8.99879
6,1635238092,47.74340,8.99824
7,1635238313,47.74304,8.99896
8,1635238411,47.74329,8.99883
9,1635238511,47.74332,8.99878
10,1635238610,47.74325,8.99881
*END MEMORY*
V201, ID: 30-2509, 3533mV, 01b
SETTINGS:
- Min voltage: 3300 mV
- Frequency: 90 s
- Min HDOP (x10): 30
- Activation delay: 60 s
- Geofencing: 0
- Burst duration: 0 s
- Time: 8:00 - 14:00 UTC

0 Read memory
1 Reset memory
2 Set min. voltage
3 Set frequency
4 Set accuracy
5 Set activation delay
6 Set times
7 Toggle geofencing ON/OFF
8 Set burst duration
9 Exit
```

## Configuration Parameters
* **Read memory**: printing all stored GPS fixes as CSV-compatible list (count, timestamp in UTC, latitude, longitude)
* **Reset memory**: deleting all stored GPS fixes
* **Min. voltage (3000 - 4250, in mV)**: recording is stopped when battery voltage (open-circuit, no load) drops below that threshold
* **Frequency (1 - 16382, in s)**: GPS fix attempt frequency, between 1 and 5 s the TickTag keeps the GPS module constantly powered and puts the device in fitness low power mode
* **Accuracy (1 - 250, HDOP x 10)**: HDOP value (times 10, 30 = 3.0) that tries to be achieved within 9 seconds after getting the first positional estimate
* **Activation delay (10 - 16382, in s)**: delay after activation before the tag starts recording data
* **Sampling times (0000 - 2359, time within day)**: daily recording time window
* **Geo-fencing (true/false)**: if set to true the first GPS fix becomes the home location and only fixes outside a 300 m radius are stored (10 min hibernation afterwards)
* **Blinking (true/false)**: if set to true the tag blinks every second when GPS is active

## Default Configuration
* After flashing the firmware the default configuration is set to:
* **Min. voltage (3000 - 4250, in mV)**: 3000
* **Frequency (1 - 16382, in s)**: 30
* **Accuracy (1 - 250, HDOP x 10)**: 30
* **Activation delay (10 - 16382, in s)**: 10
* **Sampling times (0000 - 2359, time within day)**: always on
* **Geo-fencing (true/false)**: false
* **Blinking (true/false)**: false

## State Machine
![Image](https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/statemachine.png?raw=true)

# V Data Compression Algorithm
GPS data is stored on the 128 kByte EEPROM with a lossless compression algorithm. GPS positions are stored with 5 decimal places (accuracy: 1.11 m).

* **Latitute (A)**: stored in 25 Bit (unsigned): compressedLatitude = (latitude * 100000) + 9000000
* **Longitude (B)**: stored in 26 Bit (unsigned): compressedLongitude = (longitude * 100000) + 18000000
* **Timestamp (C)**: stored in 29 Bit  (unsigned): compressedTimestamp = timestamp - 1618428394
* Storage pattern of Bits: **AAAAAAAA AAAAAAAA AAAAAAAA ABBBBBBB BBBBBBBB BBBBBBBB BBBCCCCC CCCCCCCC CCCCCCCC CCCCCCCC**
* Total length: 10 Byte per GPS fix

# VI 3D-printed Housings
* Check [TickTag3DPrints](TickTag3DPrints) for .STL files (designed in Fusion 360)
* Housings were printed with ASA filament on a Prusa Mini (0.4 mm nozzle)
* PrusaSlider 2.2.0 settings: 0.45 mm extrusion width, 0.10 mm DETAIL settings

# VII Data
* Check [TickTagData](TickTagData) for data results


================================================
FILE: TickTagAndroidApp/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx


================================================
FILE: TickTagAndroidApp/.idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <code_scheme name="Project" version="173">
    <codeStyleSettings language="XML">
      <indentOptions>
        <option name="CONTINUATION_INDENT_SIZE" value="4" />
      </indentOptions>
      <arrangement>
        <rules>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>xmlns:android</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>xmlns:.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*:id</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*:name</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>name</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>style</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
              <order>ANDROID_ATTRIBUTE_ORDER</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>.*</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
        </rules>
      </arrangement>
    </codeStyleSettings>
  </code_scheme>
</component>

================================================
FILE: TickTagAndroidApp/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <compositeConfiguration>
          <compositeBuild compositeDefinitionSource="SCRIPT" />
        </compositeConfiguration>
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="resolveModulePerSourceSet" value="false" />
        <option name="testRunner" value="PLATFORM" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: TickTagAndroidApp/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: TickTagAndroidApp/.idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: TickTagAndroidApp/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
  </component>
</project>

================================================
FILE: TickTagAndroidApp/app/.gitignore
================================================
/build


================================================
FILE: TickTagAndroidApp/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.timm.ticktagandroidapp"
        minSdkVersion 25
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'org.nanohttpd:nanohttpd:2.3.1'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'

    implementation 'com.github.mik3y:usb-serial-for-android:3.4.2'
}


================================================
FILE: TickTagAndroidApp/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: TickTagAndroidApp/app/src/androidTest/java/com/timm/ticktagandroidapp/ExampleInstrumentedTest.java
================================================
package com.timm.ticktagandroidapp;

import android.content.Context;

import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        assertEquals("com.timm.ticktagandroidapp", appContext.getPackageName());
    }
}


================================================
FILE: TickTagAndroidApp/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.timm.ticktagandroidapp"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-feature android:name="android.hardware.usb.host"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.timm.ticktagandroidapp.MainActivity"
            android:configChanges="orientation"
            android:screenOrientation="portrait"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>
    </application>

</manifest>

================================================
FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/LogDataStorage.java
================================================
package com.timm.ticktagandroidapp;

import android.content.Context;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

public class LogDataStorage {

    private static final String LOGFILENAME = "tickTagLog.txt";

    public static String logText(Context context, String text) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        String currentDateandTime = sdf.format(new Date());
        String fullFileName = StorageGeneral.getStorageDirectory(context) + "/" + currentDateandTime + "_" + LOGFILENAME;
        File fileToLogTo = new File(fullFileName);

        if(fileToLogTo.exists()) { return ""; }

        try {
            fileToLogTo.createNewFile();
        } catch (IOException e) {
            return "";
        }
        try {
            FileOutputStream stream = new FileOutputStream(fullFileName, true);
            stream.write(text.getBytes(Charset.forName("UTF-8")));
            stream.close();
        } catch (IOException e1) {
            return "";
        }

        return fullFileName;
    }
}


================================================
FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/MainActivity.java
================================================
package com.timm.ticktagandroidapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.InsetDrawable;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.InputType;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.util.SerialInputOutputManager;

import java.io.IOException;
import java.util.List;

public class MainActivity extends AppCompatActivity implements SerialInputOutputManager.Listener {
    private String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
    SerialInputOutputManager usbIoManager;

    Button bStartStop, bStoreOutput, bOpenDownloads, bClearOutput;
    Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, bEnter, bReadMemory, bReset, bSetVoltage, bSetFrequency, bSetAccuracy, bSetDelay, bSetHour, bToggleGeofencing, bToggleBlinking, bSetBurstDuration, bExit;
    TextView tOutput, tHeadline;
    RelativeLayout rLoadingPanel;
    LinearLayout lAlertPressButton, lAlertNotConnected, lButtons, lButtons2;
    ScrollView scScroll;
    UsbSerialPort usbPort = null;
    Thread thread;

    boolean tickTagConnected = false;

    private void checkPermissions() {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if(this.checkSelfPermission(Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
                if(!this.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_SETTINGS)) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("This app needs background location access");
                    builder.setMessage("Please grant location access so this app can detect beacons in the background.");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                        @TargetApi(23)
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS}, 0);
                        }

                    });
                    builder.show();
                }
                else {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Functionality limited");
                    builder.setMessage("Since background location access has not been granted, this app will not be able to discover beacons in the background.  Please go to Settings -> Applications -> Permissions and grant background location access to this app.");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {}
                    });
                    builder.show();
                }
            }
        }
    }

    public void showMessage(String headline, String text) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(headline);
        builder.setMessage(text);
        builder.setPositiveButton(android.R.string.ok, null);
        builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {}
        });
        builder.show();
    }

    void setButtonConnected() {
        bStartStop.setText("DISCONNECT");
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP && bStartStop instanceof AppCompatButton) {
            // don't change color
        } else {
            bStartStop.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#B9F6CA")));
        }
        lAlertPressButton.setVisibility(View.VISIBLE);
        lAlertNotConnected.setVisibility(View.GONE);
        //lButtons.setVisibility(View.VISIBLE);
        lButtons2.setVisibility((View.VISIBLE));
    }

    void setButtonDisconnected() {
        bStartStop.setText("CONNECT");
        if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP && bStartStop instanceof AppCompatButton) {
            // don't change color
        } else {
            bStartStop.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#FF80AB")));
        }
        lAlertPressButton.setVisibility(View.GONE);
        lAlertNotConnected.setVisibility(View.VISIBLE);
        //lButtons.setVisibility(View.GONE);
        lButtons2.setVisibility((View.GONE));
    }

    @Override
    protected void onPause() {
        //Toast.makeText(this, "Gateway is still running in background!", Toast.LENGTH_LONG).show();
        super.onPause();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public void updateHeadlineText() {
        if(tHeadline != null)
            tHeadline.setText("TickTag Android App\nFree memory: " + StorageGeneral.getAvailableInternalMemorySizeAsStringInMByte() + " MByte");
    }

    private void setAlertWindows() {
        lAlertPressButton.setVisibility(View.GONE);
        lAlertNotConnected.setVisibility(View.GONE);
    }

    @Override
    public void onNewData(final byte[] data) {
        //System.out.println(new String(data));
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tOutput.append(new String(data));
                lAlertPressButton.setVisibility(View.GONE);
                scScroll.post(new Runnable() {
                    public void run() {
                        scScroll.fullScroll(ScrollView.FOCUS_DOWN);
                    }
                });
            }
        });
    }

    @Override
    public void onRunError(Exception e) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showMessage("Disconnected", "USB disconnected!");
                tickTagConnected = false;
                setButtonDisconnected();
            }
        });
    }

    void checkIfUSBConnectable() {
        setButtonDisconnected();

        // Find all available drivers from attached devices.
        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
        if(availableDrivers.isEmpty()) {
            showMessage("UIB not connected", "Could not detect a user interface board at the USB port of the phone! Please attach the TickTag to the user interface board and then connect it via USB OTG cable to your phone.");
            return;
        }

        // Open a connection to the first available driver.
        UsbSerialDriver driver = availableDrivers.get(0);
        UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
        if(connection == null) {
            PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(INTENT_ACTION_GRANT_USB), 0);
            manager.requestPermission(driver.getDevice(), usbPermissionIntent);
        }

        usbPort = driver.getPorts().get(0); // Most devices have just one port (port 0)
        try {
            usbPort.open(connection);
        } catch (IOException e) {
            e.printStackTrace();
            showMessage("Error", "Could not open the serial port!");
            return;
        }
        try {
            usbPort.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
        } catch (IOException e) {
            e.printStackTrace();
            showMessage("Error", "Could not set serial parameters!");
            return;
        }

        usbIoManager = new SerialInputOutputManager(usbPort, MainActivity.this);
        usbIoManager.start();

        setButtonConnected();
        tickTagConnected = true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getSupportActionBar().hide();
        setContentView(R.layout.activity_main);

        bStartStop = findViewById(R.id.bstartstop);
        bStoreOutput = findViewById(R.id.bstoreoutput);
        bClearOutput = findViewById(R.id.bclearoutput);
        bOpenDownloads = findViewById(R.id.bopendownloads);
        tOutput = findViewById(R.id.toutput);
        rLoadingPanel = findViewById(R.id.rloadingpanel);
        tHeadline = findViewById(R.id.theadline);
        scScroll = findViewById(R.id.scscroll);
        lAlertPressButton = findViewById(R.id.lalertpressbutton);
        lAlertNotConnected = findViewById(R.id.lalertnotconnected);
        lButtons = findViewById(R.id.lbuttons);
        lButtons2 = findViewById(R.id.lbuttons2);

        b0 = findViewById(R.id.b0);
        b1 = findViewById(R.id.b1);
        b2 = findViewById(R.id.b2);
        b3 = findViewById(R.id.b3);
        b4 = findViewById(R.id.b4);
        b5 = findViewById(R.id.b5);
        b6 = findViewById(R.id.b6);
        b7 = findViewById(R.id.b7);
        b8 = findViewById(R.id.b8);
        b9 = findViewById(R.id.b9);
        bEnter = findViewById(R.id.benter);

        bReadMemory = findViewById(R.id.bread);
        bReset  = findViewById(R.id.breset);
        bSetVoltage = findViewById(R.id.bsetvoltage);
        bSetFrequency = findViewById(R.id.bsetfrequency);
        bSetAccuracy = findViewById(R.id.bsetaccuracy);
        bSetDelay = findViewById(R.id.bsetdelay);
        bSetHour = findViewById(R.id.bsethour);
        bToggleGeofencing = findViewById(R.id.btogglegeofencing);
        bToggleBlinking = findViewById(R.id.btoggleblinking);
        bSetBurstDuration = findViewById(R.id.bsetburstduration);
        bExit = findViewById(R.id.bexit);

        rLoadingPanel.setVisibility(View.GONE);

        setAlertWindows();
        updateHeadlineText();
        checkIfUSBConnectable();

        /*thread = new Thread() {
            @Override
            public void run() {
                try {
                    while(!thread.isInterrupted()) {
                        Thread.sleep(1000);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                scScroll.post(new Runnable() {
                                    public void run() {
                                        scScroll.fullScroll(ScrollView.FOCUS_DOWN);
                                    }
                                });
                            }
                        });
                    }
                } catch (InterruptedException e) {}
            }
        };
        thread.start();*/

        bStartStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(tickTagConnected) {
                    if(usbPort != null) {
                        try {
                            usbPort.close(); // triggers onRunError

                        } catch (IOException e) {
                            e.printStackTrace();
                            showMessage("Error", "Could not close USB port!");
                        }
                    }
                }
                else {
                    checkIfUSBConnectable();
                }
            }
        });

        bClearOutput.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tOutput.setText("");
                //tOutput.append("Hallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\nHallo\n");
                Toast.makeText(MainActivity.this, "Output cleared!", Toast.LENGTH_LONG).show();
            }
        });

        bStoreOutput.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(tOutput.getText().toString().isEmpty()) {
                    Toast.makeText(MainActivity.this, "Output is empty, nothing to store!", Toast.LENGTH_LONG).show();
                }
                else {
                    String outputString = tOutput.getText().toString();
                    outputString = outputString.replace("\r", "");
                    String storedTo = LogDataStorage.logText(MainActivity.this, outputString);
                    if (storedTo.length() > 0) {
                        showMessage("Saved", "Output stored to: " + storedTo);
                    } else {
                        showMessage("Error", "Could not store output!");
                    }
                }
            }
        });

        bOpenDownloads.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri selectedUri = Uri.parse(MainActivity.this.getExternalFilesDir(null).getPath());
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(selectedUri, "resource/folder");
                if(intent.resolveActivityInfo(getPackageManager(), 0) != null) {
                    startActivity(intent);
                }
                else {
                    Toast.makeText(MainActivity.this, "No app found to view folders, please download a file manager", Toast.LENGTH_LONG).show();
                }
            }
        });


        b0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "0";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "1";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "2";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "3";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "4";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "5";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "6";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "7";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b8.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "8";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        b9.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "9";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        bEnter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "\n\r";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        bReadMemory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(tickTagConnected) {
                            String input = "0\n\r";
                            tOutput.append(input);
                            try {
                                usbPort.write(input.getBytes(), 100);
                                Toast.makeText(MainActivity.this, "Download might take a while! Press 'Store Output' afterwards to store downloaded data as text file.", Toast.LENGTH_LONG).show();
                            } catch (IOException e) {
                                e.printStackTrace();
                                Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        }
                        else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                    }
                });
            }
        });

        bReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Do you really want to reset the memory of the TickTag? All GPS data will be deleted.");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    String input = "1\n\r";
                                    tOutput.append(input);
                                    try {
                                        usbPort.write(input.getBytes(), 100);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                        Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                    }
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetVoltage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Enter mV");
                final EditText input = new EditText(MainActivity.this);
                input.setInputType(InputType.TYPE_CLASS_NUMBER);
                input.setRawInputType(Configuration.KEYBOARD_12KEY);
                input.setHint("3000 - 4250");
                alert.setView(input);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String sendText = input.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    if(sendText.length() > 0) {
                                        String input = "2\n\r";
                                        tOutput.append(input);
                                        try {
                                            usbPort.write(input.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                        final String input2 = sendText + "\n\r";
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetFrequency.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Enter GPS frequency in seconds (1 - 5 = stay-on)");
                final EditText input = new EditText(MainActivity.this);
                input.setInputType(InputType.TYPE_CLASS_NUMBER);
                input.setRawInputType(Configuration.KEYBOARD_12KEY);
                input.setHint("1 - 16382");
                alert.setView(input);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String sendText = input.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    if(sendText.length() > 0) {
                                        String input = "3\n\r";
                                        tOutput.append(input);
                                        try {
                                            usbPort.write(input.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                        final String input2 = sendText + "\n\r";
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetAccuracy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Enter accuracy (HDOP x 10, 30 = 3.0)");
                final EditText input = new EditText(MainActivity.this);
                input.setInputType(InputType.TYPE_CLASS_NUMBER);
                input.setRawInputType(Configuration.KEYBOARD_12KEY);
                input.setHint("10 - 250");
                alert.setView(input);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String sendText = input.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    if(sendText.length() > 0) {
                                        String input = "4\n\r";
                                        tOutput.append(input);
                                        try {
                                            usbPort.write(input.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                        final String input2 = sendText + "\n\r";
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetDelay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Enter activation delay in seconds");
                final EditText input = new EditText(MainActivity.this);
                input.setInputType(InputType.TYPE_CLASS_NUMBER);
                input.setRawInputType(Configuration.KEYBOARD_12KEY);
                input.setHint("10 - 16382");
                alert.setView(input);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String sendText = input.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    if(sendText.length() > 0) {
                                        String input = "5\n\r";
                                        tOutput.append(input);
                                        try {
                                            usbPort.write(input.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                        final String input2 = sendText + "\n\r";
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetHour.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Set ON/OFF hour");

                final EditText inputOn = new EditText(MainActivity.this);
                inputOn.setInputType(InputType.TYPE_CLASS_NUMBER);
                inputOn.setRawInputType(Configuration.KEYBOARD_12KEY);
                inputOn.setHint("UTC time to turn ON (format: HHMM)");

                final EditText inputOff = new EditText(MainActivity.this);
                inputOff.setInputType(InputType.TYPE_CLASS_NUMBER);
                inputOff.setRawInputType(Configuration.KEYBOARD_12KEY);
                inputOff.setHint("UTC time to turn OFF (format: HHMM)");

                LinearLayout lay = new LinearLayout(MainActivity.this);
                lay.setOrientation(LinearLayout.VERTICAL);
                lay.addView(inputOn);
                lay.addView(inputOff);

                alert.setView(lay);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String onText = inputOn.getText().toString();
                        final String offText = inputOff.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "TEST: " + onText, Toast.LENGTH_LONG).show();
                                if(tickTagConnected) {
                                    if((onText.length() > 0) && (offText.length() > 0)) {
                                        final String input1 = "6\n\r";
                                        final String input2 = onText + "\n\r";
                                        final String input3 = offText + "\n\r";

                                        // input 1
                                        tOutput.append(input1);
                                        try {
                                            usbPort.write(input1.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }

                                        // input 2
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                    return;
                                                }
                                                // input 3
                                                new Handler().postDelayed(new Runnable() {
                                                    @Override
                                                    public void run() {
                                                        tOutput.append(input3);
                                                        try {
                                                            usbPort.write(input3.getBytes(), 100);
                                                        } catch (IOException e) {
                                                            e.printStackTrace();
                                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                            return;
                                                        }
                                                    }
                                                }, 500);
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bToggleGeofencing.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Do you want to toggle geofencing mode ON/OFF?");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    String input = "7\n\r";
                                    tOutput.append(input);
                                    try {
                                        usbPort.write(input.getBytes(), 100);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                        Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                    }
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bSetBurstDuration.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Enter burst duration in seconds");
                final EditText input = new EditText(MainActivity.this);
                input.setInputType(InputType.TYPE_CLASS_NUMBER);
                input.setRawInputType(Configuration.KEYBOARD_12KEY);
                input.setHint("0 - 250");
                alert.setView(input);
                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String sendText = input.getText().toString();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    if(sendText.length() > 0) {
                                        String input = "8\n\r";
                                        tOutput.append(input);
                                        try {
                                            usbPort.write(input.getBytes(), 100);
                                        } catch (IOException e) {
                                            e.printStackTrace();
                                            Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                        final String input2 = sendText + "\n\r";
                                        new Handler().postDelayed(new Runnable() {
                                            @Override
                                            public void run() {
                                                tOutput.append(input2);
                                                try {
                                                    usbPort.write(input2.getBytes(), 100);
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                    Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        }, 500);
                                    }
                                    else Toast.makeText(MainActivity.this, "Invalid input!", Toast.LENGTH_LONG).show();
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bToggleBlinking.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Do you want to toggle blinking mode ON/OFF?");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    String input = "b\n\r";
                                    tOutput.append(input);
                                    try {
                                        usbPort.write(input.getBytes(), 100);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                        Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                    }
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });

        bExit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                alert.setTitle("Do you want to exit the menu (TickTag goes to sleep until activation)?");
                alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(tickTagConnected) {
                                    String input = "9\n\r";
                                    tOutput.append(input);
                                    try {
                                        usbPort.write(input.getBytes(), 100);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                        Toast.makeText(MainActivity.this, "Failed to send command to TickTag!", Toast.LENGTH_LONG).show();
                                    }
                                }
                                else Toast.makeText(MainActivity.this, "Not connected to TickTag!", Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { }
                });
                alert.show();
            }
        });
    }
}


================================================
FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/RawDataStorage.java
================================================
package com.timm.ticktagandroidapp;

import android.content.Context;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

class RawDataStorage {
    private static final String FILENAME_BASE = "ESP32Data.bin";

    private File fileToStoreTo;
    private String fullFileName = "";
    private String fileNameWithoutDirectory = "";
    private int selectedItem;

    public String getStoragePath() {
        return fullFileName;
    }

    public String getFileNameWithoutDirectory() {
        return fileNameWithoutDirectory;
    }

    public void testWrite() {
        byte[] fileContent = new byte[20];
        for(int i=0; i<20; i++) {
            fileContent[i] = (byte) i;
        }
        writeToFile(fileContent);
    }

    public boolean writeToFile(byte[] data) {
        if(fileToStoreTo == null) return false;
        if(!fileToStoreTo.exists()) {
            try {
                fileToStoreTo.createNewFile();
            } catch (IOException e) {
                return false;
            }
        }
        try {
            FileOutputStream stream = new FileOutputStream(fullFileName, true);
            stream.write(data);
            stream.close();
        } catch (IOException e1) {
            return false;
        }
        return true;
    }

    public RawDataStorage(Context context) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        String currentDateandTime = sdf.format(new Date());
        fullFileName = StorageGeneral.getStorageDirectory(context) + "/" + currentDateandTime + "_" + FILENAME_BASE;
        fileNameWithoutDirectory = currentDateandTime + "_" + FILENAME_BASE;
        fileToStoreTo = new File(fullFileName);
    }
}


================================================
FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/StorageGeneral.java
================================================
package com.timm.ticktagandroidapp;

import android.content.Context;
import android.os.Environment;
import android.os.StatFs;

import java.io.File;

public class StorageGeneral {

    private static final long MINIMUM_MEMORY = (16L * 1024L * 1024L); // 16 MByte

    public static long getMinimumMemory() {
        return MINIMUM_MEMORY;
    }

    public static boolean enoughFreeMemoryToStoreShit() {
        if(getAvailableInternalMemorySize() < MINIMUM_MEMORY) {
            return false;
        }
        return true;
    }

    public static long getAvailableInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSizeLong();
        long availableBlocks = stat.getAvailableBlocksLong();
        return availableBlocks * blockSize;
    }

    public static String getAvailableInternalMemorySizeAsStringInMByte() {
        long mByteFree = (getAvailableInternalMemorySize() / (1024 * 1024));
        String mbyteWithPoint = String.format("%,d", mByteFree);
        return mbyteWithPoint;
    }

    public static String getStorageDirectory(Context context) {
        return context.getExternalFilesDir(null).getPath().toString();
    }

}


================================================
FILE: TickTagAndroidApp/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#008577"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
</vector>


================================================
FILE: TickTagAndroidApp/app/src/main/res/drawable-v24/chart_fade.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="90"
        android:startColor="#B9F6CA"
        android:endColor="#008577" />
</shape>

================================================
FILE: TickTagAndroidApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillType="evenOdd"
        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
        android:strokeWidth="1"
        android:strokeColor="#00000000">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="78.5885"
                android:endY="90.9159"
                android:startX="48.7653"
                android:startY="61.0927"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
        android:strokeWidth="1"
        android:strokeColor="#00000000" />
</vector>


================================================
FILE: TickTagAndroidApp/app/src/main/res/layout/activity_decoder.xml
================================================
<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <!--
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:orientation="vertical">

            <com.github.mikephil.charting.charts.LineChart
                android:id="@+id/chart"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

        </LinearLayout>
        -->
        <TextView
            android:id="@+id/tselectedfile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="7dp"
            android:layout_marginLeft="20dp"
            android:textStyle="bold"
            android:textSize="15dp"
            android:text=""/>

        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="200dp"
            android:scrollbars="vertical"
            android:background="#ffffba"
            android:fillViewport="true">

            <TextView
                android:id="@+id/tstatus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="7dp"
                android:layout_marginLeft="20dp"
                android:textSize="15dp"
                android:text=""/>

        </ScrollView>

    </LinearLayout>

</FrameLayout>

================================================
FILE: TickTagAndroidApp/app/src/main/res/layout/activity_detail.xml
================================================
<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <!--
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:orientation="vertical">

            <com.github.mikephil.charting.charts.LineChart
                android:id="@+id/chart"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

        </LinearLayout>
        -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="7dp"
            android:layout_marginLeft="20dp"
            android:textStyle="bold"
            android:textSize="15dp"
            android:text="Status"/>

        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:fillViewport="true">

            <TextView
                android:id="@+id/tstatus"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginTop="7dp"
                android:layout_marginLeft="20dp"
                android:textSize="13dp"
                android:scrollbars = "vertical"
                android:text=""/>

        </ScrollView>

    </LinearLayout>

</FrameLayout>

================================================
FILE: TickTagAndroidApp/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight = "0"
            android:gravity="center"
            android:background="#ECEDED"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_margin="10dp"
                android:layout_weight = "0"
                android:src="@mipmap/ic_launcher" />

            <TextView
                android:id="@+id/theadline"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight = "1"
                android:layout_margin="0dp"
                android:padding="10dp"
                android:textSize="15dp"
                android:text=""/>

            <Button
                android:id="@+id/bstartstop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight = "0"
                android:layout_margin="5dp"
                android:padding="20dp"
                android:backgroundTint="#FF80AB"
                android:text="" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/lalertnotconnected"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight = "0"
            android:gravity="left"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_margin="10dp"
                android:src="@drawable/alert" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="7dp"
                android:layout_marginLeft="5dp"
                android:textSize="15dp"
                android:gravity="center_vertical"
                android:text="Not connected to user interface board!"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/lalertpressbutton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight = "0"
            android:gravity="left"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_margin="10dp"
                android:src="@drawable/alert" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="7dp"
                android:layout_marginLeft="5dp"
                android:textSize="15dp"
                android:gravity="center_vertical"
                android:text="Please start the TickTag by pressing the button on the interface board until the TickTag blinks green. After that, please press the button again for 3 seconds to enter the menu."/>

        </LinearLayout>

        <RelativeLayout
            android:id="@+id/rloadingpanel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight = "0"
            android:gravity="center" >

            <ProgressBar
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:indeterminate="true" />

        </RelativeLayout>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight = "0"
            android:layout_marginTop="7dp"
            android:layout_marginLeft="20dp"
            android:textStyle="bold"
            android:textSize="15dp"
            android:text="TickTag Output"/>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight = "1"
            android:orientation="vertical">

            <ScrollView
                android:id="@+id/scscroll"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:scrollbars="vertical"
                android:fillViewport="true">

                <TextView
                    android:id="@+id/toutput"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginTop="7dp"
                    android:layout_marginLeft="20dp"
                    android:textSize="12dp"
                    android:scrollbars = "vertical"
                    android:textIsSelectable="true"
                    android:text=""/>

            </ScrollView>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/lbuttons2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="#ECEDED"
            android:gravity="center"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bread"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#bae1ff"
                    android:text="READ MEMORY AGAIN" />

                <Button
                    android:id="@+id/breset"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#FF80AB"
                    android:text="RESET MEMORY" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bsetvoltage"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="MIN VOLTAGE" />

                <Button
                    android:id="@+id/bsetfrequency"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="FREQUENCY" />

                <Button
                    android:id="@+id/bsetaccuracy"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="ACCURACY" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bsetdelay"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="ACTIVATION DELAY" />

                <Button
                    android:id="@+id/bsethour"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="TIMES" />

                <Button
                    android:id="@+id/bsetburstduration"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="BURST DURATION" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">



                <Button
                    android:id="@+id/btogglegeofencing"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="GEOFENCING ON/OFF" />

                <Button
                    android:id="@+id/btoggleblinking"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="BLINKING ON/OFF" />

                <Button
                    android:id="@+id/bexit"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:textSize="11sp"
                    android:text="EXIT" />

            </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/lbuttons"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="#ECEDED"
            android:gravity="center"
            android:visibility="gone"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/b1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="1" />

                <Button
                    android:id="@+id/b2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="2" />

                <Button
                    android:id="@+id/b3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="3" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/b4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="4" />

                <Button
                    android:id="@+id/b5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="5" />

                <Button
                    android:id="@+id/b6"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="6" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/b7"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="7" />

                <Button
                    android:id="@+id/b8"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="8" />

                <Button
                    android:id="@+id/b9"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="9" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/b0"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#ffffba"
                    android:text="0" />

                <Button
                    android:id="@+id/benter"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="2dp"
                    android:backgroundTint="#bae1ff"
                    android:text="ENTER" />


            </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:background="#DCD2C8"
            android:layout_weight = "0"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bopendownloads"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:backgroundTint="#B9F6CA"
                    android:text="SHOW DOWNLOADS" />

                <Button
                    android:id="@+id/bstoreoutput"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:backgroundTint="#bae1ff"
                    android:text="STORE OUTPUT" />

                <Button
                    android:id="@+id/bclearoutput"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:backgroundTint="#FF80AB"
                    android:text="CLEAR" />

            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</FrameLayout>



================================================
FILE: TickTagAndroidApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@mipmap/ic_launcher_adaptive_back"/>
  <foreground android:drawable="@mipmap/ic_launcher_adaptive_fore"/>
</adaptive-icon>

================================================
FILE: TickTagAndroidApp/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
</resources>


================================================
FILE: TickTagAndroidApp/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">TickTag Android App</string>
</resources>


================================================
FILE: TickTagAndroidApp/app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>


================================================
FILE: TickTagAndroidApp/app/src/main/res/xml/device_filter.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x0403 / 0x60??: FTDI -->
    <usb-device vendor-id="1027" product-id="24577" /> <!-- 0x6001: FT232R -->
    <usb-device vendor-id="1027" product-id="24592" /> <!-- 0x6010: FT2232H -->
    <usb-device vendor-id="1027" product-id="24593" /> <!-- 0x6011: FT4232H -->
    <usb-device vendor-id="1027" product-id="24596" /> <!-- 0x6014: FT232H -->
    <usb-device vendor-id="1027" product-id="24597" /> <!-- 0x6015: FT230X, FT231X, FT234XD -->

    <!-- 0x10C4 / 0xEA??: Silabs CP210x -->
    <usb-device vendor-id="4292" product-id="60000" /> <!-- 0xea60: CP2102 and other CP210x single port devices -->
    <usb-device vendor-id="4292" product-id="60016" /> <!-- 0xea70: CP2105 -->
    <usb-device vendor-id="4292" product-id="60017" /> <!-- 0xea71: CP2108 -->

    <!-- 0x067B / 0x23?3: Prolific PL2303x -->
    <usb-device vendor-id="1659" product-id="8963" /> <!-- 0x2303: PL2303HX, HXD, TA, ... -->
    <usb-device vendor-id="1659" product-id="9123" /> <!-- 0x23a3: PL2303GC -->
    <usb-device vendor-id="1659" product-id="9139" /> <!-- 0x23b3: PL2303GB -->
    <usb-device vendor-id="1659" product-id="9155" /> <!-- 0x23c3: PL2303GT -->
    <usb-device vendor-id="1659" product-id="9171" /> <!-- 0x23d3: PL2303GL -->
    <usb-device vendor-id="1659" product-id="9187" /> <!-- 0x23e3: PL2303GE -->
    <usb-device vendor-id="1659" product-id="9203" /> <!-- 0x23f3: PL2303GS -->

    <!-- 0x1a86 / 0x?523: Qinheng CH34x -->
    <usb-device vendor-id="6790" product-id="21795" /> <!-- 0x5523: CH341A -->
    <usb-device vendor-id="6790" product-id="29987" /> <!-- 0x7523: CH340 -->

    <!-- CDC driver -->
    <usb-device vendor-id="9025" />                   <!-- 0x2341 / ......: Arduino -->
    <usb-device vendor-id="5824" product-id="1155" /> <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="1003" product-id="8260" /> <!-- 0x03EB / 0x2044: Atmel Lufa -->
    <usb-device vendor-id="7855" product-id="4"    /> <!-- 0x1eaf / 0x0004: Leaflabs Maple -->
    <usb-device vendor-id="3368" product-id="516"  /> <!-- 0x0d28 / 0x0204: ARM mbed -->
    <usb-device vendor-id="1155" product-id="22336" /><!-- 0x0483 / 0x5740: ST CDC -->
</resources>

================================================
FILE: TickTagAndroidApp/app/src/test/java/com/timm/ticktagandroidapp/ExampleUnitTest.java
================================================
package com.timm.ticktagandroidapp;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: TickTagAndroidApp/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: TickTagAndroidApp/gradle/wrapper/gradle-wrapper.properties
================================================
#Sat Oct 31 08:59:58 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip


================================================
FILE: TickTagAndroidApp/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true



================================================
FILE: TickTagAndroidApp/gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: TickTagAndroidApp/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: TickTagAndroidApp/settings.gradle
================================================
include ':app'
rootProject.name='TickTagAndroidApp'


================================================
FILE: TickTagData/01_StationaryPosition_1s_Interval/20220221_1s_Interval_10527_fixes.csv
================================================
count,timestamp,lat,lon
1,1645434445,47.74306,8.99900
2,1645434446,47.74304,8.99900
3,1645434447,47.74303,8.99899
4,1645434448,47.74302,8.99899
5,1645434449,47.74302,8.99899
6,1645434450,47.74301,8.99899
7,1645434451,47.74301,8.99899
8,1645434452,47.74301,8.99898
9,1645434453,47.74301,8.99898
10,1645434454,47.74301,8.99898
11,1645434455,47.74301,8.99898
12,1645434456,47.74301,8.99898
13,1645434457,47.74301,8.99898
14,1645434458,47.74301,8.99898
15,1645434459,47.74301,8.99898
16,1645434460,47.74301,8.99898
17,1645434461,47.74301,8.99899
18,1645434462,47.74301,8.99899
19,1645434463,47.74301,8.99899
20,1645434464,47.74301,8.99899
21,1645434465,47.74301,8.99899
22,1645434466,47.74301,8.99899
23,1645434467,47.74301,8.99899
24,1645434468,47.74301,8.99899
25,1645434469,47.74301,8.99899
26,1645434470,47.74301,8.99899
27,1645434471,47.74301,8.99899
28,1645434472,47.74301,8.99899
29,1645434473,47.74301,8.99899
30,1645434474,47.74301,8.99899
31,1645434475,47.74301,8.99899
32,1645434476,47.74301,8.99899
33,1645434477,47.74301,8.99899
34,1645434478,47.74301,8.99899
35,1645434479,47.74301,8.99899
36,1645434480,47.74301,8.99899
37,1645434481,47.74301,8.99899
38,1645434482,47.74301,8.99899
39,1645434483,47.74301,8.99899
40,1645434484,47.74301,8.99899
41,1645434485,47.74301,8.99899
42,1645434486,47.74301,8.99899
43,1645434487,47.74301,8.99899
44,1645434488,47.74301,8.99899
45,1645434489,47.74301,8.99899
46,1645434490,47.74301,8.99899
47,1645434491,47.74301,8.99899
48,1645434492,47.74301,8.99899
49,1645434493,47.74301,8.99899
50,1645434494,47.74301,8.99899
51,1645434495,47.74301,8.99899
52,1645434496,47.74301,8.99899
53,1645434497,47.74301,8.99899
54,1645434498,47.74301,8.99899
55,1645434499,47.74301,8.99899
56,1645434500,47.74301,8.99899
57,1645434501,47.74301,8.99899
58,1645434502,47.74301,8.99899
59,1645434503,47.74301,8.99899
60,1645434504,47.74301,8.99899
61,1645434505,47.74301,8.99899
62,1645434506,47.74301,8.99899
63,1645434507,47.74301,8.99899
64,1645434508,47.74301,8.99899
65,1645434509,47.74301,8.99899
66,1645434510,47.74301,8.99899
67,1645434511,47.74301,8.99899
68,1645434512,47.74301,8.99899
69,1645434513,47.74301,8.99899
70,1645434514,47.74301,8.99899
71,1645434515,47.74301,8.99899
72,1645434516,47.74301,8.99899
73,1645434517,47.74301,8.99899
74,1645434518,47.74301,8.99899
75,1645434519,47.74301,8.99899
76,1645434520,47.74301,8.99899
77,1645434521,47.74301,8.99899
78,1645434522,47.74301,8.99899
79,1645434523,47.74301,8.99899
80,1645434524,47.74301,8.99899
81,1645434525,47.74301,8.99899
82,1645434526,47.74301,8.99899
83,1645434527,47.74301,8.99899
84,1645434528,47.74301,8.99899
85,1645434529,47.74301,8.99899
86,1645434530,47.74301,8.99899
87,1645434531,47.74301,8.99899
88,1645434532,47.74301,8.99899
89,1645434533,47.74301,8.99899
90,1645434534,47.74301,8.99899
91,1645434535,47.74301,8.99899
92,1645434536,47.74301,8.99899
93,1645434537,47.74301,8.99899
94,1645434538,47.74301,8.99899
95,1645434539,47.74301,8.99899
96,1645434540,47.74301,8.99899
97,1645434541,47.74301,8.99899
98,1645434542,47.74301,8.99899
99,1645434543,47.74301,8.99899
100,1645434544,47.74301,8.99899
101,1645434545,47.74301,8.99899
102,1645434546,47.74301,8.99899
103,1645434547,47.74301,8.99899
104,1645434548,47.74301,8.99899
105,1645434549,47.74301,8.99899
106,1645434550,47.74301,8.99899
107,1645434551,47.74301,8.99899
108,1645434552,47.74301,8.99899
109,1645434553,47.74301,8.99899
110,1645434554,47.74301,8.99899
111,1645434555,47.74301,8.99899
112,1645434556,47.74301,8.99899
113,1645434557,47.74301,8.99899
114,1645434558,47.74301,8.99899
115,1645434559,47.74301,8.99899
116,1645434560,47.74301,8.99899
117,1645434561,47.74301,8.99899
118,1645434562,47.74301,8.99899
119,1645434563,47.74301,8.99899
120,1645434564,47.74301,8.99899
121,1645434565,47.74301,8.99899
122,1645434566,47.74301,8.99899
123,1645434567,47.74301,8.99899
124,1645434568,47.74301,8.99899
125,1645434569,47.74301,8.99899
126,1645434570,47.74301,8.99899
127,1645434571,47.74301,8.99899
128,1645434572,47.74301,8.99899
129,1645434573,47.74301,8.99899
130,1645434574,47.74301,8.99899
131,1645434575,47.74301,8.99899
132,1645434576,47.74301,8.99899
133,1645434577,47.74301,8.99899
134,1645434578,47.74301,8.99899
135,1645434579,47.74301,8.99899
136,1645434580,47.74301,8.99899
137,1645434581,47.74301,8.99899
138,1645434582,47.74301,8.99899
139,1645434583,47.74301,8.99899
140,1645434584,47.74301,8.99899
141,1645434585,47.74301,8.99899
142,1645434586,47.74301,8.99899
143,1645434587,47.74301,8.99899
144,1645434588,47.74301,8.99899
145,1645434589,47.74301,8.99899
146,1645434590,47.74301,8.99899
147,1645434591,47.74301,8.99899
148,1645434592,47.74301,8.99899
149,1645434593,47.74301,8.99899
150,1645434594,47.74301,8.99899
151,1645434595,47.74301,8.99899
152,1645434596,47.74301,8.99899
153,1645434597,47.74301,8.99899
154,1645434598,47.74301,8.99899
155,1645434599,47.74301,8.99899
156,1645434600,47.74301,8.99899
157,1645434601,47.74301,8.99899
158,1645434602,47.74301,8.99899
159,1645434603,47.74301,8.99899
160,1645434604,47.74301,8.99899
161,1645434605,47.74301,8.99899
162,1645434606,47.74301,8.99899
163,1645434607,47.74301,8.99899
164,1645434608,47.74301,8.99899
165,1645434609,47.74301,8.99899
166,1645434610,47.74301,8.99899
167,1645434611,47.74301,8.99899
168,1645434612,47.74301,8.99899
169,1645434613,47.74301,8.99899
170,1645434614,47.74301,8.99899
171,1645434615,47.74301,8.99899
172,1645434616,47.74301,8.99899
173,1645434617,47.74301,8.99899
174,1645434618,47.74301,8.99899
175,1645434619,47.74301,8.99899
176,1645434620,47.74301,8.99899
177,1645434621,47.74301,8.99899
178,1645434622,47.74301,8.99899
179,1645434623,47.74301,8.99899
180,1645434624,47.74301,8.99899
181,1645434625,47.74301,8.99899
182,1645434626,47.74301,8.99899
183,1645434627,47.74301,8.99899
184,1645434628,47.74301,8.99899
185,1645434629,47.74301,8.99899
186,1645434630,47.74301,8.99899
187,1645434631,47.74301,8.99899
188,1645434632,47.74301,8.99899
189,1645434633,47.74301,8.99899
190,1645434634,47.74301,8.99899
191,1645434635,47.74301,8.99899
192,1645434636,47.74301,8.99899
193,1645434637,47.74301,8.99899
194,1645434638,47.74301,8.99899
195,1645434639,47.74301,8.99899
196,1645434640,47.74301,8.99899
197,1645434641,47.74301,8.99899
198,1645434642,47.74301,8.99899
199,1645434643,47.74301,8.99899
200,1645434644,47.74301,8.99899
201,1645434645,47.74302,8.99899
202,1645434646,47.74302,8.99899
203,1645434647,47.74302,8.99899
204,1645434648,47.74302,8.99899
205,1645434649,47.74302,8.99899
206,1645434650,47.74302,8.99899
207,1645434651,47.74302,8.99899
208,1645434652,47.74302,8.99899
209,1645434653,47.74302,8.99900
210,1645434654,47.74303,8.99900
211,1645434655,47.74303,8.99900
212,1645434656,47.74303,8.99900
213,1645434657,47.74303,8.99900
214,1645434658,47.74303,8.99900
215,1645434659,47.74303,8.99900
216,1645434660,47.74304,8.99900
217,1645434661,47.74304,8.99900
218,1645434662,47.74304,8.99900
219,1645434663,47.74303,8.99900
220,1645434664,47.74303,8.99900
221,1645434665,47.74303,8.99900
222,1645434666,47.74303,8.99900
223,1645434667,47.74303,8.99900
224,1645434668,47.74303,8.99899
225,1645434669,47.74303,8.99899
226,1645434670,47.74303,8.99899
227,1645434671,47.74303,8.99899
228,1645434672,47.74303,8.99899
229,1645434673,47.74303,8.99899
230,1645434674,47.74303,8.99899
231,1645434675,47.74303,8.99899
232,1645434676,47.74303,8.99899
233,1645434677,47.74303,8.99899
234,1645434678,47.74303,8.99899
235,1645434679,47.74303,8.99899
236,1645434680,47.74303,8.99899
237,1645434681,47.74303,8.99899
238,1645434682,47.74303,8.99899
239,1645434683,47.74303,8.99899
240,1645434684,47.74303,8.99899
241,1645434685,47.74303,8.99899
242,1645434686,47.74303,8.99899
243,1645434687,47.74303,8.99899
244,1645434688,47.74303,8.99899
245,1645434689,47.74303,8.99899
246,1645434690,47.74303,8.99899
247,1645434691,47.74303,8.99899
248,1645434692,47.74303,8.99899
249,1645434693,47.74303,8.99899
250,1645434694,47.74303,8.99899
251,1645434695,47.74303,8.99899
252,1645434696,47.74303,8.99899
253,1645434697,47.74303,8.99899
254,1645434698,47.74303,8.99899
255,1645434699,47.74303,8.99899
256,1645434700,47.74303,8.99899
257,1645434701,47.74303,8.99899
258,1645434702,47.74303,8.99899
259,1645434703,47.74303,8.99899
260,1645434704,47.74303,8.99899
261,1645434705,47.74303,8.99899
262,1645434706,47.74303,8.99899
263,1645434707,47.74303,8.99899
264,1645434708,47.74303,8.99899
265,1645434709,47.74303,8.99899
266,1645434710,47.74303,8.99899
267,1645434711,47.74303,8.99899
268,1645434712,47.74303,8.99899
269,1645434713,47.74303,8.99899
270,1645434714,47.74303,8.99899
271,1645434715,47.74303,8.99899
272,1645434716,47.74303,8.99899
273,1645434717,47.74303,8.99899
274,1645434718,47.74303,8.99899
275,1645434719,47.74303,8.99899
276,1645434720,47.74303,8.99899
277,1645434721,47.74303,8.99899
278,1645434722,47.74303,8.99899
279,1645434723,47.74303,8.99899
280,1645434724,47.74303,8.99899
281,1645434725,47.74303,8.99899
282,1645434726,47.74303,8.99899
283,1645434727,47.74303,8.99899
284,1645434728,47.74303,8.99899
285,1645434729,47.74303,8.99899
286,1645434730,47.74303,8.99899
287,1645434731,47.74303,8.99899
288,1645434732,47.74303,8.99899
289,1645434733,47.74303,8.99899
290,1645434734,47.74303,8.99899
291,1645434735,47.74303,8.99899
292,1645434736,47.74303,8.99899
293,1645434737,47.74303,8.99899
294,1645434738,47.74303,8.99899
295,1645434739,47.74304,8.99899
296,1645434740,47.74304,8.99899
297,1645434741,47.74304,8.99899
298,1645434742,47.74304,8.99899
299,1645434743,47.74304,8.99899
300,1645434744,47.74304,8.99899
301,1645434745,47.74304,8.99899
302,1645434746,47.74304,8.99899
303,1645434747,47.74304,8.99899
304,1645434748,47.74304,8.99899
305,1645434749,47.74304,8.99899
306,1645434750,47.74304,8.99899
307,1645434751,47.74304,8.99899
308,1645434752,47.74304,8.99899
309,1645434753,47.74304,8.99899
310,1645434754,47.74304,8.99899
311,1645434755,47.74304,8.99899
312,1645434756,47.74304,8.99899
313,1645434757,47.74304,8.99899
314,1645434758,47.74304,8.99899
315,1645434759,47.74304,8.99899
316,1645434760,47.74304,8.99899
317,1645434761,47.74304,8.99899
318,1645434762,47.74304,8.99899
319,1645434763,47.74303,8.99899
320,1645434764,47.74303,8.99899
321,1645434765,47.74303,8.99899
322,1645434766,47.74303,8.99899
323,1645434767,47.74303,8.99899
324,1645434768,47.74303,8.99899
325,1645434769,47.74303,8.99899
326,1645434770,47.74303,8.99899
327,1645434771,47.74303,8.99899
328,1645434772,47.74303,8.99899
329,1645434773,47.74303,8.99899
330,1645434774,47.74303,8.99899
331,1645434775,47.74303,8.99899
332,1645434776,47.74303,8.99899
333,1645434777,47.74303,8.99899
334,1645434778,47.74303,8.99899
335,1645434779,47.74303,8.99899
336,1645434780,47.74303,8.99899
337,1645434781,47.74303,8.99899
338,1645434782,47.74303,8.99899
339,1645434783,47.74303,8.99899
340,1645434784,47.74303,8.99899
341,1645434785,47.74303,8.99899
342,1645434786,47.74303,8.99899
343,1645434787,47.74303,8.99899
344,1645434788,47.74303,8.99899
345,1645434789,47.74303,8.99899
346,1645434790,47.74303,8.99899
347,1645434791,47.74303,8.99899
348,1645434792,47.74303,8.99899
349,1645434793,47.74303,8.99899
350,1645434794,47.74303,8.99899
351,1645434795,47.74303,8.99899
352,1645434796,47.74303,8.99899
353,1645434797,47.74303,8.99899
354,1645434798,47.74303,8.99899
355,1645434799,47.74303,8.99899
356,1645434800,47.74303,8.99899
357,1645434801,47.74303,8.99899
358,1645434802,47.74303,8.99899
359,1645434803,47.74303,8.99899
360,1645434804,47.74303,8.99899
361,1645434805,47.74303,8.99899
362,1645434806,47.74303,8.99899
363,1645434807,47.74303,8.99899
364,1645434808,47.74303,8.99899
365,1645434809,47.74303,8.99899
366,1645434810,47.74303,8.99899
367,1645434811,47.74303,8.99899
368,1645434812,47.74303,8.99899
369,1645434813,47.74303,8.99899
370,1645434814,47.74303,8.99899
371,1645434815,47.74303,8.99899
372,1645434816,47.74303,8.99899
373,1645434817,47.74303,8.99899
374,1645434818,47.74303,8.99899
375,1645434819,47.74303,8.99899
376,1645434820,47.74303,8.99899
377,1645434821,47.74303,8.99899
378,1645434822,47.74303,8.99899
379,1645434823,47.74303,8.99899
380,1645434824,47.74303,8.99899
381,1645434825,47.74303,8.99899
382,1645434826,47.74303,8.99899
383,1645434827,47.74303,8.99899
384,1645434828,47.74303,8.99899
385,1645434829,47.74303,8.99899
386,1645434830,47.74303,8.99899
387,1645434831,47.74303,8.99899
388,1645434832,47.74303,8.99899
389,1645434833,47.74303,8.99899
390,1645434834,47.74303,8.99899
391,1645434835,47.74303,8.99899
392,1645434836,47.74303,8.99899
393,1645434837,47.74303,8.99899
394,1645434838,47.74303,8.99899
395,1645434839,47.74303,8.99899
396,1645434840,47.74303,8.99899
397,1645434841,47.74303,8.99899
398,1645434842,47.74303,8.99899
399,1645434843,47.74303,8.99899
400,1645434844,47.74303,8.99899
401,1645434845,47.74303,8.99899
402,1645434846,47.74303,8.99899
403,1645434847,47.74303,8.99899
404,1645434848,47.74303,8.99899
405,1645434849,47.74303,8.99899
406,1645434850,47.74303,8.99899
407,1645434851,47.74303,8.99899
408,1645434852,47.74303,8.99899
409,1645434853,47.74303,8.99899
410,1645434854,47.74303,8.99899
411,1645434855,47.74303,8.99899
412,1645434856,47.74303,8.99899
413,1645434857,47.74303,8.99899
414,1645434858,47.74303,8.99899
415,1645434859,47.74303,8.99899
416,1645434860,47.74303,8.99899
417,1645434861,47.74303,8.99899
418,1645434862,47.74303,8.99899
419,1645434863,47.74303,8.99899
420,1645434864,47.74303,8.99899
421,1645434865,47.74303,8.99899
422,1645434866,47.74303,8.99899
423,1645434867,47.74303,8.99899
424,1645434868,47.74303,8.99899
425,1645434869,47.74303,8.99899
426,1645434870,47.74303,8.99899
427,1645434871,47.74303,8.99899
428,1645434872,47.74303,8.99899
429,1645434873,47.74303,8.99899
430,1645434874,47.74303,8.99899
431,1645434875,47.74303,8.99899
432,1645434876,47.74303,8.99899
433,1645434877,47.74303,8.99899
434,1645434878,47.74303,8.99899
435,1645434879,47.74303,8.99899
436,1645434880,47.74303,8.99899
437,1645434881,47.74303,8.99899
438,1645434882,47.74303,8.99899
439,1645434883,47.74303,8.99899
440,1645434884,47.74303,8.99899
441,1645434885,47.74303,8.99899
442,1645434886,47.74303,8.99899
443,1645434887,47.74303,8.99899
444,1645434888,47.74303,8.99899
445,1645434889,47.74303,8.99899
446,1645434890,47.74303,8.99899
447,1645434891,47.74303,8.99899
448,1645434892,47.74303,8.99899
449,1645434893,47.74303,8.99899
450,1645434894,47.74303,8.99899
451,1645434895,47.74303,8.99899
452,1645434896,47.74303,8.99899
453,1645434897,47.74303,8.99899
454,1645434898,47.74303,8.99899
455,1645434899,47.74303,8.99899
456,1645434900,47.74303,8.99899
457,1645434901,47.74303,8.99899
458,1645434902,47.74303,8.99899
459,1645434903,47.74303,8.99899
460,1645434904,47.74303,8.99899
461,1645434905,47.74303,8.99899
462,1645434906,47.74303,8.99899
463,1645434907,47.74303,8.99899
464,1645434908,47.74303,8.99899
465,1645434909,47.74303,8.99899
466,1645434910,47.74303,8.99899
467,1645434911,47.74303,8.99899
468,1645434912,47.74303,8.99899
469,1645434913,47.74303,8.99899
470,1645434914,47.74303,8.99899
471,1645434915,47.74303,8.99899
472,1645434916,47.74303,8.99899
473,1645434917,47.74303,8.99899
474,1645434918,47.74303,8.99899
475,1645434919,47.74303,8.99899
476,1645434920,47.74303,8.99899
477,1645434921,47.74303,8.99899
478,1645434922,47.74303,8.99899
479,1645434923,47.74303,8.99899
480,1645434924,47.74303,8.99899
481,1645434925,47.74303,8.99899
482,1645434926,47.74303,8.99899
483,1645434927,47.74303,8.99899
484,1645434928,47.74303,8.99899
485,1645434929,47.74303,8.99899
486,1645434930,47.74303,8.99899
487,1645434931,47.74303,8.99899
488,1645434932,47.74303,8.99899
489,1645434933,47.74303,8.99899
490,1645434934,47.74303,8.99899
491,1645434935,47.74303,8.99899
492,1645434936,47.74303,8.99899
493,1645434937,47.74303,8.99899
494,1645434938,47.74303,8.99899
495,1645434939,47.74303,8.99899
496,1645434940,47.74303,8.99899
497,1645434941,47.74303,8.99899
498,1645434942,47.74303,8.99899
499,1645434943,47.74303,8.99899
500,1645434944,47.74303,8.99899
501,1645434945,47.74303,8.99899
502,1645434946,47.74303,8.99899
503,1645434947,47.74303,8.99899
504,1645434948,47.74303,8.99899
505,1645434949,47.74303,8.99899
506,1645434950,47.74303,8.99899
507,1645434951,47.74303,8.99899
508,1645434952,47.74303,8.99899
509,1645434953,47.74303,8.99899
510,1645434954,47.74303,8.99899
511,1645434955,47.74303,8.99899
512,1645434956,47.74303,8.99899
513,1645434957,47.74303,8.99899
514,1645434958,47.74303,8.99899
515,1645434959,47.74303,8.99899
516,1645434960,47.74303,8.99899
517,1645434961,47.74303,8.99899
518,1645434962,47.74303,8.99899
519,1645434963,47.74303,8.99899
520,1645434964,47.74303,8.99899
521,1645434965,47.74303,8.99899
522,1645434966,47.74303,8.99899
523,1645434967,47.74303,8.99899
524,1645434968,47.74303,8.99900
525,1645434969,47.74303,8.99900
526,1645434970,47.74303,8.99900
527,1645434971,47.74303,8.99900
528,1645434972,47.74303,8.99900
529,1645434973,47.74303,8.99900
530,1645434974,47.74303,8.99900
531,1645434975,47.74303,8.99899
532,1645434976,47.74303,8.99899
533,1645434977,47.74303,8.99899
534,1645434978,47.74303,8.99899
535,1645434979,47.74303,8.99899
536,1645434980,47.74303,8.99899
537,1645434981,47.74303,8.99899
538,1645434982,47.74303,8.99899
539,1645434983,47.74303,8.99899
540,1645434984,47.74303,8.99899
541,1645434985,47.74303,8.99899
542,1645434986,47.74303,8.99899
543,1645434987,47.74303,8.99899
544,1645434988,47.74303,8.99899
545,1645434989,47.74303,8.99899
546,1645434990,47.74303,8.99899
547,1645434991,47.74303,8.99899
548,1645434992,47.74303,8.99899
549,1645434993,47.74303,8.99899
550,1645434994,47.74303,8.99899
551,1645434995,47.74303,8.99899
552,1645434996,47.74303,8.99899
553,1645434997,47.74303,8.99899
554,1645434998,47.74303,8.99899
555,1645434999,47.74303,8.99899
556,1645435000,47.74303,8.99899
557,1645435001,47.74303,8.99899
558,1645435002,47.74303,8.99899
559,1645435003,47.74303,8.99899
560,1645435004,47.74303,8.99899
561,1645435005,47.74303,8.99899
562,1645435006,47.74303,8.99899
563,1645435007,47.74303,8.99899
564,1645435008,47.74303,8.99899
565,1645435009,47.74303,8.99899
566,1645435010,47.74303,8.99899
567,1645435011,47.74303,8.99899
568,1645435012,47.74303,8.99899
569,1645435013,47.74303,8.99899
570,1645435014,47.74303,8.99899
571,1645435015,47.74303,8.99899
572,1645435016,47.74303,8.99899
573,1645435017,47.74303,8.99899
574,1645435018,47.74303,8.99899
575,1645435019,47.74303,8.99899
576,1645435020,47.74303,8.99899
577,1645435021,47.74303,8.99899
578,1645435022,47.74303,8.99899
579,1645435023,47.74303,8.99899
580,1645435024,47.74303,8.99899
581,1645435025,47.74303,8.99899
582,1645435026,47.74303,8.99899
583,1645435027,47.74303,8.99899
584,1645435028,47.74303,8.99899
585,1645435029,47.74303,8.99899
586,1645435030,47.74303,8.99899
587,1645435031,47.74303,8.99899
588,1645435032,47.74303,8.99899
589,1645435033,47.74303,8.99899
590,1645435034,47.74303,8.99899
591,1645435035,47.74303,8.99899
592,1645435036,47.74303,8.99899
593,1645435037,47.74303,8.99899
594,1645435038,47.74303,8.99899
595,1645435039,47.74303,8.99899
596,1645435040,47.74303,8.99899
597,1645435041,47.74303,8.99899
598,1645435042,47.74303,8.99899
599,1645435043,47.74303,8.99899
600,1645435044,47.74303,8.99899
601,1645435045,47.74303,8.99899
602,1645435046,47.74303,8.99899
603,1645435047,47.74303,8.99899
604,1645435048,47.74303,8.99899
605,1645435049,47.74303,8.99899
606,1645435050,47.74303,8.99899
607,1645435051,47.74303,8.99899
608,1645435052,47.74303,8.99899
609,1645435053,47.74303,8.99899
610,1645435054,47.74303,8.99899
611,1645435055,47.74303,8.99899
612,1645435056,47.74303,8.99899
613,1645435057,47.74303,8.99899
614,1645435058,47.74303,8.99899
615,1645435059,47.74303,8.99899
616,1645435060,47.74303,8.99899
617,1645435061,47.74303,8.99899
618,1645435062,47.74303,8.99899
619,1645435063,47.74303,8.99899
620,1645435064,47.74303,8.99899
621,1645435065,47.74303,8.99899
622,1645435066,47.74303,8.99899
623,1645435067,47.74303,8.99899
624,1645435068,47.74303,8.99899
625,1645435069,47.74303,8.99899
626,1645435070,47.74303,8.99899
627,1645435071,47.74303,8.99899
628,1645435072,47.74303,8.99899
629,1645435073,47.74303,8.99899
630,1645435074,47.74303,8.99899
631,1645435075,47.74303,8.99899
632,1645435076,47.74303,8.99899
633,1645435077,47.74303,8.99899
634,1645435078,47.74303,8.99899
635,1645435079,47.74303,8.99899
636,1645435080,47.74303,8.99899
637,1645435081,47.74303,8.99899
638,1645435082,47.74303,8.99899
639,1645435083,47.74303,8.99899
640,1645435084,47.74303,8.99899
641,1645435085,47.74303,8.99899
642,1645435086,47.74303,8.99899
643,1645435087,47.74303,8.99899
644,1645435088,47.74303,8.99899
645,1645435089,47.74303,8.99899
646,1645435090,47.74303,8.99899
647,1645435091,47.74303,8.99899
648,1645435092,47.74303,8.99899
649,1645435093,47.74303,8.99899
650,1645435094,47.74303,8.99899
651,1645435095,47.74303,8.99899
652,1645435096,47.74303,8.99899
653,1645435097,47.74303,8.99899
654,1645435098,47.74303,8.99899
655,1645435099,47.74303,8.99899
656,1645435100,47.74303,8.99899
657,1645435101,47.74303,8.99899
658,1645435102,47.74303,8.99899
659,1645435103,47.74303,8.99899
660,1645435104,47.74303,8.99899
661,1645435105,47.74303,8.99899
662,1645435106,47.74303,8.99899
663,1645435107,47.74303,8.99899
664,1645435108,47.74303,8.99899
665,1645435109,47.74303,8.99899
666,1645435110,47.74303,8.99899
667,1645435111,47.74303,8.99899
668,1645435112,47.74303,8.99899
669,1645435113,47.74303,8.99899
670,1645435114,47.74303,8.99899
671,1645435115,47.74303,8.99899
672,1645435116,47.74303,8.99899
673,1645435117,47.74303,8.99899
674,1645435118,47.74303,8.99899
675,1645435119,47.74303,8.99899
676,1645435120,47.74303,8.99899
677,1645435121,47.74303,8.99899
678,1645435122,47.74303,8.99899
679,1645435123,47.74303,8.99899
680,1645435124,47.74303,8.99899
681,1645435125,47.74303,8.99899
682,1645435126,47.74303,8.99899
683,1645435127,47.74303,8.99899
684,1645435128,47.74303,8.99899
685,1645435129,47.74303,8.99899
686,1645435130,47.74303,8.99899
687,1645435131,47.74303,8.99899
688,1645435132,47.74303,8.99899
689,1645435133,47.74303,8.99899
690,1645435134,47.74303,8.99899
691,1645435135,47.74303,8.99899
692,1645435136,47.74303,8.99899
693,1645435137,47.74303,8.99899
694,1645435138,47.74303,8.99899
695,1645435139,47.74303,8.99899
696,1645435140,47.74303,8.99899
697,1645435141,47.74303,8.99899
698,1645435142,47.74303,8.99899
699,1645435143,47.74303,8.99899
700,1645435144,47.74303,8.99899
701,1645435145,47.74303,8.99899
702,1645435146,47.74303,8.99899
703,1645435147,47.74303,8.99899
704,1645435148,47.74303,8.99899
705,1645435149,47.74303,8.99899
706,1645435150,47.74303,8.99899
707,1645435151,47.74303,8.99899
708,1645435152,47.74303,8.99899
709,1645435153,47.74303,8.99899
710,1645435154,47.74303,8.99899
711,1645435155,47.74303,8.99899
712,1645435156,47.74303,8.99899
713,1645435157,47.74303,8.99899
714,1645435158,47.74303,8.99899
715,1645435159,47.74303,8.99899
716,1645435160,47.74303,8.99899
717,1645435161,47.74303,8.99899
718,1645435162,47.74303,8.99899
719,1645435163,47.74303,8.99899
720,1645435164,47.74303,8.99899
721,1645435165,47.74303,8.99899
722,1645435166,47.74303,8.99899
723,1645435167,47.74303,8.99899
724,1645435168,47.74303,8.99899
725,1645435169,47.74303,8.99899
726,1645435170,47.74303,8.99899
727,1645435171,47.74303,8.99899
728,1645435172,47.74303,8.99899
729,1645435173,47.74303,8.99899
730,1645435174,47.74303,8.99899
731,1645435175,47.74303,8.99899
732,1645435176,47.74303,8.99899
733,1645435177,47.74303,8.99899
734,1645435178,47.74303,8.99899
735,1645435179,47.74303,8.99899
736,1645435180,47.74303,8.99899
737,1645435181,47.74303,8.99899
738,1645435182,47.74303,8.99899
739,1645435183,47.74303,8.99899
740,1645435184,47.74303,8.99899
741,1645435185,47.74303,8.99899
742,1645435186,47.74303,8.99899
743,1645435187,47.74303,8.99899
744,1645435188,47.74303,8.99899
745,1645435189,47.74303,8.99899
746,1645435190,47.74303,8.99899
747,1645435191,47.74303,8.99899
748,1645435192,47.74303,8.99899
749,1645435193,47.74303,8.99899
750,1645435194,47.74303,8.99899
751,1645435195,47.74303,8.99899
752,1645435196,47.74303,8.99899
753,1645435197,47.74303,8.99899
754,1645435198,47.74303,8.99899
755,1645435199,47.74303,8.99899
756,1645435200,47.74303,8.99899
757,1645435201,47.74303,8.99899
758,1645435202,47.74303,8.99899
759,1645435203,47.74303,8.99899
760,1645435204,47.74303,8.99899
761,1645435205,47.74303,8.99899
762,1645435206,47.74303,8.99899
763,1645435207,47.74303,8.99899
764,1645435208,47.74303,8.99899
765,1645435209,47.74303,8.99899
766,1645435210,47.74303,8.99899
767,1645435211,47.74303,8.99899
768,1645435212,47.74303,8.99899
769,1645435213,47.74303,8.99899
770,1645435214,47.74303,8.99899
771,1645435215,47.74303,8.99899
772,1645435216,47.74303,8.99899
773,1645435217,47.74303,8.99899
774,1645435218,47.74303,8.99899
775,1645435219,47.74303,8.99899
776,1645435220,47.74303,8.99899
777,1645435221,47.74303,8.99899
778,1645435222,47.74303,8.99899
779,1645435223,47.74303,8.99899
780,1645435224,47.74303,8.99899
781,1645435225,47.74303,8.99899
782,1645435226,47.74303,8.99899
783,1645435227,47.74303,8.99899
784,1645435228,47.74303,8.99899
785,1645435229,47.74303,8.99899
786,1645435230,47.74303,8.99899
787,1645435231,47.74303,8.99899
788,1645435232,47.74303,8.99899
789,1645435233,47.74303,8.99899
790,1645435234,47.74303,8.99899
791,1645435235,47.74303,8.99899
792,1645435236,47.74303,8.99899
793,1645435237,47.74303,8.99899
794,1645435238,47.74303,8.99899
795,1645435239,47.74303,8.99899
796,1645435240,47.74303,8.99899
797,1645435241,47.74303,8.99899
798,1645435242,47.74303,8.99899
799,1645435243,47.74303,8.99899
800,1645435244,47.74303,8.99899
801,1645435245,47.74303,8.99899
802,1645435246,47.74303,8.99899
803,1645435247,47.74303,8.99899
804,1645435248,47.74303,8.99899
805,1645435249,47.74303,8.99899
806,1645435250,47.74303,8.99899
807,1645435251,47.74303,8.99899
808,1645435252,47.74303,8.99899
809,1645435253,47.74303,8.99899
810,1645435254,47.74303,8.99899
811,1645435255,47.74303,8.99899
812,1645435256,47.74303,8.99899
813,1645435257,47.74303,8.99899
814,1645435258,47.74303,8.99899
815,1645435259,47.74303,8.99899
816,1645435260,47.74303,8.99899
817,1645435261,47.74303,8.99899
818,1645435262,47.74303,8.99899
819,1645435263,47.74303,8.99899
820,1645435264,47.74303,8.99899
821,1645435265,47.74303,8.99899
822,1645435266,47.74303,8.99899
823,1645435267,47.74303,8.99899
824,1645435268,47.74303,8.99899
825,1645435269,47.74303,8.99899
826,1645435270,47.74303,8.99899
827,1645435271,47.74303,8.99899
828,1645435272,47.74303,8.99899
829,1645435273,47.74303,8.99899
830,1645435274,47.74303,8.99899
831,1645435275,47.74303,8.99899
832,1645435276,47.74303,8.99899
833,1645435277,47.74303,8.99899
834,1645435278,47.74303,8.99899
835,1645435279,47.74303,8.99899
836,1645435280,47.74303,8.99899
837,1645435281,47.74303,8.99899
838,1645435282,47.74303,8.99899
839,1645435283,47.74303,8.99899
840,1645435284,47.74303,8.99899
841,1645435285,47.74303,8.99899
842,1645435286,47.74303,8.99899
843,1645435287,47.74303,8.99899
844,1645435288,47.74303,8.99899
845,1645435289,47.74303,8.99899
846,1645435290,47.74303,8.99899
847,1645435291,47.74303,8.99899
848,1645435292,47.74303,8.99899
849,1645435293,47.74303,8.99899
850,1645435294,47.74303,8.99899
851,1645435295,47.74303,8.99899
852,1645435296,47.74303,8.99899
853,1645435297,47.74303,8.99899
854,1645435298,47.74303,8.99899
855,1645435299,47.74303,8.99899
856,1645435300,47.74303,8.99899
857,1645435301,47.74303,8.99899
858,1645435302,47.74303,8.99899
859,1645435303,47.74303,8.99899
860,1645435304,47.74303,8.99899
861,1645435305,47.74303,8.99899
862,1645435306,47.74303,8.99899
863,1645435307,47.74303,8.99899
864,1645435308,47.74303,8.99899
865,1645435309,47.74303,8.99899
866,1645435310,47.74303,8.99899
867,1645435311,47.74303,8.99899
868,1645435312,47.74303,8.99899
869,1645435313,47.74303,8.99899
870,1645435314,47.74303,8.99899
871,1645435315,47.74303,8.99899
872,1645435316,47.74303,8.99899
873,1645435317,47.74303,8.99899
874,1645435318,47.74303,8.99899
875,1645435319,47.74303,8.99899
876,1645435320,47.74303,8.99899
877,1645435321,47.74303,8.99899
878,1645435322,47.74303,8.99899
879,1645435323,47.74303,8.99899
880,1645435324,47.74303,8.99899
881,1645435325,47.74303,8.99899
882,1645435326,47.74303,8.99899
883,1645435327,47.74303,8.99899
884,1645435328,47.74303,8.99899
885,1645435329,47.74303,8.99899
886,1645435330,47.74302,8.99899
887,1645435331,47.74302,8.99899
888,1645435332,47.74302,8.99899
889,1645435333,47.74302,8.99899
890,1645435334,47.74302,8.99899
891,1645435335,47.74302,8.99899
892,1645435336,47.74302,8.99899
893,1645435337,47.74302,8.99899
894,1645435338,47.74302,8.99899
895,1645435339,47.74302,8.99899
896,1645435340,47.74302,8.99899
897,1645435341,47.74302,8.99899
898,1645435342,47.74302,8.99899
899,1645435343,47.74302,8.99899
900,1645435344,47.74302,8.99899
901,1645435345,47.74302,8.99899
902,1645435346,47.74302,8.99899
903,1645435347,47.74302,8.99899
904,1645435348,47.74302,8.99899
905,1645435349,47.74302,8.99899
906,1645435350,47.74302,8.99899
907,1645435351,47.74302,8.99899
908,1645435352,47.74301,8.99899
909,1645435353,47.74301,8.99899
910,1645435354,47.74301,8.99899
911,1645435355,47.74302,8.99899
912,1645435356,47.74302,8.99899
913,1645435357,47.74302,8.99899
914,1645435358,47.74302,8.99899
915,1645435359,47.74302,8.99899
916,1645435360,47.74302,8.99899
917,1645435361,47.74302,8.99899
918,1645435362,47.74302,8.99899
919,1645435363,47.74302,8.99899
920,1645435364,47.74302,8.99899
921,1645435365,47.74302,8.99899
922,1645435366,47.74302,8.99899
923,1645435367,47.74302,8.99899
924,1645435368,47.74302,8.99899
925,1645435369,47.74302,8.99899
926,1645435370,47.74302,8.99899
927,1645435371,47.74302,8.99899
928,1645435372,47.74302,8.99899
929,1645435373,47.74302,8.99899
930,1645435374,47.74302,8.99899
931,1645435375,47.74302,8.99899
932,1645435376,47.74302,8.99899
933,1645435377,47.74302,8.99899
934,1645435378,47.74302,8.99899
935,1645435379,47.74302,8.99899
936,1645435380,47.74302,8.99899
937,1645435381,47.74302,8.99899
938,1645435382,47.74302,8.99899
939,1645435383,47.74302,8.99899
940,1645435384,47.74302,8.99899
941,1645435385,47.74302,8.99899
942,1645435386,47.74302,8.99899
943,1645435387,47.74302,8.99899
944,1645435388,47.74302,8.99899
945,1645435389,47.74302,8.99899
946,1645435390,47.74302,8.99899
947,1645435391,47.74302,8.99899
948,1645435392,47.74302,8.99899
949,1645435393,47.74302,8.99899
950,1645435394,47.74302,8.99899
951,1645435395,47.74302,8.99899
952,1645435396,47.74302,8.99899
953,1645435397,47.74302,8.99899
954,1645435398,47.74302,8.99899
955,1645435399,47.74302,8.99899
956,1645435400,47.74302,8.99899
957,1645435401,47.74302,8.99899
958,1645435402,47.74302,8.99899
959,1645435403,47.74302,8.99899
960,1645435404,47.74302,8.99899
961,1645435405,47.74302,8.99899
962,1645435406,47.74302,8.99899
963,1645435407,47.74302,8.99899
964,1645435408,47.74302,8.99899
965,1645435409,47.74302,8.99899
966,1645435410,47.74302,8.99899
967,1645435411,47.74302,8.99899
968,1645435412,47.74302,8.99899
969,1645435413,47.74302,8.99899
970,1645435414,47.74302,8.99899
971,1645435415,47.74302,8.99899
972,1645435416,47.74302,8.99899
973,1645435417,47.74302,8.99899
974,1645435418,47.74302,8.99899
975,1645435419,47.74302,8.99899
976,1645435420,47.74302,8.99899
977,1645435421,47.74302,8.99899
978,1645435422,47.74302,8.99899
979,1645435423,47.74302,8.99899
980,1645435424,47.74302,8.99899
981,1645435425,47.74302,8.99899
982,1645435426,47.74302,8.99899
983,1645435427,47.74302,8.99899
984,1645435428,47.74302,8.99899
985,1645435429,47.74302,8.99899
986,1645435430,47.74302,8.99899
987,1645435431,47.74302,8.99899
988,1645435432,47.74302,8.99899
989,1645435433,47.74302,8.99899
990,1645435434,47.74302,8.99899
991,1645435435,47.74302,8.99899
992,1645435436,47.74302,8.99899
993,1645435437,47.74302,8.99899
994,1645435438,47.74302,8.99899
995,1645435439,47.74302,8.99899
996,1645435440,47.74302,8.99899
997,1645435441,47.74302,8.99899
998,1645435442,47.74302,8.99899
999,1645435443,47.74302,8.99899
1000,1645435444,47.74302,8.99899
1001,1645435445,47.74302,8.99899
1002,1645435446,47.74302,8.99899
1003,1645435447,47.74302,8.99899
1004,1645435448,47.74302,8.99899
1005,1645435449,47.74302,8.99899
1006,1645435450,47.74302,8.99899
1007,1645435451,47.74302,8.99899
1008,1645435452,47.74302,8.99899
1009,1645435453,47.74302,8.99899
1010,1645435454,47.74302,8.99899
1011,1645435455,47.74302,8.99899
1012,1645435456,47.74302,8.99899
1013,1645435457,47.74302,8.99899
1014,1645435458,47.74302,8.99899
1015,1645435459,47.74302,8.99899
1016,1645435460,47.74302,8.99899
1017,1645435461,47.74302,8.99899
1018,1645435462,47.74302,8.99899
1019,1645435463,47.74302,8.99899
1020,1645435464,47.74302,8.99899
1021,1645435465,47.74302,8.99899
1022,1645435466,47.74302,8.99899
1023,1645435467,47.74302,8.99899
1024,1645435468,47.74302,8.99899
1025,1645435469,47.74302,8.99899
1026,1645435470,47.74302,8.99899
1027,1645435471,47.74302,8.99899
1028,1645435472,47.74302,8.99899
1029,1645435473,47.74302,8.99899
1030,1645435474,47.74302,8.99899
1031,1645435475,47.74302,8.99899
1032,1645435476,47.74302,8.99899
1033,1645435477,47.74302,8.99899
1034,1645435478,47.74302,8.99899
1035,1645435479,47.74302,8.99899
1036,1645435480,47.74302,8.99899
1037,1645435481,47.74302,8.99899
1038,1645435482,47.74302,8.99899
1039,1645435483,47.74302,8.99899
1040,1645435484,47.74302,8.99899
1041,1645435485,47.74302,8.99899
1042,1645435486,47.74302,8.99899
1043,1645435487,47.74302,8.99899
1044,1645435488,47.74302,8.99899
1045,1645435489,47.74302,8.99899
1046,1645435490,47.74302,8.99899
1047,1645435491,47.74302,8.99899
1048,1645435492,47.74302,8.99899
1049,1645435493,47.74302,8.99900
1050,1645435494,47.74302,8.99900
1051,1645435495,47.74302,8.99900
1052,1645435496,47.74302,8.99900
1053,1645435497,47.74302,8.99900
1054,1645435498,47.74302,8.99900
1055,1645435499,47.74302,8.99900
1056,1645435500,47.74302,8.99900
1057,1645435501,47.74302,8.99900
1058,1645435502,47.74302,8.99900
1059,1645435503,47.74302,8.99900
1060,1645435504,47.74302,8.99900
1061,1645435505,47.74302,8.99900
1062,1645435506,47.74302,8.99900
1063,1645435507,47.74302,8.99900
1064,1645435508,47.74302,8.99900
1065,1645435509,47.74302,8.99900
1066,1645435510,47.74302,8.99900
1067,1645435511,47.74302,8.99900
1068,1645435512,47.74302,8.99900
1069,1645435513,47.74302,8.99900
1070,1645435514,47.74302,8.99900
1071,1645435515,47.74302,8.99900
1072,1645435516,47.74302,8.99900
1073,1645435517,47.74302,8.99900
1074,1645435518,47.74302,8.99900
1075,1645435519,47.74302,8.99900
1076,1645435520,47.74302,8.99900
1077,1645435521,47.74302,8.99900
1078,1645435522,47.74302,8.99900
1079,1645435523,47.74302,8.99900
1080,1645435524,47.74302,8.99900
1081,1645435525,47.74302,8.99900
1082,1645435526,47.74302,8.99900
1083,1645435527,47.74302,8.99900
1084,1645435528,47.74302,8.99900
1085,1645435529,47.74302,8.99900
1086,1645435530,47.74302,8.99900
1087,1645435531,47.74302,8.99900
1088,1645435532,47.74302,8.99900
1089,1645435533,47.74302,8.99900
1090,1645435534,47.74302,8.99900
1091,1645435535,47.74302,8.99900
1092,1645435536,47.74302,8.99900
1093,1645435537,47.74302,8.99900
1094,1645435538,47.74302,8.99900
1095,1645435539,47.74302,8.99900
1096,1645435540,47.74302,8.99900
1097,1645435541,47.74302,8.99900
1098,1645435542,47.74302,8.99900
1099,1645435543,47.74302,8.99900
1100,1645435544,47.74302,8.99900
1101,1645435545,47.74302,8.99900
1102,1645435546,47.74302,8.99900
1103,1645435547,47.74302,8.99900
1104,1645435548,47.74302,8.99900
1105,1645435549,47.74302,8.99900
1106,1645435550,47.74302,8.99900
1107,1645435551,47.74302,8.99900
1108,1645435552,47.74302,8.99900
1109,1645435553,47.74302,8.99900
1110,1645435554,47.74302,8.99900
1111,1645435555,47.74302,8.99900
1112,1645435556,47.74302,8.99900
1113,1645435557,47.74302,8.99900
1114,1645435558,47.74302,8.99900
1115,1645435559,47.74302,8.99900
1116,1645435560,47.74302,8.99900
1117,1645435561,47.74302,8.99900
1118,1645435562,47.74302,8.99900
1119,1645435563,47.74302,8.99900
1120,1645435564,47.74302,8.99900
1121,1645435565,47.74302,8.99900
1122,1645435566,47.74302,8.99900
1123,1645435567,47.74302,8.99900
1124,1645435568,47.74302,8.99900
1125,1645435569,47.74302,8.99900
1126,1645435570,47.74302,8.99900
1127,1645435571,47.74302,8.99900
1128,1645435572,47.74302,8.99900
1129,1645435573,47.74302,8.99900
1130,1645435574,47.74302,8.99900
1131,1645435575,47.74302,8.99900
1132,1645435576,47.74302,8.99900
1133,1645435577,47.74302,8.99900
1134,1645435578,47.74302,8.99900
1135,1645435579,47.74302,8.99900
1136,1645435580,47.74302,8.99900
1137,1645435581,47.74302,8.99900
1138,1645435582,47.74302,8.99900
1139,1645435583,47.74302,8.99900
1140,1645435584,47.74302,8.99900
1141,1645435585,47.74302,8.99900
1142,1645435586,47.74302,8.99900
1143,1645435587,47.74302,8.99900
1144,1645435588,47.74302,8.99900
1145,1645435589,47.74302,8.99900
1146,1645435590,47.74302,8.99900
1147,1645435591,47.74302,8.99900
1148,1645435592,47.74302,8.99900
1149,1645435593,47.74302,8.99900
1150,1645435594,47.74302,8.99900
1151,1645435595,47.74302,8.99900
1152,1645435596,47.74302,8.99900
1153,1645435597,47.74302,8.99900
1154,1645435598,47.74302,8.99900
1155,1645435599,47.74302,8.99900
1156,1645435600,47.74302,8.99900
1157,1645435601,47.74302,8.99900
1158,1645435602,47.74302,8.99900
1159,1645435603,47.74302,8.99900
1160,1645435604,47.74302,8.99900
1161,1645435605,47.74302,8.99900
1162,1645435606,47.74302,8.99901
1163,1645435607,47.74302,8.99901
1164,1645435608,47.74302,8.99901
1165,1645435609,47.74302,8.99901
1166,1645435610,47.74302,8.99901
1167,1645435611,47.74302,8.99901
1168,1645435612,47.74302,8.99901
1169,1645435613,47.74302,8.99901
1170,1645435614,47.74302,8.99901
1171,1645435615,47.74302,8.99901
1172,1645435616,47.74302,8.99901
1173,1645435617,47.74302,8.99901
1174,1645435618,47.74302,8.99901
1175,1645435619,47.74302,8.99901
1176,1645435620,47.74302,8.99901
1177,1645435621,47.74302,8.99901
1178,1645435622,47.74302,8.99901
1179,1645435623,47.74302,8.99901
1180,1645435624,47.74302,8.99901
1181,1645435625,47.74302,8.99901
1182,1645435626,47.74302,8.99901
1183,1645435627,47.74302,8.99901
1184,1645435628,47.74302,8.99901
1185,1645435629,47.74302,8.99901
1186,1645435630,47.74302,8.99901
1187,1645435631,47.74302,8.99901
1188,1645435632,47.74302,8.99901
1189,1645435633,47.74302,8.99901
1190,1645435634,47.74302,8.99901
1191,1645435635,47.74302,8.99901
1192,1645435636,47.74302,8.99901
1193,1645435637,47.74302,8.99901
1194,1645435638,47.74302,8.99901
1195,1645435639,47.74302,8.99901
1196,1645435640,47.74302,8.99901
1197,1645435641,47.74302,8.99901
1198,1645435642,47.74302,8.99901
1199,1645435643,47.74302,8.99901
1200,1645435644,47.74302,8.99901
1201,1645435645,47.74302,8.99901
1202,1645435646,47.74303,8.99901
1203,1645435647,47.74303,8.99902
1204,1645435648,47.74304,8.99902
1205,1645435649,47.74304,8.99902
1206,1645435650,47.74304,8.99902
1207,1645435651,47.74304,8.99902
1208,1645435652,47.74304,8.99902
1209,1645435653,47.74304,8.99902
1210,1645435654,47.74304,8.99902
1211,1645435655,47.74304,8.99902
1212,1645435656,47.74304,8.99902
1213,1645435657,47.74304,8.99902
1214,1645435658,47.74304,8.99902
1215,1645435659,47.74304,8.99902
1216,1645435660,47.74304,8.99902
1217,1645435661,47.74304,8.99902
1218,1645435662,47.74304,8.99902
1219,1645435663,47.74304,8.99902
1220,1645435664,47.74304,8.99902
1221,1645435665,47.74304,8.99902
1222,1645435666,47.74304,8.99902
1223,1645435667,47.74304,8.99902
1224,1645435668,47.74304,8.99902
1225,1645435669,47.74304,8.99902
1226,1645435670,47.74304,8.99902
1227,1645435671,47.74304,8.99902
1228,1645435672,47.74304,8.99902
1229,1645435673,47.74304,8.99902
1230,1645435674,47.74304,8.99902
1231,1645435675,47.74304,8.99902
1232,1645435676,47.74304,8.99902
1233,1645435677,47.74304,8.99902
1234,1645435678,47.74304,8.99902
1235,1645435679,47.74304,8.99902
1236,1645435680,47.74304,8.99902
1237,1645435681,47.74304,8.99902
1238,1645435682,47.74304,8.99902
1239,1645435683,47.74304,8.99902
1240,1645435684,47.74304,8.99902
1241,1645435685,47.74304,8.99902
1242,1645435686,47.74304,8.99902
1243,1645435687,47.74304,8.99902
1244,1645435688,47.74304,8.99902
1245,1645435689,47.74304,8.99902
1246,1645435690,47.74304,8.99902
1247,1645435691,47.74304,8.99902
1248,1645435692,47.74304,8.99902
1249,1645435693,47.74304,8.99902
1250,1645435694,47.74304,8.99902
1251,1645435695,47.74304,8.99902
1252,1645435696,47.74304,8.99902
1253,1645435697,47.74304,8.99902
1254,1645435698,47.74304,8.99902
1255,1645435699,47.74304,8.99902
1256,1645435700,47.74304,8.99902
1257,1645435701,47.74304,8.99902
1258,1645435702,47.74304,8.99902
1259,1645435703,47.74303,8.99901
1260,1645435704,47.74303,8.99901
1261,1645435705,47.74303,8.99901
1262,1645435706,47.74303,8.99900
1263,1645435707,47.74303,8.99900
1264,1645435708,47.74303,8.99900
1265,1645435709,47.74303,8.99900
1266,1645435710,47.74303,8.99900
1267,1645435711,47.74303,8.99900
1268,1645435712,47.74303,8.99900
1269,1645435713,47.74303,8.99900
1270,1645435714,47.74303,8.99900
1271,1645435715,47.74303,8.99900
1272,1645435716,47.74303,8.99900
1273,1645435717,47.74303,8.99900
1274,1645435718,47.74303,8.99900
1275,1645435719,47.74303,8.99900
1276,1645435720,47.74303,8.99900
1277,1645435721,47.74303,8.99900
1278,1645435722,47.74303,8.99900
1279,1645435723,47.74303,8.99900
1280,1645435724,47.74303,8.99900
1281,1645435725,47.74303,8.99900
1282,1645435726,47.74303,8.99900
1283,1645435727,47.74303,8.99900
1284,1645435728,47.74303,8.99900
1285,1645435729,47.74303,8.99900
1286,1645435730,47.74303,8.99900
1287,1645435731,47.74303,8.99900
1288,1645435732,47.74303,8.99900
1289,1645435733,47.74303,8.99900
1290,1645435734,47.74303,8.99900
1291,1645435735,47.74303,8.99900
1292,1645435736,47.74303,8.99900
1293,1645435737,47.74303,8.99900
1294,1645435738,47.74303,8.99900
1295,1645435739,47.74303,8.99900
1296,1645435740,47.74303,8.99900
1297,1645435741,47.74303,8.99900
1298,1645435742,47.74303,8.99900
1299,1645435743,47.74303,8.99900
1300,1645435744,47.74303,8.99900
1301,1645435745,47.74303,8.99900
1302,1645435746,47.74303,8.99900
1303,1645435747,47.74303,8.99900
1304,1645435748,47.74303,8.99900
1305,1645435749,47.74303,8.99900
1306,1645435750,47.74303,8.99900
1307,1645435751,47.74303,8.99900
1308,1645435752,47.74303,8.99900
1309,1645435753,47.74303,8.99900
1310,1645435754,47.74303,8.99900
1311,1645435755,47.74303,8.99900
1312,1645435756,47.74303,8.99900
1313,1645435757,47.74303,8.99900
1314,1645435758,47.74303,8.99900
1315,1645435759,47.74303,8.99900
1316,1645435760,47.74303,8.99900
1317,1645435761,47.74303,8.99900
1318,1645435762,47.74303,8.99900
1319,1645435763,47.74303,8.99900
1320,1645435764,47.74303,8.99900
1321,1645435765,47.74303,8.99900
1322,1645435766,47.74303,8.99900
1323,1645435767,47.74303,8.99900
1324,1645435768,47.74303,8.99900
1325,1645435769,47.74303,8.99900
1326,1645435770,47.74303,8.99900
1327,1645435771,47.74303,8.99900
1328,1645435772,47.74303,8.99900
1329,1645435773,47.74303,8.99900
1330,1645435774,47.74303,8.99900
1331,1645435775,47.74303,8.99900
1332,1645435776,47.74303,8.99900
1333,1645435777,47.74303,8.99900
1334,1645435778,47.74303,8.99900
1335,1645435779,47.74303,8.99900
1336,1645435780,47.74303,8.99900
1337,1645435781,47.74303,8.99900
1338,1645435782,47.74303,8.99900
1339,1645435783,47.74303,8.99900
1340,1645435784,47.74303,8.99900
1341,1645435785,47.74303,8.99900
1342,1645435786,47.74303,8.99900
1343,1645435787,47.74303,8.99900
1344,1645435788,47.74303,8.99900
1345,1645435789,47.74303,8.99900
1346,1645435790,47.74303,8.99900
1347,1645435791,47.74303,8.99900
1348,1645435792,47.74303,8.99900
1349,1645435793,47.74303,8.99900
1350,1645435794,47.74303,8.99900
1351,1645435795,47.74303,8.99900
1352,1645435796,47.74303,8.99900
1353,1645435797,47.74303,8.99900
1354,1645435798,47.74303,8.99900
1355,1645435799,47.74303,8.99900
1356,1645435800,47.74303,8.99900
1357,1645435801,47.74303,8.99900
1358,1645435802,47.74303,8.99900
1359,1645435803,47.74303,8.99900
1360,1645435804,47.74303,8.99900
1361,1645435805,47.74303,8.99900
1362,1645435806,47.74303,8.99901
1363,1645435807,47.74303,8.99901
1364,1645435808,47.74303,8.99901
1365,1645435809,47.74303,8.99901
1366,1645435810,47.74303,8.99901
1367,1645435811,47.74303,8.99901
1368,1645435812,47.74303,8.99901
1369,1645435813,47.74303,8.99901
1370,1645435814,47.74303,8.99901
1371,1645435815,47.74303,8.99901
1372,1645435816,47.74303,8.99901
1373,1645435817,47.74303,8.99901
1374,1645435818,47.74303,8.99901
1375,1645435819,47.74303,8.99901
1376,1645435820,47.74303,8.99901
1377,1645435821,47.74303,8.99901
1378,1645435822,47.74303,8.99901
1379,1645435823,47.74303,8.99901
1380,1645435824,47.74303,8.99901
1381,1645435825,47.74303,8.99901
1382,1645435826,47.74303,8.99901
1383,1645435827,47.74303,8.99901
1384,1645435828,47.74303,8.99901
1385,1645435829,47.74303,8.99901
1386,1645435830,47.74303,8.99901
1387,1645435831,47.74303,8.99901
1388,1645435832,47.74303,8.99901
1389,1645435833,47.74303,8.99901
1390,1645435834,47.74303,8.99901
1391,1645435835,47.74303,8.99901
1392,1645435836,47.74303,8.99901
1393,1645435837,47.74303,8.99901
1394,1645435838,47.74303,8.99901
1395,1645435839,47.74303,8.99901
1396,1645435840,47.74303,8.99901
1397,1645435841,47.74303,8.99901
1398,1645435842,47.74303,8.99901
1399,1645435843,47.74303,8.99901
1400,1645435844,47.74303,8.99901
1401,1645435845,47.74303,8.99901
1402,1645435846,47.74303,8.99901
1403,1645435847,47.74303,8.99901
1404,1645435848,47.74303,8.99901
1405,1645435849,47.74303,8.99901
1406,1645435850,47.74303,8.99901
1407,1645435851,47.74303,8.99901
1408,1645435852,47.74303,8.99901
1409,1645435853,47.74303,8.99901
1410,1645435854,47.74303,8.99901
1411,1645435855,47.74303,8.99901
1412,1645435856,47.74303,8.99901
1413,1645435857,47.74303,8.99901
1414,1645435858,47.74303,8.99901
1415,1645435859,47.74303,8.99901
1416,1645435860,47.74303,8.99901
1417,1645435861,47.74303,8.99901
1418,1645435862,47.74303,8.99901
1419,1645435863,47.74303,8.99901
1420,1645435864,47.74303,8.99901
1421,1645435865,47.74303,8.99901
1422,1645435866,47.74304,8.99901
1423,1645435867,47.74304,8.99902
1424,1645435868,47.74304,8.99901
1425,1645435869,47.74304,8.99901
1426,1645435870,47.74304,8.99901
1427,1645435871,47.74304,8.99901
1428,1645435872,47.74304,8.99901
1429,1645435873,47.74304,8.99901
1430,1645435874,47.74304,8.99901
1431,1645435875,47.74304,8.99901
1432,1645435876,47.74304,8.99901
1433,1645435877,47.74304,8.99901
1434,1645435878,47.74304,8.99901
1435,1645435879,47.74304,8.99901
1436,1645435880,47.74304,8.99901
1437,1645435881,47.74304,8.99901
1438,1645435882,47.74304,8.99901
1439,1645435883,47.74304,8.99901
1440,1645435884,47.74304,8.99901
1441,1645435885,47.74304,8.99901
1442,1645435886,47.74304,8.99901
1443,1645435887,47.74304,8.99901
1444,1645435888,47.74304,8.99901
1445,1645435889,47.74304,8.99901
1446,1645435890,47.74304,8.99901
1447,1645435891,47.74304,8.99901
1448,1645435892,47.74304,8.99901
1449,1645435893,47.74304,8.99901
1450,1645435894,47.74304,8.99901
1451,1645435895,47.74304,8.99901
1452,1645435896,47.74304,8.99901
1453,1645435897,47.74304,8.99901
1454,1645435898,47.74304,8.99901
1455,1645435899,47.74304,8.99901
1456,1645435900,47.74304,8.99901
1457,1645435901,47.74304,8.99901
1458,1645435902,47.74304,8.99901
1459,1645435903,47.74304,8.99901
1460,1645435904,47.74304,8.99901
1461,1645435905,47.74304,8.99901
1462,1645435906,47.74304,8.99901
1463,1645435907,47.74304,8.99901
1464,1645435908,47.74304,8.99901
1465,1645435909,47.74304,8.99901
1466,1645435910,47.74304,8.99901
1467,1645435911,47.74304,8.99901
1468,1645435912,47.74304,8.99901
1469,1645435913,47.74304,8.99901
1470,1645435914,47.74304,8.99901
1471,1645435915,47.74304,8.99901
1472,1645435916,47.74304,8.99901
1473,1645435917,47.74304,8.99901
1474,1645435918,47.74304,8.99901
1475,1645435919,47.74304,8.99901
1476,1645435920,47.74304,8.99901
1477,1645435921,47.74304,8.99901
1478,1645435922,47.74304,8.99901
1479,1645435923,47.74304,8.99901
1480,1645435924,47.74304,8.99901
1481,1645435925,47.74304,8.99901
1482,1645435926,47.74304,8.99901
1483,1645435927,47.74304,8.99901
1484,1645435928,47.74304,8.99901
1485,1645435929,47.74304,8.99901
1486,1645435930,47.74304,8.99901
1487,1645435931,47.74304,8.99901
1488,1645435932,47.74304,8.99901
1489,1645435933,47.74304,8.99901
1490,1645435934,47.74304,8.99901
1491,1645435935,47.74304,8.99901
1492,1645435936,47.74304,8.99901
1493,1645435937,47.74304,8.99901
1494,1645435938,47.74304,8.99901
1495,1645435939,47.74304,8.99901
1496,1645435940,47.74303,8.99901
1497,1645435941,47.74303,8.99902
1498,1645435942,47.74303,8.99902
1499,1645435943,47.74303,8.99902
1500,1645435944,47.74303,8.99902
1501,1645435945,47.74303,8.99902
1502,1645435946,47.74303,8.99902
1503,1645435947,47.74303,8.99902
1504,1645435948,47.74303,8.99902
1505,1645435949,47.74303,8.99902
1506,1645435950,47.74303,8.99902
1507,1645435951,47.74303,8.99902
1508,1645435952,47.74303,8.99902
1509,1645435953,47.74303,8.99902
1510,1645435954,47.74303,8.99902
1511,1645435955,47.74303,8.99902
1512,1645435956,47.74303,8.99902
1513,1645435957,47.74303,8.99902
1514,1645435958,47.74303,8.99902
1515,1645435959,47.74303,8.99902
1516,1645435960,47.74303,8.99902
1517,1645435961,47.74303,8.99902
1518,1645435962,47.74303,8.99902
1519,1645435963,47.74303,8.99902
1520,1645435964,47.74303,8.99902
1521,1645435965,47.74303,8.99902
1522,1645435966,47.74303,8.99902
1523,1645435967,47.74303,8.99902
1524,1645435968,47.74303,8.99902
1525,1645435969,47.74303,8.99902
1526,1645435970,47.74303,8.99902
1527,1645435971,47.74303,8.99902
1528,1645435972,47.74303,8.99902
1529,1645435973,47.74303,8.99902
1530,1645435974,47.74303,8.99902
1531,1645435975,47.74303,8.99902
1532,1645435976,47.74303,8.99902
1533,1645435977,47.74303,8.99902
1534,1645435978,47.74303,8.99902
1535,1645435979,47.74303,8.99902
1536,1645435980,47.74303,8.99902
1537,1645435981,47.74303,8.99902
1538,1645435982,47.74303,8.99902
1539,1645435983,47.74303,8.99902
1540,1645435984,47.74303,8.99902
1541,1645435985,47.74303,8.99902
1542,1645435986,47.74303,8.99902
1543,1645435987,47.74303,8.99902
1544,1645435988,47.74303,8.99902
1545,1645435989,47.74303,8.99902
1546,1645435990,47.74303,8.99902
1547,1645435991,47.74303,8.99902
1548,1645435992,47.74303,8.99902
1549,1645435993,47.74303,8.99902
1550,1645435994,47.74303,8.99902
1551,1645435995,47.74303,8.99902
1552,1645435996,47.74303,8.99902
1553,1645435997,47.74303,8.99902
1554,1645435998,47.74303,8.99902
1555,1645435999,47.74303,8.99902
1556,1645436000,47.74303,8.99902
1557,1645436001,47.74303,8.99902
1558,1645436002,47.74303,8.99902
1559,1645436003,47.74303,8.99902
1560,1645436004,47.74303,8.99902
1561,1645436005,47.74303,8.99902
1562,1645436006,47.74303,8.99902
1563,1645436007,47.74303,8.99902
1564,1645436008,47.74303,8.99902
1565,1645436009,47.74303,8.99902
1566,1645436010,47.74303,8.99902
1567,1645436011,47.74303,8.99902
1568,1645436012,47.74303,8.99902
1569,1645436013,47.74303,8.99902
1570,1645436014,47.74303,8.99902
1571,1645436015,47.74303,8.99902
1572,1645436016,47.74303,8.99902
1573,1645436017,47.74303,8.99902
1574,1645436018,47.74303,8.99902
1575,1645436019,47.74303,8.99902
1576,1645436020,47.74303,8.99902
1577,1645436021,47.74303,8.99902
1578,1645436022,47.74303,8.99902
1579,1645436023,47.74303,8.99902
1580,1645436024,47.74303,8.99902
1581,1645436025,47.74303,8.99902
1582,1645436026,47.74303,8.99902
1583,1645436027,47.74303,8.99902
1584,1645436028,47.74303,8.99902
1585,1645436029,47.74303,8.99902
1586,1645436030,47.74303,8.99902
1587,1645436031,47.74303,8.99902
1588,1645436032,47.74303,8.99902
1589,1645436033,47.74303,8.99902
1590,1645436034,47.74303,8.99902
1591,1645436035,47.74303,8.99902
1592,1645436036,47.74303,8.99902
1593,1645436037,47.74303,8.99902
1594,1645436038,47.74303,8.99902
1595,1645436039,47.74303,8.99902
1596,1645436040,47.74303,8.99902
1597,1645436041,47.74303,8.99902
1598,1645436042,47.74303,8.99902
1599,1645436043,47.74303,8.99902
1600,1645436044,47.74303,8.99902
1601,1645436045,47.74303,8.99902
1602,1645436046,47.74303,8.99902
1603,1645436047,47.74303,8.99902
1604,1645436048,47.74303,8.99902
1605,1645436049,47.74303,8.99902
1606,1645436050,47.74303,8.99902
1607,1645436051,47.74303,8.99902
1608,1645436052,47.74303,8.99902
1609,1645436053,47.74303,8.99902
1610,1645436054,47.74303,8.99902
1611,1645436055,47.74303,8.99902
1612,1645436056,47.74303,8.99902
1613,1645436057,47.74303,8.99902
1614,1645436058,47.74304,8.99902
1615,1645436059,47.74304,8.99902
1616,1645436060,47.74304,8.99902
1617,1645436061,47.74304,8.99902
1618,1645436062,47.74304,8.99902
1619,1645436063,47.74304,8.99902
1620,1645436064,47.74304,8.99902
1621,1645436065,47.74304,8.99902
1622,1645436066,47.74304,8.99902
1623,1645436067,47.74304,8.99902
1624,1645436068,47.74304,8.99902
1625,1645436069,47.74304,8.99902
1626,1645436070,47.74304,8.99902
1627,1645436071,47.74304,8.99902
1628,1645436072,47.74304,8.99902
1629,1645436073,47.74304,8.99902
1630,1645436074,47.74304,8.99902
1631,1645436075,47.74304,8.99902
1632,1645436076,47.74304,8.99902
1633,1645436077,47.74304,8.99902
1634,1645436078,47.74304,8.99902
1635,1645436079,47.74304,8.99902
1636,1645436080,47.74304,8.99902
1637,1645436081,47.74304,8.99902
1638,1645436082,47.74304,8.99902
1639,1645436083,47.74304,8.99902
1640,1645436084,47.74304,8.99902
1641,1645436085,47.74304,8.99902
1642,1645436086,47.74304,8.99902
1643,1645436087,47.74304,8.99902
1644,1645436088,47.74304,8.99902
1645,1645436089,47.74304,8.99902
1646,1645436090,47.74304,8.99902
1647,1645436091,47.74304,8.99902
1648,1645436092,47.74304,8.99902
1649,1645436093,47.74304,8.99902
1650,1645436094,47.74304,8.99902
1651,1645436095,47.74304,8.99902
1652,1645436096,47.74304,8.99902
1653,1645436097,47.74304,8.99902
1654,1645436098,47.74304,8.99902
1655,1645436099,47.74304,8.99902
1656,1645436100,47.74304,8.99902
1657,1645436101,47.74304,8.99902
1658,1645436102,47.74304,8.99902
1659,1645436103,47.74304,8.99902
1660,1645436104,47.74304,8.99902
1661,1645436105,47.74304,8.99902
1662,1645436106,47.74304,8.99902
1663,1645436107,47.74304,8.99902
1664,1645436108,47.74304,8.99902
1665,1645436109,47.74304,8.99902
1666,1645436110,47.74304,8.99902
1667,1645436111,47.74304,8.99902
1668,1645436112,47.74304,8.99902
1669,1645436113,47.74304,8.99902
1670,1645436114,47.74304,8.99902
1671,1645436115,47.74304,8.99902
1672,1645436116,47.74304,8.99902
1673,1645436117,47.74305,8.99902
1674,1645436118,47.74305,8.99902
1675,1645436119,47.74305,8.99902
1676,1645436120,47.74305,8.99902
1677,1645436121,47.74305,8.99902
1678,1645436122,47.74305,8.99902
1679,1645436123,47.74305,8.99902
1680,1645436124,47.74305,8.99902
1681,1645436125,47.74305,8.99902
1682,1645436126,47.74305,8.99902
1683,1645436127,47.74305,8.99902
1684,1645436128,47.74305,8.99902
1685,1645436129,47.74305,8.99902
1686,1645436130,47.74305,8.99902
1687,1645436131,47.74305,8.99902
1688,1645436132,47.74305,8.99902
1689,1645436133,47.74305,8.99902
1690,1645436134,47.74305,8.99903
1691,1645436135,47.74305,8.99903
1692,1645436136,47.74305,8.99903
1693,1645436137,47.74306,8.99903
1694,1645436138,47.74306,8.99903
1695,1645436139,47.74306,8.99903
1696,1645436140,47.74306,8.99903
1697,1645436141,47.74306,8.99903
1698,1645436142,47.74306,8.99903
1699,1645436143,47.74306,8.99903
1700,1645436144,47.74306,8.99903
1701,1645436145,47.74306,8.99903
1702,1645436146,47.74306,8.99904
1703,1645436147,47.74306,8.99904
1704,1645436148,47.74306,8.99904
1705,1645436149,47.74306,8.99904
1706,1645436150,47.74306,8.99904
1707,1645436151,47.74306,8.99904
1708,1645436152,47.74306,8.99904
1709,1645436153,47.74306,8.99904
1710,1645436154,47.74306,8.99904
1711,1645436155,47.74306,8.99904
1712,1645436156,47.74306,8.99904
1713,1645436157,47.74306,8.99904
1714,1645436158,47.74306,8.99904
1715,1645436159,47.74306,8.99904
1716,1645436160,47.74306,8.99904
1717,1645436161,47.74306,8.99904
1718,1645436162,47.74306,8.99904
1719,1645436163,47.74306,8.99904
1720,1645436164,47.74306,8.99904
1721,1645436165,47.74306,8.99904
1722,1645436166,47.74306,8.99904
1723,1645436167,47.74306,8.99904
1724,1645436168,47.74306,8.99904
1725,1645436169,47.74306,8.99904
1726,1645436170,47.74306,8.99904
1727,1645436171,47.74306,8.99904
1728,1645436172,47.74306,8.99904
1729,1645436173,47.74306,8.99904
1730,1645436174,47.74306,8.99904
1731,1645436175,47.74306,8.99904
1732,1645436176,47.74306,8.99904
1733,1645436177,47.74306,8.99904
1734,1645436178,47.74306,8.99904
1735,1645436179,47.74306,8.99904
1736,1645436180,47.74306,8.99904
1737,1645436181,47.74306,8.99904
1738,1645436182,47.74306,8.99904
1739,1645436183,47.74306,8.99904
1740,1645436184,47.74306,8.99904
1741,1645436185,47.74306,8.99904
1742,1645436186,47.74306,8.99904
1743,1645436187,47.74306,8.99904
1744,1645436188,47.74306,8.99904
1745,1645436189,47.74306,8.99904
1746,1645436190,47.74306,8.99904
1747,1645436191,47.74306,8.99904
1748,1645436192,47.74306,8.99904
1749,1645436193,47.74306,8.99904
1750,1645436194,47.74306,8.99904
1751,1645436195,47.74306,8.99904
1752,1645436196,47.74306,8.99904
1753,1645436197,47.74306,8.99904
1754,1645436198,47.74306,8.99904
1755,1645436199,47.74306,8.99904
1756,1645436200,47.74306,8.99904
1757,1645436201,47.74306,8.99904
1758,1645436202,47.74306,8.99904
1759,1645436203,47.74306,8.99904
1760,1645436204,47.74306,8.99904
1761,1645436205,47.74306,8.99904
1762,1645436206,47.74306,8.99904
1763,1645436207,47.74306,8.99904
1764,1645436208,47.74306,8.99904
1765,1645436209,47.74306,8.99904
1766,1645436210,47.74306,8.99904
1767,1645436211,47.74306,8.99904
1768,1645436212,47.74306,8.99904
1769,1645436213,47.74306,8.99904
1770,1645436214,47.74306,8.99904
1771,1645436215,47.74306,8.99904
1772,1645436216,47.74306,8.99904
1773,1645436217,47.74306,8.99904
1774,1645436218,47.74306,8.99904
1775,1645436219,47.74306,8.99904
1776,1645436220,47.74306,8.99904
1777,1645436221,47.74306,8.99904
1778,1645436222,47.74306,8.99904
1779,1645436223,47.74306,8.99904
1780,1645436224,47.74306,8.99904
1781,1645436225,47.74306,8.99904
1782,1645436226,47.74306,8.99904
1783,1645436227,47.74306,8.99904
1784,1645436228,47.74306,8.99904
1785,1645436229,47.74306,8.99904
1786,1645436230,47.74306,8.99904
1787,1645436231,47.74306,8.99904
1788,1645436232,47.74306,8.99904
1789,1645436233,47.74306,8.99904
1790,1645436234,47.74306,8.99904
1791,1645436235,47.74306,8.99904
1792,1645436236,47.74306,8.99904
1793,1645436237,47.74306,8.99904
1794,1645436238,47.74306,8.99904
1795,1645436239,47.74306,8.99904
1796,1645436240,47.74306,8.99904
1797,1645436241,47.74306,8.99904
1798,1645436242,47.74306,8.99904
1799,1645436243,47.74306,8.99904
1800,1645436244,47.74306,8.99904
1801,1645436245,47.74306,8.99904
1802,1645436246,47.74306,8.99904
1803,1645436247,47.74306,8.99904
1804,1645436248,47.74305,8.99904
1805,1645436249,47.74305,8.99904
1806,1645436250,47.74305,8.99904
1807,1645436251,47.74305,8.99904
1808,1645436252,47.74305,8.99904
1809,1645436253,47.74305,8.99904
1810,1645436254,47.74305,8.99904
1811,1645436255,47.74305,8.99904
1812,1645436256,47.74305,8.99904
1813,1645436257,47.74305,8.99904
1814,1645436258,47.74305,8.99904
1815,1645436259,47.74305,8.99904
1816,1645436260,47.74305,8.99904
1817,1645436261,47.74305,8.99904
1818,1645436262,47.74305,8.99904
1819,1645436263,47.74305,8.99904
1820,1645436264,47.74305,8.99904
1821,1645436265,47.74305,8.99904
1822,1645436266,47.74305,8.99904
1823,1645436267,47.74305,8.99904
1824,1645436268,47.74305,8.99904
1825,1645436269,47.74305,8.99904
1826,1645436270,47.74305,8.99903
1827,1645436271,47.74305,8.99903
1828,1645436272,47.74305,8.99903
1829,1645436273,47.74305,8.99903
1830,1645436274,47.74305,8.99903
1831,1645436275,47.74305,8.99903
1832,1645436276,47.74305,8.99903
1833,1645436277,47.74305,8.99903
1834,1645436278,47.74305,8.99903
1835,1645436279,47.74305,8.99903
1836,1645436280,47.74305,8.99903
1837,1645436281,47.74305,8.99903
1838,1645436282,47.74305,8.99903
1839,1645436283,47.74305,8.99903
1840,1645436284,47.74305,8.99903
1841,1645436285,47.74305,8.99903
1842,1645436286,47.74305,8.99903
1843,1645436287,47.74305,8.99902
1844,1645436288,47.74305,8.99902
1845,1645436289,47.74305,8.99902
1846,1645436290,47.74305,8.99902
1847,1645436291,47.74305,8.99902
1848,1645436292,47.74305,8.99902
1849,1645436293,47.74305,8.99902
1850,1645436294,47.74305,8.99902
1851,1645436295,47.74305,8.99902
1852,1645436296,47.74305,8.99902
1853,1645436297,47.74305,8.99902
1854,1645436298,47.74305,8.99902
1855,1645436299,47.74305,8.99902
1856,1645436300,47.74305,8.99902
1857,1645436301,47.74305,8.99902
1858,1645436302,47.74305,8.99902
1859,1645436303,47.74305,8.99902
1860,1645436304,47.74305,8.99902
1861,1645436305,47.74305,8.99902
1862,1645436306,47.74305,8.99902
1863,1645436307,47.74305,8.99902
1864,1645436308,47.74305,8.99902
1865,1645436309,47.74305,8.99902
1866,1645436310,47.74306,8.99903
1867,1645436311,47.74306,8.99903
1868,1645436312,47.74306,8.99903
1869,1645436313,47.74306,8.99903
1870,1645436314,47.74306,8.99903
1871,1645436315,47.74306,8.99903
1872,1645436316,47.74306,8.99903
1873,1645436317,47.74306,8.99903
1874,1645436318,47.74306,8.99903
1875,1645436319,47.74306,8.99903
1876,1645436320,47.74306,8.99903
1877,1645436321,47.74306,8.99903
1878,1645436322,47.74306,8.99903
1879,1645436323,47.74306,8.99903
1880,1645436324,47.74306,8.99903
1881,1645436325,47.74306,8.99903
1882,1645436326,47.74306,8.99903
1883,1645436327,47.74306,8.99903
1884,1645436328,47.74306,8.99903
1885,1645436329,47.74306,8.99903
1886,1645436330,47.74306,8.99903
1887,1645436331,47.74306,8.99903
1888,1645436332,47.74306,8.99903
1889,1645436333,47.74306,8.99903
1890,1645436334,47.74306,8.99903
1891,1645436335,47.74306,8.99903
1892,1645436336,47.74306,8.99903
1893,1645436337,47.74306,8.99903
1894,1645436338,47.74306,8.99903
1895,1645436339,47.74306,8.99903
1896,1645436340,47.74306,8.99903
1897,1645436341,47.74306,8.99903
1898,1645436342,47.74306,8.99903
1899,1645436343,47.74306,8.99903
1900,1645436344,47.74306,8.99903
1901,1645436345,47.74306,8.99903
1902,1645436346,47.74306,8.99903
1903,1645436347,47.74306,8.99903
1904,1645436348,47.74306,8.99903
1905,1645436349,47.74306,8.99903
1906,1645436350,47.74306,8.99903
1907,1645436351,47.74306,8.99903
1908,1645436352,47.74306,8.99903
1909,1645436353,47.74306,8.99903
1910,1645436354,47.74306,8.99903
1911,1645436355,47.74306,8.99903
1912,1645436356,47.74306,8.99903
1913,1645436357,47.74306,8.99903
1914,1645436358,47.74306,8.99903
1915,1645436359,47.74306,8.99903
1916,1645436360,47.74306,8.99903
1917,1645436361,47.74306,8.99903
1918,1645436362,47.74306,8.99903
1919,1645436363,47.74306,8.99903
1920,1645436364,47.74306,8.99903
1921,1645436365,47.74306,8.99903
1922,1645436366,47.74306,8.99903
1923,1645436367,47.74306,8.99903
1924,1645436368,47.74306,8.99903
1925,1645436369,47.74306,8.99903
1926,1645436370,47.74306,8.99903
1927,1645436371,47.74306,8.99903
1928,1645436372,47.74306,8.99903
1929,1645436373,47.74306,8.99903
1930,1645436374,47.74306,8.99903
1931,1645436375,47.74306,8.99903
1932,1645436376,47.74306,8.99903
1933,1645436377,47.74306,8.99903
1934,1645436378,47.74306,8.99903
1935,1645436379,47.74306,8.99903
1936,1645436380,47.74306,8.99903
1937,1645436381,47.74306,8.99903
1938,1645436382,47.74306,8.99903
1939,1645436383,47.74306,8.99903
1940,1645436384,47.74306,8.99903
1941,1645436385,47.74306,8.99903
1942,1645436386,47.74306,8.99903
1943,1645436387,47.74306,8.99903
1944,1645436388,47.74306,8.99903
1945,1645436389,47.74306,8.99903
1946,1645436390,47.74306,8.99903
1947,1645436391,47.74306,8.99903
1948,1645436392,47.74306,8.99903
1949,1645436393,47.74306,8.99903
1950,1645436394,47.74306,8.99903
1951,1645436395,47.74306,8.99903
1952,1645436396,47.74306,8.99903
1953,1645436397,47.74306,8.99903
1954,1645436398,47.74306,8.99903
1955,164543
Download .txt
gitextract_c417dd8h/

├── .gitattributes
├── LICENSE
├── README.md
├── TickTag3DPrints/
│   └── REV3/
│       ├── TTHousing165mAh_Bottom.stl
│       ├── TTHousing165mAh_Lid.stl
│       ├── TTHousing30mAhV2_Bottom.stl
│       ├── TTHousing30mAhV2_Lid.stl
│       ├── TTHousing30mAh_Bottom.stl
│       ├── TTHousing30mAh_Lid.stl
│       ├── TTHousingLiPoOutside_Bottom.stl
│       └── TTHousingLiPoOutside_Lid.stl
├── TickTagAndroidApp/
│   ├── .gitignore
│   ├── .idea/
│   │   ├── codeStyles/
│   │   │   └── Project.xml
│   │   ├── gradle.xml
│   │   ├── misc.xml
│   │   ├── runConfigurations.xml
│   │   └── vcs.xml
│   ├── app/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── timm/
│   │       │               └── ticktagandroidapp/
│   │       │                   └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── timm/
│   │       │   │           └── ticktagandroidapp/
│   │       │   │               ├── LogDataStorage.java
│   │       │   │               ├── MainActivity.java
│   │       │   │               ├── RawDataStorage.java
│   │       │   │               └── StorageGeneral.java
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── ic_launcher_background.xml
│   │       │       ├── drawable-v24/
│   │       │       │   ├── chart_fade.xml
│   │       │       │   └── ic_launcher_foreground.xml
│   │       │       ├── layout/
│   │       │       │   ├── activity_decoder.xml
│   │       │       │   ├── activity_detail.xml
│   │       │       │   └── activity_main.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   └── ic_launcher.xml
│   │       │       ├── values/
│   │       │       │   ├── colors.xml
│   │       │       │   ├── strings.xml
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           └── device_filter.xml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── timm/
│   │                       └── ticktagandroidapp/
│   │                           └── ExampleUnitTest.java
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── settings.gradle
├── TickTagData/
│   ├── 01_StationaryPosition_1s_Interval/
│   │   ├── 20220221_1s_Interval_10527_fixes.csv
│   │   ├── 20220221_1s_Interval_10527_fixes.txt
│   │   ├── 20220222_1s_Interval_10842_fixes.csv
│   │   ├── 20220222_1s_Interval_10842_fixes.txt
│   │   ├── 20220302_1s_Interval_9323_fixes.csv
│   │   ├── 20220302_1s_Interval_9323_fixes.txt
│   │   ├── 20220309_1s_Interval_10069_fixes.csv
│   │   └── 20220309_1s_Interval_10069_fixes.txt
│   ├── 02_StationaryPosition_5s_Interval/
│   │   ├── 20220223_5s_Interval_2060_fixes.csv
│   │   ├── 20220223_5s_Interval_2060_fixes.txt
│   │   ├── 20220223_5s_Interval_2113_fixes.csv
│   │   └── 20220223_5s_Interval_2113_fixes.txt
│   ├── 03_StationaryPosition_30s_Interval/
│   │   ├── 20220225_30s_Interval_683_fixes.csv
│   │   ├── 20220225_30s_Interval_683_fixes.txt
│   │   ├── 20220226_30s_Interval_309_fixes.csv
│   │   └── 20220226_30s_Interval_309_fixes.txt
│   ├── 04_StationaryPosition_60s_Interval/
│   │   ├── 20220227_60s_Interval_474_fixes.csv
│   │   ├── 20220227_60s_Interval_474_fixes.txt
│   │   ├── 20220228_60s_Interval_372_fixes.csv
│   │   └── 20220228_60s_Interval_372_fixes.txt
│   ├── 05_StationaryPosition_300s_Interval/
│   │   ├── 20220301_300s_Interval_94_fixes.csv
│   │   ├── 20220301_300s_Interval_94_fixes.txt
│   │   ├── 20220302_300s_Interval_283_fixes.csv
│   │   ├── 20220302_300s_Interval_283_fixes.txt
│   │   ├── 20220304_300s_Interval_153_fixes.csv
│   │   ├── 20220304_300s_Interval_153_fixes.txt
│   │   ├── 20220307_300s_Interval_176_fixes.csv
│   │   ├── 20220307_300s_Interval_176_fixes.txt
│   │   ├── 20220310_300s_Interval_202_fixes.csv
│   │   ├── 20220310_300s_Interval_202_fixes.txt
│   │   ├── 20220311_300s_Interval_91_fixes.csv
│   │   ├── 20220311_300s_Interval_91_fixes.txt
│   │   ├── 20220312_300s_Interval_218_fixes.csv
│   │   ├── 20220312_300s_Interval_218_fixes.txt
│   │   ├── 20220312_300s_Interval_314_fixes.csv
│   │   └── 20220312_300s_Interval_314_fixes.txt
│   ├── 06_StationaryPosition_10s_Burst_Every_30s/
│   │   ├── 20220303_10s_Burst_Every_30s_5331_fixes.csv
│   │   ├── 20220303_10s_Burst_Every_30s_5331_fixes.txt
│   │   ├── 20220304_10s_Burst_Every_30s_5863_fixes.csv
│   │   └── 20220304_10s_Burst_Every_30s_5863_fixes.txt
│   ├── 07_StationaryPosition_20s_Burst_Every_120s/
│   │   ├── 20220311_20s_Burst_Every_120s_1766_fixes.csv
│   │   ├── 20220311_20s_Burst_Every_120s_1766_fixes.txt
│   │   ├── 20220311_20s_Burst_Every_120s_4656_fixes.csv
│   │   ├── 20220311_20s_Burst_Every_120s_4656_fixes.txt
│   │   ├── 20220313_20s_Burst_Every_120s_4280_fixes.csv
│   │   └── 20220313_20s_Burst_Every_120s_4280_fixes.txt
│   ├── 08_PetDogWalk_1s_Interval/
│   │   ├── 20220303_PetDog_1s_Interval_10309_fixes.csv
│   │   ├── 20220303_PetDog_1s_Interval_10309_fixes.txt
│   │   ├── 20220304_PetDog_1s_Interval_13105_fixes.csv
│   │   ├── 20220304_PetDog_1s_Interval_13105_fixes.txt
│   │   ├── 20220307_PetDog_1s_Interval_12445_fixes.csv
│   │   └── 20220307_PetDog_1s_Interval_12445_fixes.txt
│   ├── 09_PetDogWalk_10s_Burst_Every_15s/
│   │   ├── 20220308_PetDog_10s_Burst_Every_15s_7830_fixes.csv
│   │   ├── 20220308_PetDog_10s_Burst_Every_15s_7830_fixes.txt
│   │   ├── 20220309_PetDog_10s_Burst_Every_15s_7075_fixes.csv
│   │   ├── 20220309_PetDog_10s_Burst_Every_15s_7075_fixes.txt
│   │   ├── 20220311_PetDog_10s_Burst_Every_15s_6955_fixes.csv
│   │   └── 20220311_PetDog_10s_Burst_Every_15s_6955_fixes.txt
│   ├── 10_AntiPoachingHound_1s_Interval/
│   │   ├── 20220209_AntiPoachingHound_1s_Interval_5096_fixes.csv
│   │   ├── 20220209_AntiPoachingHound_1s_Interval_5096_fixes.txt
│   │   └── 20220209_AntiPoachingHound_1s_Interval_eobs.csv
│   └── 11_MyotisMyotis/
│       ├── 20210706_MyotisMyotis_Tag03_29_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag04_241_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag09_75_fixes.csv
│       ├── 20210706_MyotisMyotis_Tag12_410_fixes.csv
│       └── 20210706_MyotisMyotis_completeDownload.txt
├── TickTagHardware/
│   ├── GerberProductionFiles/
│   │   ├── CONFIGURATION/
│   │   │   ├── PCBWay_2_layer.cam
│   │   │   └── PCBWay_2_layer_with_milling.cam
│   │   ├── TickTag-UIB/
│   │   │   └── BOMTickTag-UIB.xlsx
│   │   ├── TickTagREV3/
│   │   │   └── BOM-TickTagREV3.xls
│   │   └── TickTagREV4/
│   │       └── BOM-TickTagREV4.xlsx
│   ├── TickTag-UIB.brd
│   ├── TickTag-UIB.sch
│   ├── TickTagREV3.brd
│   ├── TickTagREV3.sch
│   ├── TickTagREV4.brd
│   └── TickTagREV4.sch
├── TickTagProgramming/
│   ├── FinalFirmwareBinaries/
│   │   ├── TickTagSoftwareBurst_V201/
│   │   │   ├── EEPROM_CAT24M01.d
│   │   │   ├── EEPROM_CAT24M01.o
│   │   │   ├── GPS_L70_Light.d
│   │   │   ├── GPS_L70_Light.o
│   │   │   ├── HelperFunctions.d
│   │   │   ├── HelperFunctions.o
│   │   │   ├── I2C.d
│   │   │   ├── I2C.o
│   │   │   ├── Makefile
│   │   │   ├── TestFunctions.d
│   │   │   ├── TestFunctions.o
│   │   │   ├── TickTag.d
│   │   │   ├── TickTag.o
│   │   │   ├── TickTagSoftwareBurst.eep
│   │   │   ├── TickTagSoftwareBurst.elf
│   │   │   ├── TickTagSoftwareBurst.hex
│   │   │   ├── TickTagSoftwareBurst.lss
│   │   │   ├── TickTagSoftwareBurst.srec
│   │   │   ├── Time.d
│   │   │   ├── Time.o
│   │   │   ├── UART.d
│   │   │   ├── UART.o
│   │   │   ├── main.d
│   │   │   ├── main.o
│   │   │   └── makedep.mk
│   │   ├── TickTagSoftwareBurst_V202_ATTINY1626/
│   │   │   ├── EEPROM_CAT24M01.d
│   │   │   ├── EEPROM_CAT24M01.o
│   │   │   ├── GPS_L70_Light.d
│   │   │   ├── GPS_L70_Light.o
│   │   │   ├── HelperFunctions.d
│   │   │   ├── HelperFunctions.o
│   │   │   ├── I2C.d
│   │   │   ├── I2C.o
│   │   │   ├── Makefile
│   │   │   ├── TestFunctions.d
│   │   │   ├── TestFunctions.o
│   │   │   ├── TickTag.d
│   │   │   ├── TickTag.o
│   │   │   ├── TickTagSoftwareBurst.eep
│   │   │   ├── TickTagSoftwareBurst.elf
│   │   │   ├── TickTagSoftwareBurst.hex
│   │   │   ├── TickTagSoftwareBurst.lss
│   │   │   ├── TickTagSoftwareBurst.srec
│   │   │   ├── Time.d
│   │   │   ├── Time.o
│   │   │   ├── UART.d
│   │   │   ├── UART.o
│   │   │   ├── main.d
│   │   │   ├── main.o
│   │   │   └── makedep.mk
│   │   └── TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/
│   │       ├── EEPROM_CAT24M01.d
│   │       ├── EEPROM_CAT24M01.o
│   │       ├── GPS_L70_Light.d
│   │       ├── GPS_L70_Light.o
│   │       ├── HelperFunctions.d
│   │       ├── HelperFunctions.o
│   │       ├── I2C.d
│   │       ├── I2C.o
│   │       ├── Makefile
│   │       ├── TestFunctions.d
│   │       ├── TestFunctions.o
│   │       ├── TickTag.d
│   │       ├── TickTag.o
│   │       ├── TickTagSoftwareBurst.eep
│   │       ├── TickTagSoftwareBurst.elf
│   │       ├── TickTagSoftwareBurst.hex
│   │       ├── TickTagSoftwareBurst.lss
│   │       ├── TickTagSoftwareBurst.srec
│   │       ├── Time.d
│   │       ├── Time.o
│   │       ├── UART.d
│   │       ├── UART.o
│   │       ├── main.d
│   │       ├── main.o
│   │       └── makedep.mk
│   ├── avrdude/
│   │   ├── ReadmeAVRDUDE.txt
│   │   ├── ScriptWriteFusesAndFirmware_V202_ATTINY1626.bat
│   │   ├── ScriptWriteFusesAndFirmware_V203_ATTINY1626_BonnetedBats.bat
│   │   ├── ScriptWriteFuses_ATTINY1616.bat
│   │   ├── ScriptWriteFuses_ATTINY1626.bat
│   │   ├── bin/
│   │   │   └── avrdude.conf
│   │   └── etc/
│   │       └── avrdude.conf
│   └── jtag2updi-master/
│       ├── LICENSE
│       ├── README.md
│       ├── avrdude.conf
│       ├── avrdude.conf.arduino
│       ├── build/
│       │   ├── JTAG2UPDI.elf
│       │   ├── JTAG2UPDI.hex
│       │   └── JTAG2UPDI.lss
│       ├── jtag2updi/
│       │   ├── JICE_io.cpp
│       │   ├── JICE_io.h
│       │   ├── JTAG2.cpp
│       │   ├── JTAG2.h
│       │   ├── NVM.h
│       │   ├── NVM_v2.h
│       │   ├── UPDI_hi_lvl.cpp
│       │   ├── UPDI_hi_lvl.h
│       │   ├── UPDI_lo_lvl.cpp
│       │   ├── UPDI_lo_lvl.h
│       │   ├── crc16.cpp
│       │   ├── crc16.h
│       │   ├── dbg.cpp
│       │   ├── dbg.h
│       │   ├── jtag2updi.cpp
│       │   ├── jtag2updi.ino
│       │   ├── parts.h
│       │   ├── sys.cpp
│       │   ├── sys.h
│       │   ├── updi_io.cpp
│       │   ├── updi_io.h
│       │   └── updi_io_soft.cpp
│       ├── make.bat
│       ├── make.sh
│       └── tools/
│           └── avrjtagicev2/
│               └── README.md
├── TickTagSerialDownload/
│   ├── README.md
│   ├── TickTag_Serial_Download.py
│   └── requirements.txt
└── TickTagSoftwareBurst/
    ├── .vs/
    │   └── TickTagSoftwareBurst/
    │       └── v14/
    │           └── .atsuo
    ├── TickTagSoftwareBurst/
    │   ├── Configuration.h
    │   ├── EEPROM_CAT24M01.cpp
    │   ├── EEPROM_CAT24M01.h
    │   ├── GPS_L70_Light.cpp
    │   ├── GPS_L70_Light.h
    │   ├── HelperFunctions.cpp
    │   ├── HelperFunctions.h
    │   ├── I2C.cpp
    │   ├── I2C.h
    │   ├── TestFunctions.cpp
    │   ├── TestFunctions.h
    │   ├── TickTag.cpp
    │   ├── TickTag.h
    │   ├── TickTagSoftwareBurst.componentinfo.xml
    │   ├── TickTagSoftwareBurst.cppproj
    │   ├── Time.cpp
    │   ├── Time.h
    │   ├── UART.cpp
    │   ├── UART.h
    │   └── main.cpp
    └── TickTagSoftwareBurst.atsln
Download .txt
SYMBOL INDEX (205 symbols across 34 files)

FILE: TickTagAndroidApp/app/src/androidTest/java/com/timm/ticktagandroidapp/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/LogDataStorage.java
  class LogDataStorage (line 18) | public class LogDataStorage {
    method logText (line 22) | public static String logText(Context context, String text) {

FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/MainActivity.java
  class MainActivity (line 44) | public class MainActivity extends AppCompatActivity implements SerialInp...
    method checkPermissions (line 59) | private void checkPermissions() {
    method showMessage (line 93) | public void showMessage(String headline, String text) {
    method setButtonConnected (line 105) | void setButtonConnected() {
    method setButtonDisconnected (line 118) | void setButtonDisconnected() {
    method onPause (line 131) | @Override
    method onBackPressed (line 137) | @Override
    method onResume (line 142) | @Override
    method updateHeadlineText (line 147) | public void updateHeadlineText() {
    method setAlertWindows (line 152) | private void setAlertWindows() {
    method onNewData (line 157) | @Override
    method onRunError (line 174) | @Override
    method checkIfUSBConnectable (line 186) | void checkIfUSBConnectable() {
    method onCreate (line 228) | @Override

FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/RawDataStorage.java
  class RawDataStorage (line 12) | class RawDataStorage {
    method getStoragePath (line 20) | public String getStoragePath() {
    method getFileNameWithoutDirectory (line 24) | public String getFileNameWithoutDirectory() {
    method testWrite (line 28) | public void testWrite() {
    method writeToFile (line 36) | public boolean writeToFile(byte[] data) {
    method RawDataStorage (line 55) | public RawDataStorage(Context context) {

FILE: TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/StorageGeneral.java
  class StorageGeneral (line 9) | public class StorageGeneral {
    method getMinimumMemory (line 13) | public static long getMinimumMemory() {
    method enoughFreeMemoryToStoreShit (line 17) | public static boolean enoughFreeMemoryToStoreShit() {
    method getAvailableInternalMemorySize (line 24) | public static long getAvailableInternalMemorySize() {
    method getAvailableInternalMemorySizeAsStringInMByte (line 32) | public static String getAvailableInternalMemorySizeAsStringInMByte() {
    method getStorageDirectory (line 38) | public static String getStorageDirectory(Context context) {

FILE: TickTagAndroidApp/app/src/test/java/com/timm/ticktagandroidapp/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/JICE_io.h
  function namespace (line 25) | namespace JICE_io {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/JTAG2.cpp
  function NVM_fuse_write (line 427) | void NVM_fuse_write (uint16_t address, uint8_t data) {
  function NVM_v2_write (line 440) | void NVM_v2_write (uint32_t address, uint16_t length, uint8_t write_cmd) {
  function NVM_buffered_write (line 508) | void NVM_buffered_write(const uint16_t address, const uint16_t length, c...
  function include_extra_info (line 565) | void include_extra_info (const uint8_t sernumlen) {
  function set_nvm_version (line 615) | void set_nvm_version(){

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/JTAG2.h
  function namespace (line 14) | namespace JTAG2 {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/NVM.h
  function namespace (line 15) | namespace NVM {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/NVM_v2.h
  function namespace (line 15) | namespace NVM_v2 {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_hi_lvl.h
  function namespace (line 14) | namespace UPDI {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_lo_lvl.h
  function namespace (line 18) | namespace UPDI {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/crc16.h
  function namespace (line 14) | namespace CRC {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/dbg.h
  function namespace (line 313) | namespace DBG {
  function namespace (line 387) | namespace DBG {
  function updi_res (line 403) | inline void updi_res(uint8_t data){}
  function updi_reset (line 404) | inline void updi_reset(){}
  function updi_reset_off (line 405) | inline void updi_reset_off(){}
  function updi_reset_on (line 406) | inline void updi_reset_on(){}
  function updi_post_reset (line 407) | inline void updi_post_reset(uint8_t mode){}
  function debugWriteStr (line 410) | inline void debugWriteStr(const char *str){}
  function debugWriteByte (line 412) | inline void debugWriteByte(uint8_t databyte){}
  function debugWriteHex (line 413) | inline void debugWriteHex(uint8_t databyte){}
  function debug (line 414) | inline void debug(char prefix, uint8_t data0){}
  function debug (line 415) | inline void debug(char prefix, uint8_t data0, uint8_t data1){}
  function debug (line 416) | inline void debug(char prefix, uint8_t data0, uint8_t data1, uint8_t dat...

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/jtag2updi.cpp
  function main (line 26) | int main(void)
  function setup (line 34) | inline void setup() {
  function loop (line 44) | inline void loop() {
  function process_command (line 105) | inline void process_command() {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/sys.h
  function namespace (line 428) | namespace SYS {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/updi_io.cpp
  function setup_bit_low (line 196) | inline void setup_bit_low() {
  function setup_bit_high (line 202) | inline void setup_bit_high() {
  function wait_for_bit (line 208) | inline void wait_for_bit() {
  function stop_timer (line 214) | inline void stop_timer() {
  function start_timer (line 218) | inline void start_timer() {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/updi_io.h
  function namespace (line 14) | namespace UPDI_io {

FILE: TickTagProgramming/jtag2updi-master/jtag2updi/updi_io_soft.cpp
  function send_break (line 230) | static inline void send_break() {

FILE: TickTagSerialDownload/TickTag_Serial_Download.py
  function str_to_dict (line 15) | def str_to_dict(datastr): # Looks like 'id : value, id : value ...'
  function get_digits (line 22) | def get_digits(interest_string):
  function progressbar_init (line 26) | def progressbar_init(total_bar, description, units):
  function exit_program (line 31) | def exit_program():
  class Serial_Reader (line 35) | class Serial_Reader:
    method __init__ (line 43) | def __init__(self, port, baudrate, timeout):
    method progressbar_update (line 48) | def progressbar_update(self):
    method progressbar_change_max (line 52) | def progressbar_change_max(self, total_bar):
    method read_line (line 56) | def read_line(self):
    method listen (line 60) | def listen(self, Tag_Data):
    method reset_memory (line 99) | def reset_memory(self):
    method end_of_communication (line 116) | def end_of_communication(self):
  class Tag_Data (line 123) | class Tag_Data():
    method __init__ (line 131) | def __init__(self):
    method main (line 134) | def main(self):
    method get_data (line 141) | def get_data(self, buffer):
    method setup_progresbars (line 145) | def setup_progresbars(self):
    method progressbar_update (line 150) | def progressbar_update(self, progressbar):
    method write_temp_files (line 154) | def write_temp_files(self):
    method get_first_timestamp (line 169) | def get_first_timestamp(self):
    method print_info (line 179) | def print_info(self):
    method make_summary_files (line 186) | def make_summary_files(self):
    method update_summary_files (line 203) | def update_summary_files(self):
    method order_files (line 210) | def order_files(self):

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/Configuration.h
  type tracker_state_t (line 95) | typedef enum { ST_FIRST_START_HARD_RESET = 0, ST_TRACKING = 1, ST_VOLTAG...
  type store_memory_return_t (line 96) | typedef enum { STORE_MEMORY_RETURN_ERROR = 0, STORE_MEMORY_RETURN_MEMORY...
  type continous_result_t (line 97) | typedef enum { CONTINOUS_RUNNING = 0, CONTINOUS_UNDERVOLTAGE, CONTINOUS_...
  type tracking_result_t (line 98) | typedef enum { TRACKING_RUNNING = 0, TRACKING_UNDERVOLTAGE, TRACKING_MEM...

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/EEPROM_CAT24M01.cpp
  function eepromIsAlive (line 3) | bool eepromIsAlive() {
  function eepromGetI2CAddress (line 12) | uint8_t eepromGetI2CAddress(uint32_t adr) {
  function eepromReadMemory (line 21) | bool eepromReadMemory(uint32_t adr, uint8_t *result_arr, uint32_t len) {
  function eepromBusyWriting (line 43) | bool eepromBusyWriting() {
  function eepromWriteMemory (line 49) | bool eepromWriteMemory(uint32_t adr, uint8_t *value_arr, uint32_t len) {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/GPS_L70_Light.cpp
  function gpsConvertTwoDigit2Number (line 8) | uint8_t gpsConvertTwoDigit2Number(char *digit_char) {
  function gpsRemoveAllChars (line 12) | void gpsRemoveAllChars(char* str, char c) {
  function gpsParseLatLong (line 21) | int32_t gpsParseLatLong(char* d) {
  function gpsGetUTCTimestamp (line 35) | uint32_t gpsGetUTCTimestamp(gps_t *gpsData) {
  function gpsDecodeGPRMCandGPGGA (line 44) | void gpsDecodeGPRMCandGPGGA(char* d, gps_t *gpsData, uint8_t sentenceTyp...
  function gpsDecodeGPRMCandGPGGANew (line 179) | void gpsDecodeGPRMCandGPGGANew(char* d, gps_t *gpsData, uint8_t sentence...
  function gpsSetBaudrate9600Permanently (line 467) | void gpsSetBaudrate9600Permanently() {
  function gpsConfigureBeforeStart (line 472) | bool gpsConfigureBeforeStart(char *messageBuffer) {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/GPS_L70_Light.h
  type gps_t (line 19) | typedef struct {
  type gps_result_t (line 36) | typedef enum {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/HelperFunctions.cpp
  function arrayToUint16 (line 3) | uint16_t arrayToUint16(uint8_t *buffer) {
  function arrayToUint32 (line 9) | uint32_t arrayToUint32(uint8_t *buffer) {
  function arrayToInt32 (line 15) | int32_t arrayToInt32(uint8_t *buffer) {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/I2C.cpp
  function i2cInit (line 3) | void i2cInit() {
  function pollRIF (line 16) | bool pollRIF() {
  function pollWIF (line 28) | bool pollWIF() {
  function i2cStartRead (line 40) | bool i2cStartRead(uint8_t deviceAddr) {
  function i2cStartWrite (line 52) | bool i2cStartWrite(uint8_t deviceAddr) {
  function i2cRead (line 64) | uint8_t i2cRead(bool ack) { // ACK=1 send ACK ; ACK=0 send NACK
  function i2cWrite (line 76) | bool i2cWrite(uint8_t write_data) {
  function i2cStop (line 92) | void i2cStop() {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/TestFunctions.cpp
  function mockFullMemory (line 3) | void mockFullMemory(uint32_t dataFixLength, uint32_t metaAddressOfAddres...
  function mockEmptyMemory (line 10) | void mockEmptyMemory(uint32_t dataFixLength, uint32_t metaAddressOfAddre...
  function readVoltage1606Test (line 17) | void readVoltage1606Test() {
  function testMessage (line 30) | void testMessage() {
  function testWriteMemory (line 46) | void testWriteMemory() {
  function testMemory (line 57) | void testMemory() {
  function i2cTest (line 76) | void i2cTest() {
  function i2cTest2 (line 112) | void i2cTest2() {
  function uartReadMultipleLinesNoFlush (line 140) | bool uartReadMultipleLinesNoFlush(uint8_t lines, char breakChar, char *l...
  function lightSleepUARTTest (line 170) | void lightSleepUARTTest() {
  function newParserTest (line 259) | void newParserTest() {
  function flpTest (line 334) | void flpTest() {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/TickTag.cpp
  function deviceInitPins (line 5) | void deviceInitPins() {
  function deviceInitGPIO2PinInterruptInDeepSleep (line 51) | void deviceInitGPIO2PinInterruptInDeepSleep() {
  function deviceDeactivateGPIO2PinInterruptInDeepSleep (line 60) | void deviceDeactivateGPIO2PinInterruptInDeepSleep() {
  function deviceInitDownloadPinInterruptInDeepSleep (line 65) | void deviceInitDownloadPinInterruptInDeepSleep() {
  function deviceIncrementTimer (line 75) | void deviceIncrementTimer() {
  function deviceInitTimer (line 79) | void deviceInitTimer() {
  function deviceGetMillis (line 100) | uint32_t deviceGetMillis() {
  function deviceStopTimer (line 106) | void deviceStopTimer() {
  function deviceL70powerOn (line 113) | void deviceL70powerOn() {
  function deviceL70powerOff (line 118) | void deviceL70powerOff() {
  function deviceL70backupOn (line 123) | void deviceL70backupOn() {
  function deviceL70backupOff (line 128) | void deviceL70backupOff() {
  function devicePowerMemoryAndI2COff (line 133) | void devicePowerMemoryAndI2COff() {
  function devicePowerMemoryAndI2COn (line 138) | void devicePowerMemoryAndI2COn() {
  function deviceDisableBODInSleep (line 144) | void deviceDisableBODInSleep() {
  function deviceDeepSleep (line 152) | void deviceDeepSleep() {
  function deviceStandbySleep (line 172) | void deviceStandbySleep() {
  function deviceInitInternalRTCInterrupt (line 184) | void deviceInitInternalRTCInterrupt(uint16_t seconds) {
  function getInternalTemperature (line 203) | int16_t getInternalTemperature() {
  function deviceReadSupplyVoltage (line 237) | uint16_t deviceReadSupplyVoltage() {
  function deviceSetCPUSpeed32khz (line 313) | void deviceSetCPUSpeed32khz() {
  function deviceSetCPUSpeed (line 321) | void deviceSetCPUSpeed(uint8_t prescalerDivision) {
  function deviceLedOn (line 327) | void deviceLedOn() {
  function deviceLedOff (line 332) | void deviceLedOff() {
  function deviceBlink (line 337) | void deviceBlink(uint8_t times) {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/TickTag.h
  type TinyEEPROM (line 97) | struct TinyEEPROM {
  function operator (line 131) | uint8_t operator-- (int){
  type EEPtr (line 138) | struct EEPtr{
  function TinyEEPROM (line 147) | TinyEEPROM operator*()                   { return index; }
  function EEPtr (line 152) | EEPtr operator++ (int)              { return index++; }
  function EEPtr (line 153) | EEPtr operator-- (int)              { return index--; }

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/Time.cpp
  function breakTime (line 3) | void breakTime(uint32_t timeInput, tmElements_t &tm) {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/Time.h
  type tmElements_t (line 13) | typedef struct  {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/UART.cpp
  function initPrimaryUARTwith9600 (line 3) | void initPrimaryUARTwith9600() {
  function initPrimaryUARTwith115200 (line 20) | void initPrimaryUARTwith115200() {
  function initSecondUARTwith9600 (line 37) | void initSecondUARTwith9600() {
  function uartFlush (line 59) | uint8_t uartFlush() {
  function deinitSecondUartPins (line 65) | void deinitSecondUartPins() {
  function uartOff (line 72) | void uartOff() {
  function uartRead (line 78) | bool uartRead(char breakChar, char *line, uint8_t maxLength, uint16_t ti...
  function uartReadMultipleLines (line 104) | bool uartReadMultipleLines(uint8_t lines, char breakChar, char *line, ui...
  function print (line 134) | void print(const char *in) {
  function println (line 143) | void println(const char *in) {
  function printU16 (line 149) | void printU16(uint16_t in) {
  function printNum (line 158) | void printNum(uint32_t in) {
  function usePrintfFunction (line 167) | static int usePrintfFunction(char c, FILE *stream) { // static functions...
  function usePrintf (line 173) | void usePrintf() {

FILE: TickTagSoftwareBurst/TickTagSoftwareBurst/main.cpp
  function ISR (line 64) | ISR(PORTA_PORT_vect) { downloadInterrupt = true; PORTA.INTFLAGS |= PORT_...
  function ISR (line 65) | ISR(RTC_CNT_vect) { rtcInterrupt = true; RTC.INTFLAGS = RTC_OVF_bm; }
  function ISR (line 66) | ISR(TCA0_OVF_vect) { deviceIncrementTimer(); TCA0.SINGLE.INTFLAGS = TCA_...
  function ISR (line 67) | ISR(PORTC_PORT_vect) { gpio2Interrupt = true; PORTC.INTFLAGS |= PORT_INT...
  function wait (line 71) | void wait(uint16_t seconds) {
  function voltageNotOkay (line 77) | bool voltageNotOkay() {
  function isNightTime (line 83) | bool isNightTime() {
  function getOperationVoltageMinFromTinyEEPROM (line 105) | uint16_t getOperationVoltageMinFromTinyEEPROM() {
  function getGPSFrequencyFromTinyEEPROM (line 111) | uint16_t getGPSFrequencyFromTinyEEPROM() {
  function getMinHDOPFromTinyEEPROM (line 117) | uint8_t getMinHDOPFromTinyEEPROM() {
  function getActivationDelayFromTinyEEPROM (line 123) | uint16_t getActivationDelayFromTinyEEPROM() {
  function getTurnOnHourFromTinyEEPROM (line 129) | uint8_t getTurnOnHourFromTinyEEPROM() {
  function getTurnOnMinuteFromTinyEEPROM (line 135) | uint8_t getTurnOnMinuteFromTinyEEPROM() {
  function getTurnOffHourFromTinyEEPROM (line 141) | uint8_t getTurnOffHourFromTinyEEPROM() {
  function getTurnOffMinuteFromTinyEEPROM (line 147) | uint8_t getTurnOffMinuteFromTinyEEPROM() {
  function readMemory (line 155) | bool readMemory() {
  function readMemoryFancy (line 238) | void readMemoryFancy() {
  function startMenue (line 244) | void startMenue() {
  function downloadButtonPressedFor3Seconds (line 507) | bool downloadButtonPressedFor3Seconds() {
  function storeInMemory (line 519) | uint8_t storeInMemory(gps_t *gpsData, bool writeTtfSum) {
  function trackingMerged (line 597) | void trackingMerged() {
  function changeGPSBaudrate (line 852) | void changeGPSBaudrate() {
  function main (line 874) | int main(void) {
Copy disabled (too large) Download .json
Condensed preview — 261 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,849K chars).
[
  {
    "path": ".gitattributes",
    "chars": 66,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": "LICENSE",
    "chars": 1063,
    "preview": "MIT License\n\nCopyright (c) 2022 trichl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
  },
  {
    "path": "README.md",
    "chars": 18822,
    "preview": "<img src=\"https://github.com/trichl/TickTagOpenSource/blob/main/TickTagImages/icon.png\" width=\"100\">\n\n# I Repository Int"
  },
  {
    "path": "TickTagAndroidApp/.gitignore",
    "chars": 208,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
  },
  {
    "path": "TickTagAndroidApp/.idea/codeStyles/Project.xml",
    "chars": 3309,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <codeStyleSettings lan"
  },
  {
    "path": "TickTagAndroidApp/.idea/gradle.xml",
    "chars": 634,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": "TickTagAndroidApp/.idea/misc.xml",
    "chars": 357,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" language"
  },
  {
    "path": "TickTagAndroidApp/.idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": "TickTagAndroidApp/.idea/vcs.xml",
    "chars": 183,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "TickTagAndroidApp/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "TickTagAndroidApp/app/build.gradle",
    "chars": 1304,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    buildToolsVersion \"29.0.2\"\n    defaultCo"
  },
  {
    "path": "TickTagAndroidApp/app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "TickTagAndroidApp/app/src/androidTest/java/com/timm/ticktagandroidapp/ExampleInstrumentedTest.java",
    "chars": 768,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport android.content.Context;\n\nimport androidx.test.platform.app.InstrumentationR"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/AndroidManifest.xml",
    "chars": 2193,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/LogDataStorage.java",
    "chars": 1386,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport android.content.Context;\n\nimport java.io.BufferedReader;\nimport java.io.File"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/MainActivity.java",
    "chars": 54384,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.A"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/RawDataStorage.java",
    "chars": 1834,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport android.content.Context;\n\nimport java.io.File;\nimport java.io.FileOutputStre"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/java/com/timm/ticktagandroidapp/StorageGeneral.java",
    "chars": 1253,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport android.content.Context;\nimport android.os.Environment;\nimport android.os.St"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/drawable-v24/chart_fade.xml",
    "chars": 230,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1880,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/layout/activity_decoder.xml",
    "chars": 1879,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/layout/activity_detail.xml",
    "chars": 1853,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/layout/activity_main.xml",
    "chars": 17300,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 268,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <bac"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"color"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/values/strings.xml",
    "chars": 82,
    "preview": "<resources>\n    <string name=\"app_name\">TickTag Android App</string>\n</resources>\n"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/values/styles.xml",
    "chars": 383,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar"
  },
  {
    "path": "TickTagAndroidApp/app/src/main/res/xml/device_filter.xml",
    "chars": 2223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- 0x0403 / 0x60??: FTDI -->\n    <usb-device vendor-id=\"1027\" p"
  },
  {
    "path": "TickTagAndroidApp/app/src/test/java/com/timm/ticktagandroidapp/ExampleUnitTest.java",
    "chars": 387,
    "preview": "package com.timm.ticktagandroidapp;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local uni"
  },
  {
    "path": "TickTagAndroidApp/build.gradle",
    "chars": 549,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "TickTagAndroidApp/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Sat Oct 31 08:59:58 CET 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "TickTagAndroidApp/gradle.properties",
    "chars": 1073,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "TickTagAndroidApp/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "TickTagAndroidApp/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "TickTagAndroidApp/settings.gradle",
    "chars": 52,
    "preview": "include ':app'\nrootProject.name='TickTagAndroidApp'\n"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220221_1s_Interval_10527_fixes.csv",
    "chars": 346835,
    "preview": "count,timestamp,lat,lon\n1,1645434445,47.74306,8.99900\n2,1645434446,47.74304,8.99900\n3,1645434447,47.74303,8.99899\n4,1645"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220221_1s_Interval_10527_fixes.txt",
    "chars": 347405,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 68, TOs: 0/0, ErrorsOrGF: 0, TTFF: 74\nFixes: 10527, Avg. time to fix: 0 s, Avg. H"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220222_1s_Interval_10842_fixes.csv",
    "chars": 357545,
    "preview": "count,timestamp,lat,lon\n1,1645517089,47.74302,8.99891\n2,1645517091,47.74306,8.99892\n3,1645517092,47.74307,8.99892\n4,1645"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220222_1s_Interval_10842_fixes.txt",
    "chars": 358115,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 32, TOs: 0/0, ErrorsOrGF: 0, TTFF: 84\nFixes: 10842, Avg. time to fix: 0 s, Avg. H"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220302_1s_Interval_9323_fixes.csv",
    "chars": 306575,
    "preview": "count,timestamp,lat,lon\n1,1646223891,47.74311,8.99903\n2,1646223893,47.74309,8.99901\n3,1646223894,47.74310,8.99902\n4,1646"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220302_1s_Interval_9323_fixes.txt",
    "chars": 307144,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 46, TOs: 0/0, ErrorsOrGF: 1, TTFF: 65\nFixes: 9323, Avg. time to fix: 0 s, Avg. HD"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220309_1s_Interval_10069_fixes.csv",
    "chars": 331263,
    "preview": "count,timestamp,lat,lon\n1,1646805031,47.74305,8.99903\n2,1646805033,47.74305,8.99899\n3,1646805034,47.74305,8.99899\n4,1646"
  },
  {
    "path": "TickTagData/01_StationaryPosition_1s_Interval/20220309_1s_Interval_10069_fixes.txt",
    "chars": 331744,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 32, TOs: 0/0, ErrorsOrGF: 0, TTFF: 34\nFixes: 10069, Avg. TTF: 0 s, Avg. HDOP (x10): 9"
  },
  {
    "path": "TickTagData/02_StationaryPosition_5s_Interval/20220223_5s_Interval_2060_fixes.csv",
    "chars": 66896,
    "preview": "count,timestamp,lat,lon\n1,1645607888,47.74132,8.99811\n2,1645607893,47.74131,8.99812\n3,1645607898,47.74134,8.99814\n4,1645"
  },
  {
    "path": "TickTagData/02_StationaryPosition_5s_Interval/20220223_5s_Interval_2060_fixes.txt",
    "chars": 67466,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 2, TOs: 0/0, ErrorsOrGF: 0, TTFF: 373\nFixes: 2060, Avg. time to fix: 0 s, Avg. HD"
  },
  {
    "path": "TickTagData/02_StationaryPosition_5s_Interval/20220223_5s_Interval_2113_fixes.csv",
    "chars": 68646,
    "preview": "count,timestamp,lat,lon\n1,1645631752,47.74333,8.99870\n2,1645631757,47.74339,8.99869\n3,1645631762,47.74341,8.99867\n4,1645"
  },
  {
    "path": "TickTagData/02_StationaryPosition_5s_Interval/20220223_5s_Interval_2113_fixes.txt",
    "chars": 69562,
    "preview": "6773 $PQFLP,W,1,0*21\n$GPRMC,235942.800,V,,,,,0.00,0.00,050180,,,N*42\n\n2798 $GPRMC,235943.800,V,,,,,0.00,0.00,050180,,,N*"
  },
  {
    "path": "TickTagData/03_StationaryPosition_30s_Interval/20220225_30s_Interval_683_fixes.csv",
    "chars": 21771,
    "preview": "count,timestamp,lat,lon\n1,1645772584,47.74329,8.99880\n2,1645772631,47.74322,8.99898\n3,1645772678,47.74328,8.99902\n4,1645"
  },
  {
    "path": "TickTagData/03_StationaryPosition_30s_Interval/20220225_30s_Interval_683_fixes.txt",
    "chars": 22343,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 96, TOs: 0/0, ErrorsOrGF: 1, TTFF: 103\nFixes: 683, Avg. time to fix: 11 s, Avg. H"
  },
  {
    "path": "TickTagData/03_StationaryPosition_30s_Interval/20220226_30s_Interval_309_fixes.csv",
    "chars": 9803,
    "preview": "count,timestamp,lat,lon\n1,1645859786,47.74297,8.99891\n2,1645859820,47.74288,8.99898\n3,1645859855,47.74301,8.99887\n4,1645"
  },
  {
    "path": "TickTagData/03_StationaryPosition_30s_Interval/20220226_30s_Interval_309_fixes.txt",
    "chars": 10373,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 11, TOs: 0/0, ErrorsOrGF: 1, TTFF: 80\nFixes: 309, Avg. time to fix: 9 s, Avg. HDO"
  },
  {
    "path": "TickTagData/04_StationaryPosition_60s_Interval/20220227_60s_Interval_474_fixes.csv",
    "chars": 15083,
    "preview": "count,timestamp,lat,lon\n1,1645950800,47.74373,8.99842\n2,1645950866,47.74206,9.00076\n3,1645950946,47.74298,8.99840\n4,1645"
  },
  {
    "path": "TickTagData/04_StationaryPosition_60s_Interval/20220227_60s_Interval_474_fixes.txt",
    "chars": 15655,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 87, TOs: 0/0, ErrorsOrGF: 1, TTFF: 130\nFixes: 474, Avg. time to fix: 10 s, Avg. H"
  },
  {
    "path": "TickTagData/04_StationaryPosition_60s_Interval/20220228_60s_Interval_372_fixes.csv",
    "chars": 11819,
    "preview": "count,timestamp,lat,lon\n1,1646044385,47.74514,8.99724\n2,1646044450,47.74498,8.99666\n3,1646044527,47.74394,8.99786\n4,1646"
  },
  {
    "path": "TickTagData/04_StationaryPosition_60s_Interval/20220228_60s_Interval_372_fixes.txt",
    "chars": 12389,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 2, TOs: 0/0, ErrorsOrGF: 1, TTFF: 76\nFixes: 372, Avg. time to fix: 10 s, Avg. HDO"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220301_300s_Interval_94_fixes.csv",
    "chars": 2928,
    "preview": "count,timestamp,lat,lon\n1,1646119862,47.74306,8.99892\n2,1646120169,47.74289,8.99915\n3,1646120477,47.74309,8.99887\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220301_300s_Interval_94_fixes.txt",
    "chars": 3499,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 69, TOs: 0/0, ErrorsOrGF: 1, TTFF: 86\nFixes: 94, Avg. time to fix: 14 s, Avg. HDO"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220302_300s_Interval_283_fixes.csv",
    "chars": 8971,
    "preview": "count,timestamp,lat,lon\n1,1646204183,47.74303,8.99891\n2,1646204488,47.74327,8.99868\n3,1646204797,47.74311,8.99894\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220302_300s_Interval_283_fixes.txt",
    "chars": 9542,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 0, TOs: 0/1, ErrorsOrGF: 0, TTFF: 79\nFixes: 283, Avg. time to fix: 12 s, Avg. HDO"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220304_300s_Interval_153_fixes.csv",
    "chars": 4811,
    "preview": "count,timestamp,lat,lon\n1,1646302790,47.74299,8.99894\n2,1646303092,47.74292,8.99890\n3,1646303395,47.74292,8.99896\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220304_300s_Interval_153_fixes.txt",
    "chars": 5384,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 181, TOs: 0/0, ErrorsOrGF: 2, TTFF: 88\nFixes: 153, Avg. time to fix: 10 s, Avg. H"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220307_300s_Interval_176_fixes.csv",
    "chars": 5547,
    "preview": "count,timestamp,lat,lon\n1,1646646620,47.74300,8.99904\n2,1646646937,47.74302,8.99926\n3,1646647258,47.74305,8.99914\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220307_300s_Interval_176_fixes.txt",
    "chars": 6032,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 222, TOs: 0/0, ErrorsOrGF: 0, TTFF: 108\nFixes: 176, Avg. TTF: 12 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220310_300s_Interval_202_fixes.csv",
    "chars": 6379,
    "preview": "count,timestamp,lat,lon\n1,1646812945,47.74087,8.99795\n2,1646813278,47.74323,8.99918\n3,1646813609,47.74319,8.99909\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220310_300s_Interval_202_fixes.txt",
    "chars": 6860,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 0, TOs: 0/0, ErrorsOrGF: 0, TTFF: 0\nFixes: 202, Avg. TTF: 11 s, Avg. HDOP (x10): 16\n\n"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220311_300s_Interval_91_fixes.csv",
    "chars": 2835,
    "preview": "count,timestamp,lat,lon\n1,1646984732,47.74302,8.99898\n2,1646985042,47.74316,8.99874\n3,1646985358,47.74302,8.99884\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220311_300s_Interval_91_fixes.txt",
    "chars": 3375,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 75, TOs: 0/0, ErrorsOrGF: 1, TTFF: 79\nFixes: 91, Avg. TTF: 13 s, Avg. HDOP (x10): 17\n"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220312_300s_Interval_218_fixes.csv",
    "chars": 6891,
    "preview": "count,timestamp,lat,lon\n1,1647081692,47.74287,8.99918\n2,1647081999,47.74304,8.99948\n3,1647082317,47.74270,8.99850\n4,1647"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220312_300s_Interval_218_fixes.txt",
    "chars": 7374,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 15, TOs: 0/0, ErrorsOrGF: 1, TTFF: 84\nFixes: 218, Avg. TTF: 11 s, Avg. HDOP (x10): 18"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220312_300s_Interval_314_fixes.csv",
    "chars": 9963,
    "preview": "count,timestamp,lat,lon\n1,1646985290,47.74304,8.99896\n2,1646985593,47.74305,8.99902\n3,1646985906,47.74304,8.99897\n4,1646"
  },
  {
    "path": "TickTagData/05_StationaryPosition_300s_Interval/20220312_300s_Interval_314_fixes.txt",
    "chars": 10446,
    "preview": "▒▒---TICK-TAG---\n*START MEMORY*\nUVs: 0, TOs: 0/0, ErrorsOrGF: 0, TTFF: 0\nFixes: 314, Avg. TTF: 10 s, Avg. HDOP (x10): 15"
  },
  {
    "path": "TickTagData/06_StationaryPosition_10s_Burst_Every_30s/20220303_10s_Burst_Every_30s_5331_fixes.csv",
    "chars": 174839,
    "preview": "count,timestamp,lat,lon\n1,1646291419,47.74306,8.99897\n2,1646291420,47.74306,8.99897\n3,1646291421,47.74306,8.99897\n4,1646"
  },
  {
    "path": "TickTagData/06_StationaryPosition_10s_Burst_Every_30s/20220303_10s_Burst_Every_30s_5331_fixes.txt",
    "chars": 175324,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 120, TOs: 0/0, ErrorsOrGF: 0, TTFF: 81\nFixes: 5331, Avg. TTF: 10 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/06_StationaryPosition_10s_Burst_Every_30s/20220304_10s_Burst_Every_30s_5863_fixes.csv",
    "chars": 192395,
    "preview": "count,timestamp,lat,lon\n1,1646377559,47.74286,9.00352\n2,1646377560,47.74286,9.00352\n3,1646377561,47.74305,8.99899\n4,1646"
  },
  {
    "path": "TickTagData/06_StationaryPosition_10s_Burst_Every_30s/20220304_10s_Burst_Every_30s_5863_fixes.txt",
    "chars": 192881,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 103, TOs: 0/0, ErrorsOrGF: 0, TTFF: 154\nFixes: 5863, Avg. TTF: 10 s, Avg. HDOP (x10):"
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220311_20s_Burst_Every_120s_1766_fixes.csv",
    "chars": 57194,
    "preview": "count,timestamp,lat,lon\n1,1646984966,47.74304,8.99896\n2,1646984967,47.74304,8.99895\n3,1646984968,47.74303,8.99895\n4,1646"
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220311_20s_Burst_Every_120s_1766_fixes.txt",
    "chars": 57680,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 101, TOs: 0/0, ErrorsOrGF: 1, TTFF: 83\nFixes: 1766, Avg. TTF: 15 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220311_20s_Burst_Every_120s_4656_fixes.csv",
    "chars": 152564,
    "preview": "count,timestamp,lat,lon\n1,1646984553,47.74303,8.99898\n2,1646984554,47.74303,8.99898\n3,1646984555,47.74304,8.99898\n4,1646"
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220311_20s_Burst_Every_120s_4656_fixes.txt",
    "chars": 153050,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 127, TOs: 0/0, ErrorsOrGF: 1, TTFF: 97\nFixes: 4656, Avg. TTF: 15 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220313_20s_Burst_Every_120s_4280_fixes.csv",
    "chars": 140156,
    "preview": "count,timestamp,lat,lon\n1,1647165001,47.74234,9.00157\n2,1647165002,47.74232,9.00155\n3,1647165003,47.74231,9.00153\n4,1647"
  },
  {
    "path": "TickTagData/07_StationaryPosition_20s_Burst_Every_120s/20220313_20s_Burst_Every_120s_4280_fixes.txt",
    "chars": 140641,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 7, TOs: 0/0, ErrorsOrGF: 1, TTFF: 100\nFixes: 4280, Avg. TTF: 15 s, Avg. HDOP (x10): 1"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220303_PetDog_1s_Interval_10309_fixes.csv",
    "chars": 339423,
    "preview": "count,timestamp,lat,lon\n1,1646321123,47.74378,8.99929\n2,1646321124,47.74379,8.99928\n3,1646321125,47.74381,8.99926\n4,1646"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220303_PetDog_1s_Interval_10309_fixes.txt",
    "chars": 339905,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 15, TOs: 0/0, ErrorsOrGF: 0, TTFF: 83\nFixes: 10309, Avg. TTF: 0 s, Avg. HDOP (x10): 9"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220304_PetDog_1s_Interval_13105_fixes.csv",
    "chars": 434487,
    "preview": "count,timestamp,lat,lon\n1,1646383774,47.74354,8.99901\n2,1646383776,47.74356,8.99899\n3,1646383777,47.74356,8.99899\n4,1646"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220304_PetDog_1s_Interval_13105_fixes.txt",
    "chars": 434969,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 11, TOs: 0/0, ErrorsOrGF: 0, TTFF: 55\nFixes: 13105, Avg. TTF: 0 s, Avg. HDOP (x10): 9"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220307_PetDog_1s_Interval_12445_fixes.csv",
    "chars": 412047,
    "preview": "count,timestamp,lat,lon\n1,1646641291,47.74380,8.99886\n2,1646641293,47.74381,8.99885\n3,1646641300,47.74395,8.99878\n4,1646"
  },
  {
    "path": "TickTagData/08_PetDogWalk_1s_Interval/20220307_PetDog_1s_Interval_12445_fixes.txt",
    "chars": 412530,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 115, TOs: 0/0, ErrorsOrGF: 1, TTFF: 71\nFixes: 12445, Avg. TTF: 0 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220308_PetDog_10s_Burst_Every_15s_7830_fixes.csv",
    "chars": 257306,
    "preview": "count,timestamp,lat,lon\n1,1646725443,47.74433,8.99914\n2,1646725444,47.74432,8.99913\n3,1646725445,47.74432,8.99912\n4,1646"
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220308_PetDog_10s_Burst_Every_15s_7830_fixes.txt",
    "chars": 257792,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 145, TOs: 0/0, ErrorsOrGF: 0, TTFF: 128\nFixes: 7830, Avg. TTF: 8 s, Avg. HDOP (x10): "
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220309_PetDog_10s_Burst_Every_15s_7075_fixes.csv",
    "chars": 232391,
    "preview": "count,timestamp,lat,lon\n1,1646816509,47.74427,8.99832\n2,1646816510,47.74428,8.99830\n3,1646816511,47.74429,8.99828\n4,1646"
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220309_PetDog_10s_Burst_Every_15s_7075_fixes.txt",
    "chars": 232876,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 47, TOs: 0/0, ErrorsOrGF: 0, TTFF: 110\nFixes: 7075, Avg. TTF: 7 s, Avg. HDOP (x10): 1"
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220311_PetDog_10s_Burst_Every_15s_6955_fixes.csv",
    "chars": 228431,
    "preview": "count,timestamp,lat,lon\n1,1647001231,47.74404,8.99870\n2,1647001232,47.74405,8.99869\n3,1647001233,47.74406,8.99869\n4,1647"
  },
  {
    "path": "TickTagData/09_PetDogWalk_10s_Burst_Every_15s/20220311_PetDog_10s_Burst_Every_15s_6955_fixes.txt",
    "chars": 228915,
    "preview": "---TICK-TAG---\n*START MEMORY*\nUVs: 15, TOs: 0/0, ErrorsOrGF: 0, TTFF: 92\nFixes: 6955, Avg. TTF: 7 s, Avg. HDOP (x10): 15"
  },
  {
    "path": "TickTagData/10_AntiPoachingHound_1s_Interval/20220209_AntiPoachingHound_1s_Interval_5096_fixes.csv",
    "chars": 177276,
    "preview": "count,timestamp,lat,lon\n1,1644387698,-24.53918,31.32248\n2,1644387699,-24.53915,31.32250\n3,1644387700,-24.53914,31.32250\n"
  },
  {
    "path": "TickTagData/10_AntiPoachingHound_1s_Interval/20220209_AntiPoachingHound_1s_Interval_5096_fixes.txt",
    "chars": 177847,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 51, TOs: 0/0, ErrorsOrGF: 0, TTFF: 65\nFixes: 5096, Avg. time to fix: 0 s, Avg. HD"
  },
  {
    "path": "TickTagData/10_AntiPoachingHound_1s_Interval/20220209_AntiPoachingHound_1s_Interval_eobs.csv",
    "chars": 143789,
    "preview": "event-id,visible,timestamp,lon,lat,bar:barometric-pressure,data-decoding-software,eobs:activity,eobs:activity-samples,eo"
  },
  {
    "path": "TickTagData/11_MyotisMyotis/20210706_MyotisMyotis_Tag03_29_fixes.csv",
    "chars": 913,
    "preview": "count,timestamp,lat,lon\n1,1625532033,49.02462,8.26659\n2,1625532101,49.02156,8.27117\n3,1625532166,49.01885,8.27487\n4,1625"
  },
  {
    "path": "TickTagData/11_MyotisMyotis/20210706_MyotisMyotis_Tag04_241_fixes.csv",
    "chars": 7627,
    "preview": "count,timestamp,lat,lon\n1,1625518909,48.97748,8.30403\n2,1625518946,48.97733,8.30414\n3,1625518994,48.97721,8.30407\n4,1625"
  },
  {
    "path": "TickTagData/11_MyotisMyotis/20210706_MyotisMyotis_Tag09_75_fixes.csv",
    "chars": 2339,
    "preview": "count,timestamp,lat,lon\n1,1625520658,48.98375,8.31974\n2,1625520729,48.98001,8.32018\n3,1625520794,48.97849,8.31855\n4,1625"
  },
  {
    "path": "TickTagData/11_MyotisMyotis/20210706_MyotisMyotis_Tag12_410_fixes.csv",
    "chars": 13035,
    "preview": "count,timestamp,lat,lon\n1,1625517751,48.95857,8.31896\n2,1625517785,48.95783,8.31765\n3,1625517819,48.95762,8.31646\n4,1625"
  },
  {
    "path": "TickTagData/11_MyotisMyotis/20210706_MyotisMyotis_completeDownload.txt",
    "chars": 29590,
    "preview": "---TICK-TAG---\n***START MEMORY***\nUVs: 0, TOs: 0/0, ErrorsOrGF: 0, TTFF: 0\nEMPTY\n***END MEMORY***\nV103, ID: 51-2617, 420"
  },
  {
    "path": "TickTagHardware/GerberProductionFiles/CONFIGURATION/PCBWay_2_layer.cam",
    "chars": 6969,
    "preview": "{\n    \"author\": {\n        \"email\": \"goodmanufer@gmail.com\",\n        \"name\": \"Simon Gao\"\n    },\n    \"description\": {\n    "
  },
  {
    "path": "TickTagHardware/GerberProductionFiles/CONFIGURATION/PCBWay_2_layer_with_milling.cam",
    "chars": 7569,
    "preview": "{\n    \"author\": {\n        \"email\": \"trichlick@ab.mpg.de\",\n        \"name\": \"Timm Richlick\"\n    },\n    \"description\": {\n  "
  },
  {
    "path": "TickTagHardware/TickTag-UIB.brd",
    "chars": 108734,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagHardware/TickTag-UIB.sch",
    "chars": 174699,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagHardware/TickTagREV3.brd",
    "chars": 76783,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagHardware/TickTagREV3.sch",
    "chars": 131982,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagHardware/TickTagREV4.brd",
    "chars": 111991,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagHardware/TickTagREV4.sch",
    "chars": 540058,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"9.5.2\">\n<drawing>\n<settings>\n"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/EEPROM_CAT24M01.d",
    "chars": 4990,
    "preview": "EEPROM_CAT24M01.d EEPROM_CAT24M01.o: .././EEPROM_CAT24M01.cpp \\\n .././EEPROM_CAT24M01.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/GPS_L70_Light.d",
    "chars": 5426,
    "preview": "GPS_L70_Light.d GPS_L70_Light.o: .././GPS_L70_Light.cpp \\\n .././GPS_L70_Light.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studi"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/HelperFunctions.d",
    "chars": 543,
    "preview": "HelperFunctions.d HelperFunctions.o: .././HelperFunctions.cpp \\\n .././HelperFunctions.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/I2C.d",
    "chars": 4670,
    "preview": "I2C.d I2C.o: .././I2C.cpp .././I2C.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\avr"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/Makefile",
    "chars": 10008,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TestFunctions.d",
    "chars": 5545,
    "preview": "TestFunctions.d TestFunctions.o: .././TestFunctions.cpp \\\n .././TestFunctions.h .././TickTag.h \\\n c:\\program\\ files\\ (x8"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TickTag.d",
    "chars": 4901,
    "preview": "TickTag.d TickTag.o: .././TickTag.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-g"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TickTagSoftwareBurst.eep",
    "chars": 12,
    "preview": ":00000001FF\n"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TickTagSoftwareBurst.hex",
    "chars": 44182,
    "preview": ":100000000C943C000C9459000C9459000C94560824\n:100010000C9459000C9459000C943E080C9459000F\n:100020000C9467080C9459000C94590"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TickTagSoftwareBurst.lss",
    "chars": 333925,
    "preview": "\nTickTagSoftwareBurst.elf:     file format elf32-avr\n\nSections:\nIdx Name          Size      VMA       LMA       File off"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/TickTagSoftwareBurst.srec",
    "chars": 43237,
    "preview": "S01C00005469636B546167536F66747761726542757273742E7372656306\nS11300000C943C000C9459000C9459000C94560820\nS11300100C945900"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/Time.d",
    "chars": 485,
    "preview": "Time.d Time.o: .././Time.cpp .././Time.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/UART.d",
    "chars": 4876,
    "preview": "UART.d UART.o: .././UART.cpp .././UART.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/main.d",
    "chars": 5610,
    "preview": "main.d main.o: .././main.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolch"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V201/makedep.mk",
    "chars": 358,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/EEPROM_CAT24M01.d",
    "chars": 4944,
    "preview": "EEPROM_CAT24M01.d EEPROM_CAT24M01.o: .././EEPROM_CAT24M01.cpp \\\n .././EEPROM_CAT24M01.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/GPS_L70_Light.d",
    "chars": 5376,
    "preview": "GPS_L70_Light.d GPS_L70_Light.o: .././GPS_L70_Light.cpp \\\n .././GPS_L70_Light.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/HelperFunctions.d",
    "chars": 539,
    "preview": "HelperFunctions.d HelperFunctions.o: .././HelperFunctions.cpp \\\n .././HelperFunctions.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/I2C.d",
    "chars": 4626,
    "preview": "I2C.d I2C.o: .././I2C.cpp .././I2C.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\avr\\"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/Makefile",
    "chars": 10008,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TestFunctions.d",
    "chars": 5495,
    "preview": "TestFunctions.d TestFunctions.o: .././TestFunctions.cpp \\\n .././TestFunctions.h .././TickTag.h \\\n c:\\program\\ files\\ (x8"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TickTag.d",
    "chars": 4855,
    "preview": "TickTag.d TickTag.o: .././TickTag.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio\\7.0\\toolchain\\avr8\\avr8-gn"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TickTagSoftwareBurst.eep",
    "chars": 12,
    "preview": ":00000001FF\n"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TickTagSoftwareBurst.hex",
    "chars": 44218,
    "preview": ":100000000C943C000C9459000C9459000C945C081E\n:100010000C9459000C9459000C9444080C94590009\n:100020000C946D080C9459000C94590"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TickTagSoftwareBurst.lss",
    "chars": 334462,
    "preview": "\nTickTagSoftwareBurst.elf:     file format elf32-avr\n\nSections:\nIdx Name          Size      VMA       LMA       File off"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/TickTagSoftwareBurst.srec",
    "chars": 43272,
    "preview": "S01C00005469636B546167536F66747761726542757273742E7372656306\nS11300000C943C000C9459000C9459000C945C081A\nS11300100C945900"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/Time.d",
    "chars": 481,
    "preview": "Time.d Time.o: .././Time.cpp .././Time.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/UART.d",
    "chars": 4830,
    "preview": "UART.d UART.o: .././UART.cpp .././UART.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/main.d",
    "chars": 5560,
    "preview": "main.d main.o: .././main.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolcha"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V202_ATTINY1626/makedep.mk",
    "chars": 358,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/EEPROM_CAT24M01.d",
    "chars": 4990,
    "preview": "EEPROM_CAT24M01.d EEPROM_CAT24M01.o: .././EEPROM_CAT24M01.cpp \\\n .././EEPROM_CAT24M01.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/GPS_L70_Light.d",
    "chars": 5426,
    "preview": "GPS_L70_Light.d GPS_L70_Light.o: .././GPS_L70_Light.cpp \\\n .././GPS_L70_Light.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studi"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/HelperFunctions.d",
    "chars": 543,
    "preview": "HelperFunctions.d HelperFunctions.o: .././HelperFunctions.cpp \\\n .././HelperFunctions.h \\\n c:\\program\\ files\\ (x86)\\atme"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/I2C.d",
    "chars": 4670,
    "preview": "I2C.d I2C.o: .././I2C.cpp .././I2C.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\avr"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/Makefile",
    "chars": 10008,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TestFunctions.d",
    "chars": 5545,
    "preview": "TestFunctions.d TestFunctions.o: .././TestFunctions.cpp \\\n .././TestFunctions.h .././TickTag.h \\\n c:\\program\\ files\\ (x8"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TickTag.d",
    "chars": 4901,
    "preview": "TickTag.d TickTag.o: .././TickTag.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-g"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TickTagSoftwareBurst.eep",
    "chars": 12,
    "preview": ":00000001FF\n"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TickTagSoftwareBurst.hex",
    "chars": 44218,
    "preview": ":100000000C943C000C9459000C9459000C945C081E\n:100010000C9459000C9459000C9444080C94590009\n:100020000C946D080C9459000C94590"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TickTagSoftwareBurst.lss",
    "chars": 334461,
    "preview": "\nTickTagSoftwareBurst.elf:     file format elf32-avr\n\nSections:\nIdx Name          Size      VMA       LMA       File off"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/TickTagSoftwareBurst.srec",
    "chars": 43272,
    "preview": "S01C00005469636B546167536F66747761726542757273742E7372656306\nS11300000C943C000C9459000C9459000C945C081A\nS11300100C945900"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/Time.d",
    "chars": 485,
    "preview": "Time.d Time.o: .././Time.cpp .././Time.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/UART.d",
    "chars": 4876,
    "preview": "UART.d UART.o: .././UART.cpp .././UART.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/main.d",
    "chars": 5610,
    "preview": "main.d main.o: .././main.cpp .././TickTag.h \\\n c:\\program\\ files\\ (x86)\\atmel\\ studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolch"
  },
  {
    "path": "TickTagProgramming/FinalFirmwareBinaries/TickTagSoftwareBurst_V203_ATTINY1626_BonnetedBats/makedep.mk",
    "chars": 358,
    "preview": "################################################################################\n# Automatically-generated file. Do not "
  },
  {
    "path": "TickTagProgramming/avrdude/ReadmeAVRDUDE.txt",
    "chars": 28,
    "preview": "Version: avrdude-6.3-mingw32"
  },
  {
    "path": "TickTagProgramming/avrdude/ScriptWriteFusesAndFirmware_V202_ATTINY1626.bat",
    "chars": 823,
    "preview": "@ECHO OFF\nECHO Hello! This script configures the fuses of the TickTag and flashes the firmware. Please connect Arduino N"
  },
  {
    "path": "TickTagProgramming/avrdude/ScriptWriteFusesAndFirmware_V203_ATTINY1626_BonnetedBats.bat",
    "chars": 836,
    "preview": "@ECHO OFF\nECHO Hello! This script configures the fuses of the TickTag and flashes the firmware. Please connect Arduino N"
  },
  {
    "path": "TickTagProgramming/avrdude/ScriptWriteFuses_ATTINY1616.bat",
    "chars": 514,
    "preview": "@ECHO OFF\nECHO Hello! This script configures the fuses of the TickTag. Please connect Arduino Nano with jtag2updi to the"
  },
  {
    "path": "TickTagProgramming/avrdude/ScriptWriteFuses_ATTINY1626.bat",
    "chars": 514,
    "preview": "@ECHO OFF\nECHO Hello! This script configures the fuses of the TickTag. Please connect Arduino Nano with jtag2updi to the"
  },
  {
    "path": "TickTagProgramming/avrdude/bin/avrdude.conf",
    "chars": 513871,
    "preview": "# $Id$ -*- text -*-\n#\n# AVRDUDE Configuration File\n#\n# This file contains configuration data used by AVRDUDE which descr"
  },
  {
    "path": "TickTagProgramming/avrdude/etc/avrdude.conf",
    "chars": 513871,
    "preview": "# $Id$ -*- text -*-\n#\n# AVRDUDE Configuration File\n#\n# This file contains configuration data used by AVRDUDE which descr"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2018 Joao N. Rosa\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/README.md",
    "chars": 13212,
    "preview": "# jtag2updi\n\nThis is a firmware, that when uploaded on an atmega328p, or a similar AVR MCU (including experimental suppo"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/avrdude.conf",
    "chars": 513871,
    "preview": "# $Id$ -*- text -*-\n#\n# AVRDUDE Configuration File\n#\n# This file contains configuration data used by AVRDUDE which descr"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/avrdude.conf.arduino",
    "chars": 524749,
    "preview": "# $Id$ -*- text -*-\n#\n# AVRDUDE Configuration File\n#\n# This file contains configuration data used by AVRDUDE which descr"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/build/JTAG2UPDI.hex",
    "chars": 8852,
    "preview": ":1000000052C100006BC1000069C1000067C100005F\n:1000100065C1000063C1000061C100005FC1000054\n:100020005DC100005BC1000059C1000"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/build/JTAG2UPDI.lss",
    "chars": 62147,
    "preview": "\nJTAG2UPDI.elf:     file format elf32-avr\n\nSections:\nIdx Name          Size      VMA       LMA       File off  Algn\n  0 "
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/JICE_io.cpp",
    "chars": 2409,
    "preview": "/*\n * stk_io.cpp\n *\n * Created: 18-11-2017 15:20:29\n *  Author: JMR_2\n */\n\n// Includes\n#include <avr/io.h>\n#include \"JIC"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/JICE_io.h",
    "chars": 680,
    "preview": "/*\n * stk_io.h\n *\n * Created: 18-11-2017 14:55:53\n *  Author: JMR_2\n */\n\n\n#ifndef JICE_IO_H_\n#define JICE_IO_H_\n\n#includ"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/JTAG2.cpp",
    "chars": 23190,
    "preview": "/*\n   STK500.cpp\n\n   Created: 08-12-2017 19:47:27\n    Author: JMR_2\n*/\n\n#include \"JTAG2.h\"\n#include \"JICE_io.h\"\n#include"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/JTAG2.h",
    "chars": 4885,
    "preview": "/*\n * packet.h\n *\n * Created: 12-11-2017 11:10:31\n *  Author: JMR_2\n */\n\n\n#ifndef JTAG2_H_\n#define JTAG2_H_\n\n#include \"s"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/NVM.h",
    "chars": 1914,
    "preview": "/*\n * NVM.h\n *\n * Created: 15-12-2017 10:59:53\n *  Author: JMR_2\n */\n\n\n#ifndef NVM_H_\n#define NVM_H_\n\n#include <stdint.h"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/NVM_v2.h",
    "chars": 2772,
    "preview": "/*\n * NVM_v2.h\n *\n * Created: 15-12-2017 10:59:53\n *  Author: JMR_2\n */\n\n\n#ifndef NVM_V2_H_\n#define NVM_V2_H_\n\n#include "
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_hi_lvl.cpp",
    "chars": 1785,
    "preview": "/*\n * UPDI_hi_lvl.cpp\n *\n * Created: 15-02-2018 23:08:39\n *  Author: JMR_2\n */\n\n#include \"UPDI_hi_lvl.h\"\n#include \"dbg.h"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_hi_lvl.h",
    "chars": 643,
    "preview": "/*\n * UPDI_hi_lvl.h\n *\n * Created: 15-02-2018 23:12:54\n *  Author: JMR_2\n */\n\n\n#ifndef UPDI_HI_LVL_H_\n#define UPDI_HI_LV"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_lo_lvl.cpp",
    "chars": 7279,
    "preview": "/*\n   UPDI_cmd.cpp\n\n   Created: 23-11-2017 22:48:36\n    Author: JMR_2\n*/\n\n// Includes\n#include \"UPDI_lo_lvl.h\"\n#include "
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/UPDI_lo_lvl.h",
    "chars": 2524,
    "preview": "/*\n * UPDI_cmd.h\n *\n * Created: 23-11-2017 22:46:11\n *  Author: JMR_2\n */\n\n\n#ifndef UPDI_LO_LVL_H_\n#define UPDI_LO_LVL_H"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/crc16.cpp",
    "chars": 2567,
    "preview": "/*\n * crc16.cpp\n *\n * Created: 16-01-2018 23:06:40\n *  Author: JMR_2\n */\n\n#include \"crc16.h\"\n#include \"sys.h\"\n#include \""
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/crc16.h",
    "chars": 405,
    "preview": "/*\n * crc16.h\n *\n * Created: 16-01-2018 23:07:05\n *  Author: JMR_2\n */\n\n\n#ifndef CRC16_H_\n#define CRC16_H_\n\n#include <st"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/dbg.cpp",
    "chars": 11877,
    "preview": "/*\n * dbg.h\n *\n * Created:5/11/2020\n *  Author: Spence Konde  (tindie.com/stores/drazzy)\n * github.com/SpenceKonde\n */\n\n"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/dbg.h",
    "chars": 12452,
    "preview": "/*\n * dbg.h\n *\n * Created:5/11/2020\n * Author: Spence Konde  (tindie.com/stores/drazzy)\n * github.com/SpenceKonde\n */\n\n#"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/jtag2updi.cpp",
    "chars": 5127,
    "preview": "/*\n * j2updi.cpp\n *\n * Created: 11-11-2017 22:29:58\n * Author : JMR_2\n */\n\n// Includes\n#include \"sys.h\"\n#include \"updi_i"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/jtag2updi.ino",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/parts.h",
    "chars": 2337,
    "preview": "/*\n *  parts.h\n *\n * Created:5/11/2020\n * Author: Spence Konde  (tindie.com/stores/drazzy)\n * github.com/SpenceKonde\n */"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/sys.cpp",
    "chars": 1931,
    "preview": "/*\n * sys.cpp\n *\n * Created: 02-10-2018 13:07:52\n *  Author: JMR_2\n */\n\n#include <avr/io.h>\n#include <avr/interrupt.h>\n#"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/sys.h",
    "chars": 12345,
    "preview": "/*\n * sys.h\n *\n * Created: 02-10-2018 13:07:18\n *  Author: JMR_2\n */\n\n#ifndef SYS_H_\n#define SYS_H_\n\n#include <avr/io.h>"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/updi_io.cpp",
    "chars": 5865,
    "preview": "/*\n * updi_io.cpp\n *\n * Created: 18-11-2017 10:36:54\n *  Author: JMR_2\n */\n\n\n\n// Includes\n#include <avr/io.h>\n#include \""
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/updi_io.h",
    "chars": 448,
    "preview": "/*\n * updi_io.h\n *\n * Created: 18-11-2017 10:38:31\n *  Author: JMR_2\n */\n\n\n#ifndef UPDI_IO_H_\n#define UPDI_IO_H_\n\n#inclu"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/jtag2updi/updi_io_soft.cpp",
    "chars": 9328,
    "preview": "/*\n * updi_io_soft.cpp\n *\n * Created: 11-08-2018 22:08:14\n *  Author: Cristian Balint <cristian dot balint at gmail dot "
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/make.bat",
    "chars": 4634,
    "preview": "@ echo off\nsetlocal\nrem Replace by location of your avr-gcc compiler if different\nset BINPATH=\"%LOCALAPPDATA%\\Arduino15\\"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/make.sh",
    "chars": 4595,
    "preview": "#!/bin/sh\n\n# avr-gcc++ path\n# Replace by location of your avr-gcc compiler if different\nBINPATH=\"/usr/bin\"\nINCPATH=\"./so"
  },
  {
    "path": "TickTagProgramming/jtag2updi-master/tools/avrjtagicev2/README.md",
    "chars": 3847,
    "preview": "# AVR JTAG ICE v2.0\n\nThe firmware can be uploaded to **AVR JTAG ICE** usb stick with no dismantling or soldering just by"
  },
  {
    "path": "TickTagSerialDownload/README.md",
    "chars": 2236,
    "preview": "# TickTag Serial Download Tool Documentation\n\nThis tool allows the user to *get the serial data from a TickTag device*, "
  },
  {
    "path": "TickTagSerialDownload/TickTag_Serial_Download.py",
    "chars": 9531,
    "preview": "import serial\nimport time\nimport pandas as pd\nfrom datetime import datetime\nimport os\nfrom tqdm import tqdm\nfrom inputim"
  },
  {
    "path": "TickTagSerialDownload/requirements.txt",
    "chars": 30,
    "preview": "serial\npandas\ntqdm\ninputimeout"
  },
  {
    "path": "TickTagSoftwareBurst/TickTagSoftwareBurst/Configuration.h",
    "chars": 7415,
    "preview": "#ifndef CONFIGURATION_H_\n#define CONFIGURATION_H_\n\n#define TRACKING_MODE_NORMAL\t\t\t\t\t\t\t\t0xDD\n#define TRACKING_MODE_TEST\t\t"
  },
  {
    "path": "TickTagSoftwareBurst/TickTagSoftwareBurst/EEPROM_CAT24M01.cpp",
    "chars": 3432,
    "preview": "#include \"EEPROM_CAT24M01.h\"\n\nbool eepromIsAlive() {\n\tif(!i2cStartRead(EEPROM_CAT24M01_ADDRESS)) {\n\t\ti2cStop();\n\t\treturn"
  },
  {
    "path": "TickTagSoftwareBurst/TickTagSoftwareBurst/EEPROM_CAT24M01.h",
    "chars": 748,
    "preview": "#ifndef EEPROM_CAT24M01_h\n#define EEPROM_CAT24M01_h\n\n#include <stdint.h>\n#include \"I2C.h\"\n#include \"UART.h\"\n\n#define EEP"
  },
  {
    "path": "TickTagSoftwareBurst/TickTagSoftwareBurst/GPS_L70_Light.cpp",
    "chars": 20062,
    "preview": "#include \"GPS_L70_Light.h\"\n\nconst char* commandOnlyGPGGAEverySecond =\t\t\"$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2"
  }
]

// ... and 61 more files (download for full content)

About this extraction

This page contains the full source code of the trichl/TickTagOpenSource GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 261 files (13.5 MB), approximately 3.5M tokens, and a symbol index with 205 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!