Skip to content

Deprecated

Axel Fougues edited this page Jan 20, 2025 · 2 revisions

Local Files Custom Products

🧾 NDEF Records

Records saved in the NDEF Manager's record library can be found under NDEFRecords\. The naming of the record files follows this pattern:

NDEFRecord-[arbitrary unique index].JSON

File structure example

{
   "tnf":1,
   "recordType":[
      85
   ],
   "payload":[
      4,
      115
   ],
   "recordID":[
      
   ],
   "simpleRecordType":5,
   "text":"",
   "languageCode":"",
   "textEncoding":0,
   "uri":"https://xyz.com",
   "mimeType":"",
   "packageName":"",
   "domain":"",
   "domainDataType":""
}
  • tnf: Record type name format.
  • recordType: The record type. Represented in Integers for serialization purposes.
  • payload: Full record byte content. Represented in Integers for serialization purposes.
  • recordID: The record's ID. Represented in Integers for serialization purposes.

Used in "simplified" records:

  • simpleRecordType: A predefined record type.
  • text: Record's text for appropriate record types.
  • uri: Record's URI for appropriate record types.
  • languageCode: Record's language tag for appropriate record types.
  • textEncoding: Record's text encoding for appropriate record types. 0 - UTF8, 1 - UTF16.
  • mimeType: Record's mime type for appropriate record types.
  • packageName: Android package name for appropriate record types.
  • domain: Domain for appropriate record types.
  • domainDataType: Domain data type for appropriate record types.

Simple Record Type

public enum SimpleRecordType { 
    None, 
    Text, 
    Application, 
    External, 
    Mime, 
    URI 
}

Type Name Format

public enum SimpleRecordType { 
    None, 
    Text, 
    Application, 
    External, 
    Mime, 
    URI 
}

Language Code

public enum LanguageCode { 
    en
}

Text Encoding

public enum TextEncoding { 
    UTF8, 
    UTF16 
}

🛍Custom Products

File naming and location

Custom products are listed in a unique file UserData\CustomProducts.JSON.

File structure example

{
   "customProducts":[
      {
         "readableName":"DoNext",
         "url":"https://forum.dangerousthings.com/t/the-donext-is-in/8037",
         "imageURL":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Glazed-Donut.jpg/220px-Glazed-Donut.jpg",
         "isCustom":true,
         "xSizeMM":42.0,
         "ySizeMM":0.5,
         "zSizeMM":42.0,
         "typicalInfo":{
            "ID":"",
            "technologies":[
               
            ],
            "manufacturer":"",
            "scanDuration":0,
            "versionData":"",
            "writable":false,
            "storageSize":0,
            "ndefMessage":{
               "Success":false,
               "Error":0,
               "records":[
                  
               ]
            },
            "rawContents":[
               
            ],
            "icName":""
         },
         "typicalIC":"",
         "brands":[
            "Dangerous Things"
         ],
         "tags":14
      },
      {
         "readableName":"Kirby",
         "url":"https://en.wikipedia.org/wiki/Kirby_%28character%29",
         "imageURL":"https://upload.wikimedia.org/wikipedia/en/thumb/2/2d/SSU_Kirby_artwork.png/220px-SSU_Kirby_artwork.png",
         "isCustom":true,
         "xSizeMM":120.0,
         "ySizeMM":100.0,
         "zSizeMM":120.0,
         "typicalInfo":{
            "ID":"",
            "technologies":[
               
            ],
            "manufacturer":"",
            "scanDuration":0,
            "versionData":"",
            "writable":false,
            "storageSize":0,
            "ndefMessage":{
               "Success":false,
               "Error":0,
               "records":[
                  
               ]
            },
            "rawContents":[
               
            ],
            "icName":""
         },
         "typicalIC":"",
         "brands":[
            "Custom"
         ],
         "tags":40
      }
   ]
}
  • readableName: The literal product name, is and should remain unique.
  • url: A link to the product's web page.
  • imageUrl: A link to an online image of the product.
  • isCustom: Has this product been added by the user? Always true for custom products.
  • xSizeMM, ySizeMM, zSizeMM: Dimensions of the product in millimeters.
  • typicalInfo: The standard NFC chip information for products with the "HF" tag. Used mostly for product matching when scanning NFC tags.
  • typicalIC: References the readableName of an internal IC database. For products with the "HF" tag. Used mostly for product matching when scanning NFC tags.
  • brands: List of references to readableName of an internal Brands database.
  • tags: List of tags defining the product's capabilities. These are important since they are used to hide or enable options within other features such as haptic tests for magnets.

Product Tags

enum ProductTag {
    none = 0,
    LF = 1 << 0,
    HF = 1 << 1,
    led = 1 << 2,
    glow = 1 << 3,
    magnet = 1 << 4,
    sensor = 1 << 5,
    payment = 1 << 6

}

Local Files Feed Subscriptions

🔔Feed Subscriptions

File naming and location

Sources for the feed as well as the filters for those sources are fully customizable. Just modify the file at UserData\FeedSubscriptions.JSON.

File structure example

This is the default subscriptions file:

{
   "subscriptions":[
      {
         "readableName":"Dangerous Things Forum",
         "rssUrl":"https://forum.dangerousthings.com/latest.rss",
         "categoryFilters":[
            "Dangerous Announcements",
            "DT Info",
            "Community Projects",
            "VivoKey Apex",
            "Projects"
         ],
         "brands":[
            "Dangerous Things"
         ]
      },
      {
         "readableName":"Biohack.me Forum",
         "rssUrl":"https://forum.biohack.me/index.php?p=/discussions/feed.rss",
         "categoryFilters":[
            "Announcements",
            "Magnets",
            "RFID/NFC",
            "Coatings, transdermals, other implants",
            "Prosthetics, wearables, and haptics",
            "Genetic and biology based mods",
            "Supplements, pharmaceuticals, and nootropics"
         ],
         "brands":[
            "Biohack.me"
         ]
      },
      {
         "readableName":"Walletmor",
         "rssUrl":"https://walletmor.com/blogs/news.atom",
         "categoryFilters":[
            
         ],
         "brands":[
            "Walletmor"
         ]
      },
      {
         "readableName":"Vivokey",
         "rssUrl":"https://vivokey.com/feed/",
         "categoryFilters":[
            
         ],
         "brands":[
            "Vivokey"
         ]
      },
      {
         "readableName":"Dangerous Things Website",
         "rssUrl":"https://dangerousthings.com/feed/",
         "categoryFilters":[
            
         ],
         "brands":[
            "Dangerous Things"
         ]
      },
      {
         "readableName":"Dsruprive",
         "rssUrl":"https://dsruptive.com/feed/",
         "categoryFilters":[
            
         ],
         "brands":[
            "Dsruptive"
         ]
      }
   ]
}
  • readableName: The source name that will be displayed when necessary in the app
  • rssUrl: The RSS or Atom feed url of the source
  • categoryFilters: These filters will apply on the category field of the items coming from said source, leave empty for no filtering
  • brands: A list of references to the readableName field of the internal brand database. Used to decorate feed items with icons representing the source.

Local Files Haptic Test Results

☝️Haptic Test Results

File naming and location

The naming of the test result files follows this pattern:

HapticTestResults\[upgradeID]\[Test_Type]_[WaveType]\[year]_[month]_[day]_[hours]_[seconds]([optional id]).JSON

Each file represents a single question (see Haptic Analytics.

⚠️The file structure must be respected for ZINC to recognize the files properly.

File structure example

{
   "testType":0,
   "waveType":0,
   "timestamp":"2024_07_01_12_40",
   "product":"Titan",
   "upgradeId":"c4e...52026",
   "amplitude":0.0,
   "frequency":250.0,
   "gap":0.0,
   "duration":1.0,
   "response":0
}
  • testType: Type of test for this question.
  • waveType: Type of wave used for this question.
  • timestamp: Time when question answer was saved.
  • product: The product name of the biomagnet being tested.
  • upgradeId: Unique id of the upgrade being tested.
  • amplitude: Amplitude value tested, for test types where applicable.
  • frequecy: Frequency value tested, for test types where applicable.
  • gap: Gap value tested, for test types where applicable.
  • Duration: Duration value tested, for test types where applicable.
  • response: User response.

Possible responses

"yes","no","a","b","same"

Response sets

YN: yes,no
AB: a,b
ASB: a,same,b

Test types

enum HapticTestType { 
   Amplitude_Detection, //YN
   Amplitude_Discrimination, //ASB
   Frequency_Discrimination, //tbd
   Temporal_Discrimination //tbd
}

Wave types

enum TestWaveType { 
   Sine, 
   Square, 
   Saw 
};

Local Files Ndef Scan Results

📒 NDEF Scan Results

NDEF scan results share a common file structure with NFC scan results. They are saved and processed in NDEFResults\. Only the latest result for each upgrade is saved. The naming of the scan result files follows this pattern:

NDEFScan-[upgradeID].JSON

File structure example

Same as NFC scan results.

Local Files Nfc Scan Results

🗃 NFC Scan Results

File naming and location

NFC scan results share a common file structure with NDEF scan results. They are saved and processed in NFCResults\. The naming of the scan result files follows this pattern:

[NFCScan|NDEFScan]-[year]_[month]_[day]_[upgradeID|tagUID].JSON

While the types and the date are purely indicative, the name must contain the upgrade id to be properly processed by ZINC.

File structure example

{
   "time":"2023_07_13_14_27",
   "tag":{
      "ID":"0429A6D2CD5280",
      "atqa":[
         68,
         0
      ],
      "sak":0,
      "technologies":[
         6,
         3,
         4
      ],
      "manufacturer":"04",
      "scanDuration":2734,
      "versionData":"0004040502021503",
      "writable":false,
      "storageSize":1912,
      "ndefMessage":{
         "Success":true,
         "Error":0,
         "records":[
            {
               "type":2,
               "payload":[
                  99,
                  ...
                  108
               ],
               "uri":"vnd.android.nfc://ext/android.com:pkg",
               "text":"",
               "languageCode":"",
               "textEncoding":0,
               "mimeType":"",
               "mimeData":[
                  
               ]
            }
         ]
      },
      "rawContents":[
         {
            "sector":0,
            "content":[
               {
                  "blockIndex":0,
                  "blockContent":[
                     4,
                     41,
                     166,
                     210
                  ],
                  "byteTypes":[
                     3,
                     3,
                     3,
                     3
                  ],
                  "writable":true,
                  "readable":true,
                  "locked":false,
                  "blocked":false
               },
                 ...
               {
                  "blockIndex":255,
                  "blockContent":[
                     0,
                     0,
                     0,
                     0
                  ],
                  "byteTypes":[
                     0,
                     0,
                     0,
                     0
                  ],
                  "writable":false,
                  "readable":false,
                  "locked":true,
                  "blocked":true
               }
            ]
         }
      ],
      "icName":"NTAG I2C plus 2k"
   },
   "userUpgradeID":""
}
  • time: The time and date of the scan.
  • tag: Information about the tag and its contents.
    • ID: The tag's UID.
    • atqa: The tag's ATQA (NFC scan only).
    • sak: The tag's SAK (NFC scan only).
    • technologies: A list of technology tags detected by Android.
    • manufacturer: The tag's standard NFC manufacturer id.
    • scanDuration: Total scan duration from TagTechnology.connect() to TagTechnology.close() in ms.
    • versionData: Used internally for chip identification (NFC scan only).
    • writable: Is the tag writable (not implemented) (NFC scan only).
    • storageSize: User available storage size in bytes (NFC scan only).
    • ndefMessage: NDEF contents and read results (NDEF scan only).
      • Success: Did the NDEF scan succeed.
      • Error: Optional error message from the NDEF read.
      • records: List of NDEF records detected on the tag.
    • rawContent: Raw tag memory content, a list of sectors (NFC scan only).
      • sector: Sector index.
      • content: List of block within the sector.
        • blockIndex: Block's index within the sector.
        • blockContent: Block's byte content. Represented in Integers for serialization purposes.
        • byteTypes: Block's bytes semantic representation. See Block Colorization Scheme semantics
        • writable: Is the block writable.
        • readable: Is the block readable.
        • locked: Is the block locked.
        • blocked: Is the block blocked.
    • icName: Name of the chip if identified. Coresponds to internal IC database's readableName field (NFC scan only).
  • userUpgradeID: The associated user upgrade ID if any.

Technology tags

public enum NFCTechnology {
        UNKNOWN,
        ISO_DEP,
        MIFARE_CLASSIC,
        MIFARE_ULTRALIGHT,
        NDEF,
        NDEF_FORMATABLE,
        NFC_A,
        NFC_B,
        NFC_BARCODE,
        NFC_F,
        NFC_V
    }

NDEF Read Error

public enum NDEFReadError { 
    NONE, 
    HAS_UNREADABLE_RECORDS, 
    UNKNOWN, 
    USER_CANCEL, 
    TIMEOUT, 
    NO_RECORDS 
}

Local Files Theme

🎨Theme

File naming and location

A custom theme can be placed in Theme\. The file (if formatted correctly) will automatically be used in ZINC instead of the default themes. Naming: *.JSON

File structure example

{
   "background1":{
      "r":0.054901961237192157,
      "g":0.8352941274642944,
      "b":0.6549019813537598,
      "a":1.0
   },
   "background2":{
      "r":0.0,
      "g":0.3333333432674408,
      "b":0.34117648005485537,
      "a":1.0
   },
   "backgroundAngle":-45,
   "panel1":{
      "r":1.0,
      "g":1.0,
      "b":1.0,
      "a":0.4000000059604645
   },
   "panel2":{
      "r":1.0,
      "g":1.0,
      "b":1.0,
      "a":0.10196078568696976
   },
   "panelAngle":-45,
   "highlight1":{
      "r":0.0,
      "g":1.0,
      "b":0.7294118404388428,
      "a":1.0
   },
   "highlight2":{
      "r":0.0,
      "g":0.7972411513328552,
      "b":0.8159999847412109,
      "a":1.0
   },
   "highlightAngle":-45,
   "baseColor":{
      "r":1.0,
      "g":1.0,
      "b":1.0,
      "a":1.0
   },
   "accentColor":{
      "r":0.0,
      "g":1.0,
      "b":0.7287983894348145,
      "a":1.0
   },
   "halfTone":{
      "r":0.06666667014360428,
      "g":0.07058823853731156,
      "b":0.07450980693101883,
      "a":0.2980392277240753
   },
   "blockColorizationScheme":[
      {
         "r":0.4745098054409027,
         "g":0.4745098054409027,
         "b":0.4745098054409027,
         "a":1.0
      },
      {
         "r":0.8392156958580017,
         "g":0.8392156958580017,
         "b":0.8392156958580017,
         "a":1.0
      },
      {
         "r":1.0,
         "g":0.0,
         "b":0.0,
         "a":1.0
      },
      {
         "r":0.42352941632270815,
         "g":0.6000000238418579,
         "b":0.7333333492279053,
         "a":1.0
      },
      {
         "r":0.6196078658103943,
         "g":0.5254902243614197,
         "b":0.7843137383460999,
         "a":1.0
      },
      {
         "r":0.9098039269447327,
         "g":0.4901960790157318,
         "b":0.24313725531101228,
         "a":1.0
      },
      {
         "r":0.6196078658103943,
         "g":0.5254902243614197,
         "b":0.7843137383460999,
         "a":1.0
      },
      {
         "r":0.6901960968971252,
         "g":0.32156863808631899,
         "b":0.4745098054409027,
         "a":1.0
      },
      {
         "r":0.6901960968971252,
         "g":0.32156863808631899,
         "b":0.4745098054409027,
         "a":1.0
      },
      {
         "r":0.8980392217636108,
         "g":0.7098039388656616,
         "b":0.40392157435417178,
         "a":1.0
      },
      {
         "r":0.6196078658103943,
         "g":0.5254902243614197,
         "b":0.7843137383460999,
         "a":1.0
      },
      {
         "r":0.6196078658103943,
         "g":0.5254902243614197,
         "b":0.7843137383460999,
         "a":1.0
      },
      {
         "r":1.0,
         "g":0.0,
         "b":0.0,
         "a":1.0
      },
      {
         "r":0.7058823704719544,
         "g":0.8235294222831726,
         "b":0.45098039507865908,
         "a":1.0
      },
      {
         "r":0.7058823704719544,
         "g":0.8235294222831726,
         "b":0.45098039507865908,
         "a":1.0
      },
      {
         "r":0.9098039269447327,
         "g":0.4901960790157318,
         "b":0.24313725531101228,
         "a":1.0
      },
      {
         "r":0.6196078658103943,
         "g":0.5254902243614197,
         "b":0.7843137383460999,
         "a":1.0
      },
      {
         "r":0.8392156958580017,
         "g":0.8392156958580017,
         "b":0.8392156958580017,
         "a":1.0
      }
   ]
}
  • background: Is a gradient from color 1 to color 2 with an angle of backgroundAngle. It mostly applies to large background surfaces.
  • panel: Is a gradient from color 1 to color 2 with an angle of panelAngle. It applies mostly to buttons and other medium-sized surfaces.
  • highlight: Is a gradient from color 1 to color 2 with an angle of highlightAngle. It applies mostly to outlines, icons, and accent elements.
  • baseColor: The default flat color. Mostly for text and icons.
  • accent: Similar to highlight but for text and some icons.
  • halfTone: A faded-out color for less intrusive text and de-selected or unavailable icons.
  • blockColorizationScheme: A list of colors used for raw tag content semantic coloration.

Block Colorization Scheme semantics

Total of 18 colors in the following order:

    // 0 - inaccessible
    // 1 - user memory
    // 2 - CNT_MAX Counter max value
    // 3 - UID
    // 4 - Internal
    // 5 - Dynamic lock bytes
    // 6 - RFU reserved for future use
    // 7 - AUTH0
    // 8 - ACCESS
    // 9 - PWD
    //10 - PACK
    //11 - PT_I2C
    //13 - Config Registers
    //12 - Keys
    //14 - Session Registers
    //15 - Static Lock Bytes
    //16 - Capability Container CC
    //17 - OTP

Local Files User Upgrades

💉User Upgrades

File naming and location

User Upgrades are listed in a unique file UserData\MyUpgrades.JSON.

File structure example

{
   "savableUserUpgrades":[
      {
         "id":"e03ca88b7f6903bf5cc0b1cb3d65ae301708539372",
         "readableName":"Pincher",
         "product":"Spark 2",
         "location":"Arm_right/Hand/Middle_finger/Pad",
         "installDate":"20-04-2024"
      },
      {
         "id":"e03ca88b7f6903bf5cc0b1cb3d65ae301708539370",
         "readableName":"Titanion",
         "product":"xNT",
         "location":"Head",
         "installDate":"20-04-2024"
      }
   ]
}
  • id: A unique identifier composed of the device's id and an incremental integer.
  • readableName: a literal name modifiable by the user.
  • product: the product associated with this upgrade, chosen by the user.
  • location: where the upgrade is located on the user, set by the user.
  • installDate: date of installation set by the user.

Locations

 Body
    Head
       Face
          Nose
          Mouth
          Eye_left
          Eye_right
          Forehead
          Chin
          Temple_left
          Temple_right
          Cheek_left
          Cheek_right
        Ear_right
        Ear_left
        Back
        Top
    Core
        Neck
           Left
           Right
           Front
           Back
        Clavicle_left
        Clavicle_right
        Chest
           Left
           Right
        Abdomen
           Left
           Right
        Genitals
        Rear
           Left
           Right
    Arm_right
       Shoulder
       Armpit
       Upper
       Elbow
       Lower
       Wrist
          Top
          Bottom
       Hand
          Thumb
             Pad_left
             Pad_Right
             Pad
             Metacarpal
             Proximal
             Distal
          Index_finger
             Pad_left
             Pad_Right
             Pad
             Metacarpal
             Proximal
             Middle
             Distal
          Middle_finger
             [Same as Index_finger]
          Ring_finger
             [Same as Index_finger]
          Little_finger
             [Same as Index_finger]
          Palm
          Knife_edge
          Thumb_edge
          P0
          P1
          P2
          P3
    Arm_left
       [Same as Arm_right]
    Leg_right
       Hip
       Upper
       Knee
       Lower
       Ankle
       Foot
          Heel
          Big_toe
          Index_toe
          Middle_toe
          Ring_toe
          Pinkie_toe
    Leg_left
       [Same as Leg_right]
}

Feed

🔎About the feature

This feature brings you the latest news from a curated and customizable collection of online resources like forums, manufacturer websites, blogs, and news channels!

🕹Tutorial

Just scroll through the news! See something interesting? Tap it to open the source post.

🛠Technical information

News older than a fixed number of days won't be loaded. Currently, this threshold is fixed at 60 but eventually, it will be modifiable.

Haptic Database

🎯Purpose

The goal of the haptic database is to collect as many test results as possible so that meaningful analysis can be done. It also provides average test results for each magnet model to the app so that ZINC users can compare their personal results to a global baseline. All the data will be made public.

Currently the feature isn't available but don't worry your results are saved locally and when the database goes online you will be able to contribute them!

🏗️Data structure

Coming soon.