OK335xS psplash 进度条工作原理 hacking

#!/bin/sh
#
# rc     This file is responsible for starting/stopping
#        services when the runlevel changes.
#
#        Optimization feature:
#        A startup script is _not_ run when the service was
#        running in the previous runlevel and it wasn‘t stopped
#        in the runlevel transition (most Debian services don‘t
#        have K?? links in rc{1,2,3,4,5} )
#
# Author:    Miquel van Smoorenburg <[email protected]>
#        Bruce Perens <[email protected]>
#
# Version:    @(#)rc  2.78  07-Nov-1999  [email protected]
#

# 一. 参考文档:
#     1. inittab脚本启动解析
#         http://blog.chinaunix.net/uid-17188120-id-4073497.html
#     2. Customizing the SDK Splash Screen
#         http://processors.wiki.ti.com/index.php/Customizing_the_SDK_Splash_Screen
#     3. psplash进度条旋转成功
#         http://www.xuebuyuan.com/1511619.html
#
#                                    2016-1-9 深圳 南山平山村 曾剑锋 

##
##
## /etc/default/rcS
##
## Default settings for the scripts in /etc/rcS.d/
##
## For information about these variables see the rcS(5) manual page.
##
## This file belongs to the "initscripts" package.
#
## delete files in /tmp during boot older than x days.
## ‘0‘ means always, -1 or ‘infinite‘ disables the feature
#TMPTIME=0
#
## spawn sulogin during boot, continue normal boot if not used in 30 seconds
#SULOGIN=no
#
## do not allow users to log in until the boot has completed
#DELAYLOGIN=no
#
## assume that the BIOS clock is set to UTC time (recommended)
#UTC=yes
#
## be more verbose during the boot process
#VERBOSE=no
#
## automatically repair filesystems with inconsistencies during boot
#FSCKFIX=no
. /etc/default/rcS
export VERBOSE

# 在rcS中设置的一些环境变量
# PATH=/sbin:/bin:/usr/sbin:/usr/bin
# runlevel=S
# prevlevel=N
# umask 022
# export PATH runlevel prevlevel
#
# exec /etc/init.d/rc S

# 这个函数名可以认为是重置进度条进度
startup_progress() {
    # 当前进度大小=上一次的进度+上每次的进度的变化值
    step=$(($step + $step_change))
    if [ "$num_steps" != "0" ]; then
        # 这里相当于重新计算当前step占进度条的百分比
        progress=$((($step * $progress_size / $num_steps) + $first_step))
    else
        # 直接就是100%了
        progress=$progress_size
    fi
    #echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size"
    #if type psplash-write >/dev/null 2>&1; then
    #    TMPDIR=/mnt/.psplash psplash-write "PROGRESS $progress" || true
    #fi
    # 将上面的progress的值写入fifo中去,echo的值是固定的。
    if [ -e /mnt/.psplash/psplash_fifo ]; then
        echo "PROGRESS $progress" > /mnt/.psplash/psplash_fifo
    fi
}

#
# Start script or program.
#
# 启动脚本函数
startup() {
    # Handle verbosity
    # VERBOSE=no, 不显示这一部分内容
    [ "$VERBOSE" = very ] && echo "INIT: Running [email protected]"

    case "$1" in
        *.sh)
            # Source shell script for speed.
            # 这里相当于直接执行脚本,丢弃了参数
            (
                trap - INT QUIT TSTP
                scriptname=$1
                shift
                . $scriptname
            )
            ;;
        *)
            # 执行参数里命令
            "[email protected]"
            ;;
    esac
    startup_progress
}

# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
# 这里就是捕捉INT QUIT TSTP三个信号,执行“:”,实际就是忽略这三个信号,防止脚本执行时使用ctrl-C 就退出脚本
trap ":" INT QUIT TSTP

# Set onlcr to avoid staircase effect.
# 设置onlcr避免楼梯的效果。
stty onlcr 0>&1

# Now find out what the current and what the previous runlevel are.

runlevel=$RUNLEVEL
#echo "danny add"
echo  $2
sleep 5
# Get first argument. Set new runlevel to this argument.
# 由于传进来的参数的$1=S,所以这里可以断定的是runlevel是S
[ "$1" != "" ] && runlevel=$1
if [ "$runlevel" = "" ]
then
    echo "Usage: $0 <runlevel>" >&2
    exit 1
fi
# 目前没有看到由有关PREVLEVEL相关的内容,这里previous是N
previous=$PREVLEVEL
[ "$previous" = "" ] && previous=N

export runlevel previous

# Is there an rc directory for this new runlevel?
if [ -d /etc/rc$runlevel.d ]
then
    # Find out where in the progress bar the initramfs got to.
    PROGRESS_STATE=0
    #if [ -f /dev/.initramfs/progress_state ]; then
    #    . /dev/.initramfs/progress_state
    #fi

    # Split the remaining portion of the progress bar into thirds
    # 感觉这里可以认为是:已经出了一部分的脚本了,这部分内容也应该算进去
    # 所以给出一部分进度条的空间出来,这样,进度条就不像是从0开始,至少
    # 当我们看到图像的时候,psplash这个进程已经跑起来了。
    progress_size=$(((100 - $PROGRESS_STATE) / 3))

    # 这里的runlevel是S
    case "$runlevel" in
        0|6)
            # Count down from -100 to 0 and use the entire bar
            first_step=-100
            progress_size=100
            step_change=1
            ;;
        S)
            # Begin where the initramfs left off and use 2/3
            # of the remaining space
            first_step=$PROGRESS_STATE
            progress_size=$(($progress_size * 2))  # 剩下2/3
            step_change=1
            ;;
        *)
            # Begin where rcS left off and use the final 1/3 of
            # the space (by leaving progress_size unchanged)
            first_step=$(($progress_size * 2 + $PROGRESS_STATE))
            step_change=1
            ;;
    esac

    num_steps=0
    for s in /etc/rc$runlevel.d/[SK]*; do
        case "${s##/etc/rc$runlevel.d/S??}" in
            gdm|xdm|kdm|reboot|halt)
                break
                ;;
        esac
        num_steps=$(($num_steps + 1))
    done
    step=0

    # First, run the KILL scripts.
    # 先结束掉需要结束的进程
    if [ $previous != N ]
    then
        for i in /etc/rc$runlevel.d/K[0-9][0-9]*
        do
            # Check if the script is there.
            [ ! -f $i ] && continue

            # Stop the service.
            startup $i stop
        done
    fi

    # Now run the START scripts for this runlevel.
    for i in /etc/rc$runlevel.d/S*
    do
        [ ! -f $i ] && continue

        # 这里的previous=N,可以不用关心
        if [ $previous != N ] && [ $previous != S ]
        then
            #
            # Find start script in previous runlevel and
            # stop script in this runlevel.
            #
            suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
            stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
            previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
            #
            # If there is a start script in the previous level
            # and _no_ stop script in this level, we don‘t
            # have to re-start the service.
            #
            [ -f $previous_start ] && [ ! -f $stop ] && continue
        fi
        case "$runlevel" in
            0|6)
                startup $i stop
                ;;
            *)
                startup $i start
                ;;
        esac
    done
fi

#Uncomment to cause psplash to exit manually, otherwise it exits when it sees a VC switch
if [ "x$runlevel" != "xS" ] && [ ! -x /etc/init.d/xserver-nodm ]; then
    . /etc/init.d/qt.sh
#    if type psplash-write >/dev/null 2>&1; then
#        TMPDIR=/mnt/.psplash psplash-write "QUIT" || true
#        umount /mnt/.psplash
#    fi
fi
时间: 2024-10-10 10:04:05

OK335xS psplash 进度条工作原理 hacking的相关文章

小小一方士 C# Async\Await 之 上传/下载文件进度条实现原理

关于上传下载文件(图片等),涉及到UI进度条的显示,c#中 System.IProgress提供了相应的api. namespace System { // // 摘要: // 定义进度更新的提供程序. // // 类型参数: // T: // 进度更新值的类型.此类型参数是逆变.即可以使用指定的类型或派生程度更低的类型.有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变. public interface IProgress<in T> { // // 摘要: // 报告进度更新. //

Andorid自定义圆形渐变色进度条的从实现到开源

信自己也是一种信仰. 写在前面的话 3月初我在自定义控件概述中挖下的几个坑,前一段时间已经基本填完了,自定义控件的几种实现方式也分别写了demo来进行说明.今天我们来聊一聊如何把自己封装一个圆形渐变色进度条控件开源到github,并且上传到jcenter方便别人远程依赖.先看下效果图: 连接github并提交新项目 前提条件: 安装Git客户端(下载地址) 有GitHub账号 创建新项目并提交到Github: 在AndroidStudio中新建一个项目 配置Git:Settings -> Ver

制作进度条(UISlider)

怎样判断是否应当使用进度条 用进度条的主要目的是为了用一根管子的充满程度来直观地表示某种数值的百分比,进度条分为可拖动和不可拖动两种. 可拖动进度条和不可拖动进度条的原理几乎是一模一样,唯一的区别是可拖动进度条上多了一个拖动快和BoxCollider来接收事件,而不可拖动的进度条只能显示一个数字的百分比,无法由玩家去操控. 在判断是否应该使用进度条时,有以下的规律可以遵循: (1)如果某一种值,它有最大值,需要表达它当前的值的占比,这个时候用进度条会非常直观.此时应当用不可拖动的进度条.例如:角

android 14 进度条和拖动条

进度条: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ProgressBar 默认进度条 andr

我的进度条

我的进度条 工作项目 预定本周完成进度 实际完成进度 博客量 学到的知识 四则运算1.1版 六个功能模块,界面友好 全部完成 3篇中等篇幅, 总体来说学到了 chrome的代码调试 ,javascript的数据类型

使用NGUI制作进度条(血条/蓝条)

制作血条和蓝条,原理都是一样的,下面创建一个可以复用的进度条. 第一步,搭建基本的UI显示界面,使用NGUI(没有插件的童鞋可以看我上一遍文章 )创建一个基本的进度条界面. 选中UIRoot,在Scene视图中,创建一个Sprite,重命名为NumberBar,为其选择图集和精灵,修改其大小到合适位置(256* 32).在其上右键,Attach一个Box Collider,然后再右键Attach一个Slider Script.我们会看到Slider组件会有些参数,我们会在稍后解释. 选中刚创建的

ASP.NET技巧:教你制做Web实时进度条

网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个Session,当任务进行到不同的阶段改变Session的值,线程开始的同时使用 ShowModalDialog打开一个进度条窗口,不断刷新这个窗口获取Session值,反应出实时的进度.下面就来看看具体的代码:(文章结尾处下 载源代码) 先新建一个Default.aspx页面,客户端代码: <b

第七章 文本进度条的实现

文本进度条 大家都见过程加载的时候的文本进度条 进度条的原理是什么呢? 1.采用字符串方式打印可以动态变化的文本进度条 2.进度条需要能在一行中逐渐变化 问题分析: 如何获取一个文本进度条的变化时间呢? 1.采用sleep()模拟一个持续的进度 2.似乎不那么难 简单的开始: 1 #TextProBarV1.py 2 import time 3 scale = 10 4 print("------执行开始------") 5 for i in range(scale+1): 6 a =

atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传,避免一次使用内存使用过大的 2 2. Uuid还是原来文件名称:: 2 3. 监听器频繁地被调用 2 4. 结合wz easyui 2 4. 选型 2 5. Uploadify::yash js+flash 3 6. commons-fileupload:: 3 7. COS这个工具O'Reilly公司 3 8. 大的文件上传组件总结 3 5. 林吧实现ui Ajax+jq