#
# Copyright (C) 2018 The Android Open-Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

on init
    chmod 666 /dev/diag

on post-fs-data
    # Modem logging collection
    mkdir /data/vendor/radio 0777 radio radio
    mkdir /data/vendor/radio/diag_logs 0777 system system
    rm /data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl
    # WLAN logging collection
    mkdir /data/vendor/wifi 0777 system system
    mkdir /data/vendor/wifi/cnss_diag 0777 system system

service diag_mdlog_start /vendor/bin/diag_mdlog
    class late_start
    user shell
    group system diag media_rw
    socket diag_router stream 0666 system system
    disabled
    oneshot

service diag_mdlog_stop /vendor/bin/diag_mdlog -k
    class late_start
    user shell
    group system diag media_rw
    disabled
    oneshot

on boot && property:persist.vendor.sys.modem.diag.mdlog=*
    rm /data/vendor/radio/diag_logs/diag_mdlog_pid
    setprop vendor.sys.modem.diag.mdlog ${persist.vendor.sys.modem.diag.mdlog}

on property:vendor.sys.modem.diag.mdlog=true
    start diag_mdlog_start

on property:vendor.sys.modem.diag.mdlog=false
    start diag_mdlog_stop

on property:persist.vendor.sys.cnss.diag_qxdm=true
    start vendor.cnss_diag

on property:persist.vendor.sys.cnss.diag_qxdm=false
    stop vendor.cnss_diag

on property:persist.vendor.sys.cnss.diag_txt=true
    start vendor.cnss_diag_txt

on property:persist.vendor.sys.cnss.diag_txt=false
    stop vendor.cnss_diag_txt

service vendor.cnss_diag /vendor/bin/cnss_diag -q -u -w
    class late_start
    user system
    group system
    disabled
    oneshot

service vendor.cnss_diag_txt /vendor/bin/cnss_diag -s -f -P -m /data/vendor/wifi/cnss_diag/cnss_diag.conf -t HELIUM
    class late_start
    user system
    group system
    disabled
    oneshot

on property:vendor.debug.ramdump.force_crash=true
    write /proc/sysrq-trigger "c"

on property:ro.vendor.bluetooth.ftm_enabled=true
    start ftmd

service ftmd /vendor/bin/ftmdaemon
    class late_start
    user root
    group bluetooth net_bt_admin misc diag net_bt
    disabled
    oneshot

on property:vendor.sys.logger.bluetooth=true
   setprop persist.vendor.service.bdroid.snooplog true
   setprop persist.vendor.service.bdroid.fwsnoop true

on property:vendor.sys.logger.bluetooth=false
   setprop persist.vendor.service.bdroid.snooplog false
   setprop persist.vendor.service.bdroid.fwsnoop false

on property:persist.bluetooth.btsnoopenable=true
   setprop persist.vendor.service.bdroid.soclog true

on property:persist.bluetooth.btsnoopenable=false
   setprop persist.vendor.service.bdroid.soclog false

on property:vendor.usb.config=*
   start usbd

on property:persist.vendor.usb.usbradio.config=*
   start usbd
