abse/smart-ring-flex
A tscircuit package created by abse.
- Version
- 0.0.24
- License
- unset
- Stars
- 0
src/ring-board.tsx
import {FivePinServiceHeader} from './five-pin-service-connector'
import {RC0201FR_07100KL} from '../imports/RC0201FR_07100KL'
import internalCopper from '../routing/internal-contact-copper.json'
import {internalContact} from './internal-contact-geometry'
import {TPS70933DRVR as LedRegulator} from '../imports/TPS70933DRVR'
import {RC0201FR_071KL as LedInputResistor} from '../imports/RC0201FR_071KL'
import modelU8 from '../mechanical/embedded/component-U8'
import modelR30 from '../mechanical/embedded/component-R30'
import modelC22 from '../mechanical/embedded/component-C22'
import {opticalCap,opticalVrefCap,opticalLedCap} from './optical-compact-footprints'
import Extension,{ext,endY} from './integral-charge-extension'
import DockTab,{dockTab,dockTabEnd} from './dock-contact-tab'
import {RingRoot} from './contact-root-lands'
import {SchematicSheets,schematicFor,schematicRefs} from './schematic-layout'
import RingChargingJst from './ring-charging-jst'
import {wiredDockGeometry as wg} from './wired-dock-geometry'
import WiredCutoffService from './wired-cutoff-service'
import AssemblySilkscreen from './assembly-silk'
import ContactIsland,{contactGeometry as ci} from './contact-island'
import CompactCutoffService from './compact-cutoff-service'
import {compactFold as cf} from './compact-service-geometry'
import ChargeInterlock from "./charge-interlock"
import CutoffService from "./cutoff-service"
import fullPanelCopper from "../routing/ch552-complete-copper.json"
import fullPanelAnchor from "../routing/ch552-complete-anchor.json"
import {serviceOutline} from "./cutoff-geometry"
import CoilStudy from "./coil-study"
import modelU5 from "../mechanical/embedded/component-U5"
import modelU4 from "../mechanical/embedded/component-U4"
import modelU3 from "../mechanical/embedded/component-U3"
import modelLED1 from "../mechanical/embedded/component-LED1"
import modelPD1 from "../mechanical/embedded/component-PD1"
import modelU7 from "../mechanical/embedded/component-U7"
import modelU9 from "../mechanical/embedded/component-U9"
import modelU6 from "../mechanical/embedded/component-U6"
import modelU2 from "../mechanical/embedded/component-U2"
import modelANT1 from "../mechanical/embedded/component-ANT1"
import modelY1 from "../mechanical/embedded/component-Y1"
import modelU1 from "../mechanical/embedded/component-U1"
import resistorModel from "../mechanical/embedded/resistor-0402"
import cap0402 from "../mechanical/embedded/capacitor-0402"
import cap0603 from "../mechanical/embedded/capacitor-0603"
import inductorModel from "../mechanical/embedded/inductor-0402"
import integratedCopper from "../routing/integrated-copper.json"
import ch552RingCopper from "../routing/ch552-ring-copper.json"
import { integratedGeometry as singleFlexGeometry } from "./integrated-geometry"
import IntegratedBattery from "./integrated-battery"
import SavedRouting from "./saved-routing"
import { Fragment } from "react"
import { componentPurpose } from "./component-notes"
import { supplierFootprint } from "./supplier-footprints"
import { NRF52832_QFAA_R as Radio } from "../imports/NRF52832_QFAA_R"
import { ZSPD4000QN as Optical } from "../imports/ZSPD4000QN"
import { SFH_7018A as OpticalLED } from "../imports/SFH_7018A"
import { SFH2704 as Photodiode } from "../imports/SFH2704"
import { TMP117AIDRVR as Temperature } from "../imports/TMP117AIDRVR"
import { LIS2DW12TR as Motion } from "../imports/LIS2DW12TR"
import { BQ25186DLHR as Charger } from "../imports/BQ25186DLHR"
import { TPS7A0218PDBVR as Regulator } from "../imports/TPS7A0218PDBVR"
import { BQ29700DSET as Protector } from "../imports/BQ29700DSET"
import { FS8205A as DualFet } from "../imports/FS8205A"
import { A_2450AT18A100E as Antenna } from "../imports/A_2450AT18A100E"
import { Q22FA12800025 as HfCrystal } from "../imports/Q22FA12800025"
import { supplier } from "./sourcing"
import { schematic } from "./schematic"
import { boardSize, placement } from "./placement"
// Single assembly side does not restrict the bottom routing copper.
// ZSPD core/IO are 1.8V; three LED anodes use reverse-protected 3.3V TPS709 supply.
// Sequential dual-PD acquisition; no measured accuracy/runtime or complete application claim.
// Startup, core-off and low-battery compliance remain validation gates.
const at = (name: string) => placement[name] ?? {}
const supplied = (name:string) => supplier[name] ? {supplierPartNumbers:{jlcpcb:[supplier[name]]},footprint:supplierFootprint[supplier[name]]()} : {}
const sch = (name: string) => ({...(schematic[name] ?? {}),...schematicFor(name)})
const n = (s: string) => `net.${s}`
const rdata = [
// ref, value, PCB x/y, schematic x/y, sheet, net A/B
["R1","100k",-9.4,2.7,-6,-7,"Power","CHARGE_DISABLE","VDD"],
["R20","100k",-12,2.75,-4,-4,"Protection","BAT_TEMP_DRIVE","BAT_TEMP_ADC"],
["R2","100k",-12,2.75,-4,-4,"Charging","BAT_NTC","GND"],
["R6","330",-16.8,2.8,-12,-18,"Power","VBAT","PROTECT_VDD"],
["R7","2.2k",-17.7,0,-6,-18,"Power","GND","PROTECT_SENSE"],
["R8","7.5",-15,-2.6,0,-18,"Power","FET_RETURN","GND"],
["R12","4.7k",30,2.8,-10,-7,"Sensors","SCL","VDD"],
["R13","4.7k",32,2.8,-4,-7,"Sensors","SDA","VDD"],
["R15","100k",-22,2.9,-10,-10,"Radio","RESET","VDD"],
["R17","1M",-4,2.8,6,-18,"Power","VBAT","VBAT_SENSE"],
["R18","330k",-2,2.8,12,-18,"Power","VBAT_SENSE","GND"],
["R22","4.7k",2.87,3.2,6,0,"Optical","OPT_SDA","VDD"],
["R19","0",-40,0,10,-10,"Radio","RF50","ANT_FEED"],
] as const
const cdata = [
["C30","10uF",0,0,0,0,"OpticalPower","LED_LDO_IN","GND","0402"],
["C31","100nF",0,0,0,0,"OpticalPower","VDD","GND","0402"],
["C32","10uF",0,0,0,0,"OpticalPower","VLED_3V3","GND","0402"],
["C28","100nF",20.25,-1.03,0,0,"Sensors","VDD","GND","0402"],
["C29","10uF",22.25,-1.45,0,0,"Sensors","VDD","GND","0402"],
["C1","4.7uF",-12.8,1.7,-12,7,"Power","DOCK_5V","GND","0603"],
["C2","10uF",-9.2,-2.6,-6,7,"Power","VSYS","GND","0603"],
["C3","1uF",-11.7,-2.6,0,7,"Power","VBAT","GND","0402"],
["C5","100nF",-16.8,1.4,12,7,"Power","PROTECT_VDD","CELL_N","0402"],
["C6","1uF",-5.7,-2.7,-12,16,"Power","VSYS","GND","0402"],
["C7","1uF",-2.8,1.5,-6,16,"Power","VDD","GND","0402"],
["C8","100nF",-3.2,0,0,16,"Power","VBAT_SENSE","GND","0402"],
["C9","100nF",-37.5,-2.7,-15,7,"Radio","DEC1","GND","0402"],
["C10","100pF",-29.3,2.8,-9,7,"Radio","DEC3","GND","0402"],
["C11","1uF",-35.5,2.8,-3,7,"Radio","DEC4","GND","0402"],
["C12","100nF",-37.5,0,3,7,"Radio","VDD","GND","0402"],
["C13","100nF",-29.3,-2.8,9,7,"Radio","VDD","GND","0402"],
["C14","100nF",-33.5,2.8,15,7,"Radio","VDD","GND","0402"],
["C15","4.7uF",-37.5,1.5,-15,14,"Radio","VDD","GND","0603"],
["C16","12pF",-24.4,-2.7,-9,14,"Radio","XC2","GND","0402"],
["C17","12pF",-22.4,-2.7,-3,14,"Radio","XC1","GND","0402"],
["C18","0.8pF",-39,1.7,3,14,"Radio","RF50","GND","0402"],
["C21","100nF",21.5,-2.5,-2,7,"Optical","VDD","GND","0402"],
["C22","1uF",23,-2.5,4,7,"Optical","PPG_VREF","GND","0201"],
["C23","10uF",24.3,1.9,10,7,"Optical","VLED_3V3","GND","0402"],
["C27","10uF",13,3,12,7,"Optical","VDD","GND","0603"],
["C24","100nF",37.5,-1.5,-10,7,"Sensors","VDD","GND","0402"],
["C25","100nF",38,2.4,-4,7,"Sensors","VDD","GND","0402"],
["C26","100nF",40,-1.5,2,7,"Sensors","VDD","GND","0402"],
] as const
const pads = [
["TP1",-13.5,0,"DOCK_5V","Power",-18,0,1.2],
["TP2",-13.5,-1.8,"GND","Power",-18,-3,1.2],
["TP8",-18,2.5,"VBAT","Power",-18,-13,1],
["TP9",-18,-2.5,"CELL_N","Power",-18,-16,1],
["TP10",-15.4,2.8,"BAT_NTC","Power",18,-14,0.9],
["TP12",-15.4,2.8,"BAT_TEMP_ADC","Protection",18,-14,0.9],
["TP11",-15.4,1.3,"GND","Power",18,-17,0.9],
["TP3",-26.2,2.7,"SWDIO","Radio",18,0,0.8],
["TP4",-24.7,2.7,"SWDCLK","Radio",18,-3,0.8],
["TP5",-23.2,2.7,"RESET","Radio",18,-6,0.8],
["TP6",-26.2,1.2,"VDD","Radio",22,0,0.8],
["TP7",-24.7,1.2,"GND","Radio",22,-3,0.8],
] as const
const routingGroups = [
['VDD','RF_CHIP','RF50','ANT_FEED','XC1','XC2','FET_RETURN'],
['DEC1','DEC3','DEC4','CHARGE_DISABLE','CHG_GATE','DSG_GATE','FET_COMMON','PROTECT_VDD','PROTECT_SENSE','RESET','SWDCLK','SWDIO','BAT_NTC'],
['SCL','SDA','MOTION_INT','OPT_SDA','PPG_VREF','PPG_PD1','PPG_PD2','PPG_GREEN','PPG_RED','PPG_IR','VBAT_SENSE','BAT_TEMP_DRIVE','BAT_TEMP_ADC'],
['CELL_N','VBAT','DOCK_5V','VSYS','VLED_3V3','LED_LDO_IN','GND'],
]
const routingPlan = [routingGroups.flat()]
export default ({routingDisabled=false,folded=false,useSavedRoutes=true,wirelessCoil=false,servicePanel=false,chargeInterlock=false,compactDock=false,wiredDock=false,captureService=false}: {routingDisabled?:boolean;folded?:boolean;useSavedRoutes?:boolean;wirelessCoil?:boolean;servicePanel?:boolean;chargeInterlock?:boolean;compactDock?:boolean;wiredDock?:boolean;captureService?:boolean}={}) => {
const g = singleFlexGeometry
const size = {width:g.width,height:g.height}
const shift = g.flatShift
const hasInterlock=servicePanel||chargeInterlock
const contactExtension=0
const ringRight=g.width/2
const contactLeft=ringRight,contactRight=ringRight
const panelShift=wiredDock?(wg.left+contactRight)/2:servicePanel?-32.5-(compactDock?cf.addedLength/2:0)-contactExtension/2:0
const panelOutline=wiredDock?[
{x:wg.left,y:-5.3},{x:-109,y:-5.3},{x:-108.4,y:-4.7},
{x:dockTab.x-dockTab.width/2,y:-4.7},{x:dockTab.x-dockTab.width/2,y:dockTabEnd},{x:dockTab.x+dockTab.width/2,y:dockTabEnd},{x:dockTab.x+dockTab.width/2,y:-4.7},
{x:cf.right,y:-4.7},{x:cf.right,y:-4.3},
{x:ext.x-ext.width/2,y:-4.3},{x:ext.x-ext.width/2,y:endY},{x:ext.x+ext.width/2,y:endY},{x:ext.x+ext.width/2,y:-4.3},
{x:ringRight,y:-4.3},{x:ringRight,y:4.3},{x:cf.right,y:4.3},{x:cf.right,y:4.7},{x:-108.4,y:4.7},{x:-109,y:5.3},{x:wg.left,y:5.3}
]:compactDock?serviceOutline.map(p=>({...p,x:p.x<-100?p.x-cf.addedLength:p.x})):serviceOutline
const notchOutline=(poly:{x:number,y:number}[])=>poly.flatMap((p,i)=>{const q=poly[(i+1)%poly.length];return p.y===-4.3&&q.y===-4.3&&p.x<-1.95&&q.x>-1.05?[p,{x:-1.95,y:-4.3},{x:-1.95,y:-3.8},{x:-1.05,y:-3.8},{x:-1.05,y:-4.3}]:[p]})
const ringOutline=[{x:-size.width/2,y:-4.3},{x:size.width/2,y:-4.3},{x:size.width/2,y:4.3},{x:-size.width/2,y:4.3}]
const mount = (name:string) => {const p=at(name);return {...p,pcbX:p.pcbX+shift}}
return (
<board schLayout={{layoutMode:"relative"}} name="SMART_RING" material="flex" layers={2}
pcbX={panelShift} width={wiredDock?contactRight-wg.left:servicePanel?size.width+65+(compactDock?cf.addedLength:0)+contactExtension:size.width} height={wiredDock?5.3-dockTabEnd:servicePanel?9.4:size.height} outline={wiredDock?[...internalContact.outline]:hasInterlock?notchOutline(servicePanel?panelOutline:ringOutline):undefined} thickness="0.12mm"
schTraceAutoLabelEnabled schMaxTraceDistance={.8} autorouter="auto" routingDisabled={routingDisabled} routeRemaining={false}
minTraceWidth="0.08mm" defaultTraceWidth="0.1mm"
minTraceToPadEdgeClearance="0.1mm" minBoardEdgeClearance="0.3mm"
minViaHoleDiameter="0.1mm" minViaPadDiameter="0.3mm" minTraceToHoleEdgeClearance="0.2mm" minViaHoleEdgeToViaHoleEdgeClearance="0.3mm">
<group schMaxTraceDistance={.8} schTraceAutoLabelEnabled pcbX={-panelShift} pcbRelative>
{wiredDock&&<AssemblySilkscreen/>}
{hasInterlock&&<><ChargeInterlock/>{wiredDock&&<Extension folded={folded}/>}</>}
{servicePanel&&(wiredDock?<WiredCutoffService captureOnly={captureService} externalCopper={false}/>:compactDock?<CompactCutoffService captureOnly={captureService} externalCopper={false}/>:<CutoffService captureOnly={captureService} externalCopper={false}/>)}
{wiredDock&&<DockTab folded={folded}/>}
{wiredDock&&<SavedRouting copper={internalCopper as any} namePrefix="INTERNAL_RC" coordinateAnchor={{selector:'.VSES_76 > .top',cx:-41.5465,cy:.3345,rotation:0}}/>}
{!routingDisabled && !useSavedRoutes && routingPlan.map((_,i)=><Fragment key={i}><autoroutingphase name={`ROUTE_${i+1}`} phaseIndex={i} minBoardEdgeClearance="0.4mm"
minTraceWidth="0.08mm" minViaHoleDiameter="0.1mm" minViaPadDiameter="0.3mm"
minTraceToPadEdgeClearance="0.17mm" minViaEdgeToPadEdgeClearance="0.17mm" minTraceToHoleEdgeClearance="0.22mm" minViaHoleEdgeToViaHoleEdgeClearance="0.32mm" /></Fragment>)}
{wiredDock?internalContact.stiffeners.map(p=><pcbstiffener key={p.name} name={p.name} shape="polygon" outline={[...p.outline]} layer="bottom" material="fr4" thickness="0.2mm" adhesiveThickness="0.05mm"/>):g.mainStiffeners.map((p,i)=>hasInterlock&&i===4?<Fragment key={`stiffener-${i}`}><pcbstiffener name={`SUPPORT_${i+1}`} shape="polygon" pcbX={0} pcbY={0} outline={[{x:p.center-p.width/2,y:-3.7},{x:p.center+p.width/2,y:-3.7},{x:p.center+p.width/2,y:3.7},{x:p.center-p.width/2,y:3.7}]} layer="bottom" material="fr4" thickness="0.2mm" adhesiveThickness="0.05mm"/></Fragment>:<pcbstiffener key={`stiffener-${i}`} name={`SUPPORT_${i+1}`} shape="rect" pcbX={p.center} width={p.width} height={boardSize.height-.8} layer="bottom" material="fr4" thickness="0.2mm" adhesiveThickness="0.05mm" />)}
{/* Extend the axis past both edges: browser mesh coordinates are Float32,
so exact-edge endpoints can round short of the rendered cross-section. */}
{g.bends.map((b,i)=><pcbbend key={i} name={`B${i+1}`} x1={b.x} y1={wiredDock&&i===3?internalContact.b4StartY:-g.height/2-.05} x2={b.x} y2={g.height/2+.05} bendRadius={b.radius} bendAngle={folded?b.angle:0} bendSide="right" />)}
{g.bends.map((b,i)=><Fragment key={i}><keepout shape="rect" pcbX={b.x} width={b.width} height={g.height} layers={["top","bottom"]} allowTraces /></Fragment>)}
{!useSavedRoutes && g.bends.slice(0,6).flatMap((b,bi)=>Array.from({length:12},(_,i)=>{
const lo=i===0?-g.height/2:(-3.25+(i-1)*.65+.25)
const hi=i===11?g.height/2:(-3.25+i*.65-.25)
return <Fragment key={`bend-lane-${bi}-${i}`}><keepout shape="rect" pcbX={b.x} pcbY={(lo+hi)/2} width={b.width+.1} height={hi-lo} layers={["top","bottom"]}/></Fragment>
}))}
<SchematicSheets refs={[...schematicRefs.ring,...(wiredDock?["JSWD1"]:[]),...schematicRefs.battery,...(hasInterlock?schematicRefs.interlock:['R1']),...(wirelessCoil?schematicRefs.coil:[]),...(servicePanel&&wiredDock?[...schematicRefs.service,...schematicRefs.contact]:[])]}/>
{routingPlan.flatMap((nets,phase)=>nets.map(name=><Fragment key={name}><net name={name} routingPhaseIndex={useSavedRoutes?undefined:phase}
isGroundNet={['GND','CELL_N'].includes(name)} isPowerNet={['VDD','VSYS','VBAT','PROTECT_VDD','DOCK_5V'].includes(name)} /></Fragment>))}
<Radio cadModel={{glbUrl:modelU1}} name="U1" layer="top" pcbRotation={90} {...mount("U1")} schX={0} schY={0}
schSheetName="Radio" schSectionName="Radio" schWidth={7} schHeight={8} showPinAliases={false}
noConnect={['pin20','pin4','pin6','pin39','pin40','pin41','pin2','pin3','pin9','pin10','pin11','pin22','pin12','pin15','pin18','pin19','pin8','pin21','pin23','pin27','pin28','pin29','pin32','pin43','pin44','pin47']}
{...sch("U1")} connections={{pin5:n('BAT_TEMP_ADC'),pin14:n('BAT_TEMP_DRIVE'),pin7:n('CHARGE_DISABLE'),pin1:n('DEC1'),pin13:n('VDD'),pin24:n('RESET'),pin25:n('SWDCLK'),pin26:n('SWDIO'),pin30:n('RF_CHIP'),pin31:n('GND'),pin33:n('DEC3'),pin34:n('XC1'),pin35:n('XC2'),pin36:n('VDD'),pin37:n('SCL'),pin38:n('SDA'),pin17:n('OPT_SDA'),pin16:n('MOTION_INT'),pin42:n('VBAT_SENSE'),pin45:n('GND'),pin46:n('DEC4'),pin48:n('VDD'),pin49:n('GND')}} />
<HfCrystal cadModel={{glbUrl:modelY1}} name="Y1" loadCapacitance="8pF" layer="top" {...mount("Y1")} schX={-10} schY={0}
schSheetName="Radio" schSectionName="Radio" {...sch("Y1")} connections={{pin1:n('XC1'),pin2:n('GND'),pin3:n('XC2'),pin4:n('GND')}} />
<Antenna cadModel={{glbUrl:modelANT1}} name="ANT1" layer="top" {...mount("ANT1")} schX={10} schY={0}
schSheetName="Radio" schSectionName="Radio" noConnect={['pin2']} {...sch("ANT1")} connections={{pin1:n('ANT_FEED')}} />
<inductor cadModel={{glbUrl:inductorModel}} name="L1" layer="top" inductance="3.9nH" footprint="0402" {...mount("L1")} {...supplied("L1")}
schX={6} schY={-10} schSheetName="Radio" schSectionName="Radio" {...sch("L1")} connections={{pin1:n('RF_CHIP'),pin2:n('RF50')}} />
<Charger cadModel={{glbUrl:modelU2}} pinAttributes={{pin1:{providesPower:true},pin2:{requiresPower:true},pin5:{requiresGround:true},pin10:{requiresPower:true},pin11:{requiresGround:true}}} name="U2" noConnect={["N_PG","N_INT"]} layer="top" {...mount("U2")} schX={0} schY={0} schWidth={5}
schSheetName="Power" schSectionName="Power"
{...sch("U2")} connections={{SYS:n('VSYS'),BAT:n('VBAT'),N_CE:n(hasInterlock?'CHARGE_CE_HW':'CHARGE_DISABLE'),GND:n('GND'),TS:n('BAT_NTC'),SDA:n('SDA'),SCL:n('SCL'),IN:n('DOCK_5V'),EP:n('GND')}} />
<Protector cadModel={{glbUrl:modelU6}} pinAttributes={{pin1:{doNotConnect:true},pin4:{requiresGround:true},pin5:{requiresPower:true}}} name="U6" layer="top" {...mount("U6")} schX={-10} schY={-12} schWidth={4}
schSheetName="Power" schSectionName="Power" noConnect={['NC']}
{...sch("U6")} connections={{COUT:n('CHG_GATE'),DOUT:n('DSG_GATE'),VSS:n('CELL_N'),BAT:n('PROTECT_VDD'),V_NEG:n('PROTECT_SENSE')}} />
<DualFet cadModel={{glbUrl:modelU9}} pinAttributes={{pin1:{isPassive:true},pin2:{isPassive:true},pin3:{isPassive:true},pin4:{isInput:true,mustBeConnected:true},pin5:{isPassive:true},pin6:{isInput:true,mustBeConnected:true}}} name="U9" layer="top" {...mount("U9")} schX={0} schY={-12}
schSheetName="Power" schSectionName="Power"
{...sch("U9")} connections={{S1:n('CELL_N'),G1:n('DSG_GATE'),D11:n('FET_COMMON'),D12:n('FET_COMMON'),S2:n('FET_RETURN'),G2:n('CHG_GATE')}} />
<Regulator cadModel={{glbUrl:modelU7}} pinAttributes={{pin1:{requiresPower:true},pin2:{requiresGround:true},pin4:{doNotConnect:true},pin5:{providesPower:true}}} name="U7" layer="top" {...mount("U7")} schX={-6} schY={12} schWidth={4}
schSheetName="Power" schSectionName="Power" noConnect={['NC']}
{...sch("U7")} connections={{IN:n('VSYS'),GND:n('GND'),EN:n('VSYS'),OUT:n('VDD')}} />
<LedRegulator name="U8" layer="top" {...mount('U8')} {...sch('U8')} cadModel={{glbUrl:modelU8}} noConnect={['NC1','NC2']} connections={{IN:n('LED_LDO_IN'),EN:n('LED_LDO_IN'),OUT:n('VLED_3V3'),GND1:n('GND'),GND2:n('GND')}}/>
<LedInputResistor name="R30" layer="top" {...mount('R30')} {...sch('R30')} cadModel={{glbUrl:modelR30}} connections={{pin1:n('VSYS'),pin2:n('LED_LDO_IN')}}/>
<Optical cadModel={{glbUrl:modelU3}} name="U3" layer="top" {...mount("U3")} noConnect={['IN1','IN3','NC1','NC2','GPIO0','GPIO1']} {...sch('U3')}
connections={{AVDD:n('VDD'),DVDD:n('VDD'),IOVDD:n('VDD'),AVSS:n('GND'),DVSS:n('GND'),LEDVSS:n('GND'),EP:n('GND'),IN2:n('PPG_PD1'),IN0:n('PPG_PD2'),VREF:n('PPG_VREF'),SDA:n('OPT_SDA'),SCL:n('SCL'),LED0:n('PPG_GREEN'),LED1:n('PPG_RED'),LED2:n('PPG_IR')}}/>
<OpticalLED name="LED1" layer="top" {...mount("LED1")} cadModel={{glbUrl:modelLED1}} {...sch("LED1")}
connections={{pin1:n('PPG_GREEN'),pin7:n('PPG_GREEN'),pin8:n('PPG_GREEN'),pin2:n('VLED_3V3'),pin4:n('VLED_3V3'),pin6:n('VLED_3V3'),pin3:n('PPG_IR'),pin5:n('PPG_RED')}} />
{['PD1','PD2'].map((ref,i)=><Photodiode key={ref} name={ref} layer="top" {...mount(ref)} cadModel={{glbUrl:modelPD1}} {...sch(ref)}
connections={{CATHODE:n(i===0?'PPG_PD1':'PPG_PD2'),ANODE:n('GND')}} />)}
<Temperature cadModel={{glbUrl:modelU4}} pinAttributes={{pin2:{requiresGround:true},pin5:{requiresPower:true},pin7:{requiresGround:true}}} name="U4" layer="top" {...mount("U4")} schX={5} schY={0} schWidth={3.2}
schSheetName="Sensors" schSectionName="Sensors" noConnect={['ALERT']}
{...sch("U4")} connections={{SCL:n('SCL'),GND:n('GND'),ADD0:n('GND'),V_POS:n('VDD'),SDA:n('SDA'),EP:n('GND')}} />
<Motion cadModel={{glbUrl:modelU5}} name="U5" layer="top" {...mount("U5")} schX={-6} schY={0} schWidth={4.5}
schSheetName="Sensors" schSectionName="Sensors" noConnect={['NC','INT1']}
{...sch("U5")} connections={{SA0:n('GND'),SDA:n('SDA'),VDDIO:n('VDD'),INT2:n('MOTION_INT'),VDD:n('VDD'),GND1:n('GND'),GND2:n('GND'),RES:n('GND'),CS:n('VDD'),SCL:n('SCL')}} />
{<IntegratedBattery />}
{wirelessCoil&&<CoilStudy/>}
{!routingDisabled && useSavedRoutes && (<SavedRouting copper={hasInterlock&&!captureService?ch552RingCopper:integratedCopper} />)}
<copperpour name="RADIO_GROUND" connectsTo="net.GND" layer="bottom" clearance="0.2mm" boardEdgeMargin="0.3mm"
outline={[{x:g.panels[0].center-g.panels[0].width/2+.3,y:-g.height/2+.35},{x:g.panels[0].center+g.panels[0].width/2-.3,y:-g.height/2+.35},{x:g.panels[0].center+g.panels[0].width/2-.3,y:g.height/2-.35},{x:g.panels[0].center-g.panels[0].width/2+.3,y:g.height/2-.35}]} />
{!useSavedRoutes && <>
<trace name="CLOCK_XC1" schDisplayLabel="XC1" from="U1.XC1" to="Y1.pin1" thickness="0.1mm" maxViaCount={0} maxLength="10mm"
/>
<trace name="CLOCK_XC1_LOAD" schDisplayLabel="XC1" from="Y1.pin1" to="C17.pin1" thickness="0.1mm" maxViaCount={0}
/>
<trace name="CLOCK_XC2" schDisplayLabel="XC2" from="U1.XC2" to="Y1.pin3" thickness="0.1mm" maxViaCount={0} maxLength="10mm"
/>
<trace name="CLOCK_XC2_LOAD" schDisplayLabel="XC2" from="Y1.pin3" to="C16.pin1" thickness="0.1mm" maxViaCount={0}
/>
<trace name="RF_CHIP_FEED" schDisplayLabel="RF_CHIP" from="U1.ANT" to="L1.pin1" thickness="0.1mm" maxViaCount={0} />
<trace name="RF_MATCH" schDisplayLabel="RF50" from="L1.pin2" to="C18.pin1" thickness="0.1mm" maxViaCount={0} />
<trace name="RF_MATCH_LINK" schDisplayLabel="RF50" from="C18.pin1" to="R19.pin1" thickness="0.1mm" maxViaCount={0} />
<trace name="ANTENNA_FEED" schDisplayLabel="ANT_FEED" from="R19.pin2" to="ANT1.pin1" thickness="0.1mm" maxViaCount={0} />
<trace name="BATTERY_RETURN" schDisplayLabel="FET_RETURN" from="U9.S2" to="R8.pin1" thickness="0.2mm" />
</>}
{/* Same100k divider reference as before;0201 package already factory-assembled for R23/R24.
Relocated onto existing drive/ADC rails; actual sensing thermistor U_TH2 stays put. */}
<RC0201FR_07100KL name="R20" cadModel={{glbUrl:modelR30}} layer="top" {...mount('R20')}
schX={-4*.58} schY={-4*.58} schSheetName="Protection" schSectionName="SEC_Protection" {...sch('R20')}
connections={{pin1:n('BAT_TEMP_DRIVE'),pin2:n('BAT_TEMP_ADC')}}/>
{rdata.filter(([name])=>!(hasInterlock&&name==='R1')&&name!=='R20').map(([name,resistance,pcbX,pcbY,schX,schY,sheet,a,b])=><resistor key={name}
cadModel={{glbUrl:resistorModel}} name={name} resistance={resistance} footprint="0402" {...supplied(name)} layer="top" {...mount(name)}
schX={schX * 0.58} schY={schY * 0.58} schSheetName={sheet} schSectionName={`SEC_${sheet}`} {...sch(name)} connections={{pin1:n(a),pin2:n(b)}} />)}
{cdata.map(([name,capacitance,pcbX,pcbY,schX,schY,sheet,a,b,footprint])=><capacitor key={name}
cadModel={{glbUrl:name==="C22"?modelC22:footprint==="0603"?cap0603:cap0402}} name={name} capacitance={capacitance} footprint={footprint} {...supplied(name)} {...(["C21","C22","C23","C27","C30","C31","C32"].includes(name)?{footprint:name==="C22"?opticalVrefCap():["C30","C32"].includes(name)?opticalLedCap():opticalCap()}:{} )} layer="top" {...mount(name)}
schX={schX * 0.58} schY={schY * 0.58} schSheetName={sheet} schSectionName={`SEC_${sheet}`} {...sch(name)} connections={{pin1:n(a),pin2:n(b)}} />)}
{pads.filter(([name])=>!["TP8","TP9","TP10","TP11","TP12"].includes(name)).map(([name,pcbX,pcbY,net,sheet,schX,schY,diam])=><testpoint key={name} name={name}
layer={["TP3","TP4","TP5","TP6","TP7"].includes(name)?"bottom":"top"} {...mount(name)} schX={schX * 0.58} schY={schY * 0.58} doNotPlace
schSheetName={sheet} schSectionName={`SEC_${sheet}`} footprintVariant="pad" padShape="circle" padDiameter={1.2}
{...sch(name)} footprint={<footprint><smtpad portHints={["pin1"]} shape="circle" radius={(1.2)/2} noSolderPaste /><courtyardcircle radius={(1.2)/2+.15} /></footprint>} connections={{pin1:n(net)}} />)}
{/* Optional manual bottom service connector; installed only with housing open. */}
{wiredDock&&<FivePinServiceHeader name="JSWD1" layer="bottom" doNotPlace noConnect={[]}
pcbX={-26.2} pcbY={.8} pcbRotation={180} cadModel={undefined}
schSheetName="RingService" schSectionName="BLOCK_RingService" schX={0} schY={3}
connections={{pin1:n('SWDCLK'),pin2:n('SWDIO'),pin3:n('GND'),pin4:n('RESET'),pin5:n('VDD'),pin6:n('GND'),pin7:n('GND')}}/>}
{wiredDock&&<silkscreentext text="DNP 1V8 SWD" pcbX={-26.6} pcbY={2.7} fontSize={.32} layer="bottom"/>}
{wiredDock&&<silkscreentext text="1:C 2:D 3:G 4:R 5:REF" pcbX={-26.6} pcbY={3.3} fontSize={.28} layer="bottom"/>}
{/* Bottom probe access: target1.8V only. Factory stiffener has matching access notches. */}
<silkscreentext text="TP6 REF" pcbX={-43.68} pcbY={2.25} fontSize={.25} layer="bottom"/>
<silkscreentext text="TP3 DIO" pcbX={-41.14} pcbY={2.25} fontSize={.25} layer="bottom"/>
<silkscreentext text="TP7 GND" pcbX={-36.06} pcbY={2.25} fontSize={.25} layer="bottom"/>
<silkscreentext text="TP4 CLK" pcbX={-38.6} pcbY={2.25} fontSize={.25} layer="bottom"/>
<silkscreentext text="TP5 RST" pcbX={-33.52} pcbY={2.25} fontSize={.25} layer="bottom"/>
</group>
</board>
)
}