function detectDevices()

in libs/core/input.ts [285:360]


    function detectDevices() {
        control.dmesg(`detect devices (hash ${hashDevices()})`)
        const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
        let numChanged = 0;
        const uartSensors: SensorInfo[] = [];

        for (const sensorInfo of sensorInfos) {
            const newConn = conns[sensorInfo.port]
            if (newConn == sensorInfo.connType
                && sensorInfo.sensor
                && sensorInfo.sensor.isActive()) {
                if (newConn == DAL.CONN_INPUT_UART)
                    uartSensors.push(sensorInfo);
                continue;
            }
            numChanged++
            sensorInfo.connType = newConn
            sensorInfo.devType = DAL.DEVICE_TYPE_NONE
            if (newConn == DAL.CONN_INPUT_UART) {
                control.dmesg(`new UART connection at ${sensorInfo.port}`)
                updateUartMode(sensorInfo.port, 0);
                uartSensors.push(sensorInfo);
            } else if (newConn == DAL.CONN_NXT_IIC) {
                control.dmesg(`new IIC connection at ${sensorInfo.port}`)
                sensorInfo.devType = DAL.DEVICE_TYPE_IIC_UNKNOWN
                sensorInfo.iicid = readIICID(sensorInfo.port)
                control.dmesg(`IIC ID ${sensorInfo.iicid.length}`)
            } else if (newConn == DAL.CONN_INPUT_DUMB) {
                control.dmesg(`new DUMB connection at ${sensorInfo.port}`)
                // TODO? for now assume touch
                sensorInfo.devType = DAL.DEVICE_TYPE_TOUCH
            } else if (newConn == DAL.CONN_NONE || newConn == 0) {
                //control.dmesg(`disconnect at port ${sensorInfo.port}`)
            } else {
                control.dmesg(`unknown connection type: ${newConn} at ${sensorInfo.port}`)
            }
        }

        if (uartSensors.length > 0) {
            setUartModes();
            for (const sensorInfo of uartSensors) {
                let uinfo = readUartInfo(sensorInfo.port, 0)
                sensorInfo.devType = uinfo[TypesOff.Type]
                const mode = uinfo[TypesOff.Mode];
                control.dmesg(`UART type ${sensorInfo.devType} mode ${mode}`)
            }
        }

        if (numChanged == 0 && nonActivated == 0)
            return

        //control.dmesg(`updating sensor status`)
        nonActivated = 0;
        for (const sensorInfo of sensorInfos) {
            if (sensorInfo.devType == DAL.DEVICE_TYPE_IIC_UNKNOWN) {
                sensorInfo.sensor = sensorInfo.sensors.filter(s => s._IICId() == sensorInfo.iicid)[0]
                if (!sensorInfo.sensor) {
                    control.dmesg(`sensor not found for iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
                    nonActivated++;
                } else {
                    control.dmesg(`sensor connected iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
                    sensorInfo.sensor._activated()
                }
            } else if (sensorInfo.devType != DAL.DEVICE_TYPE_NONE) {
                sensorInfo.sensor = sensorInfo.sensors.filter(s => s._deviceType() == sensorInfo.devType)[0]
                if (!sensorInfo.sensor) {
                    control.dmesg(`sensor not found for type=${sensorInfo.devType} at ${sensorInfo.port}`)
                    nonActivated++;
                } else {
                    control.dmesg(`sensor connected type=${sensorInfo.devType} at ${sensorInfo.port}`)
                    sensorInfo.sensor._activated()
                }
            }
        }
        //control.dmesg(`detect devices done`)
    }