一系列介绍BLE 规范的好文,对于了解BLE的整体概念非常有帮助。当然要想深入理解,还是要读原汁原味的Spec,让你苦思冥想,在谜团中寻找自己需要的东西,才更有收获。
我跑,故我在
村上春树是一个多产的作家,我只看过一本《当我谈跑步时,我谈些什么》。
村上也是个跑步专家,每年夏天参加铁人三项,冬天参加马拉松。
谈到为啥选择跑步时,他认为就是自己喜欢,自己没有兄弟姐妹,对于对抗性的以及与人合作的运动项目不喜欢,所以他选择了跑步,跑步是与自己对话的过程,小说的很多写作方法也是跑步的时候想出来的。
他写的跑一百公里超级马拉松时候的感觉,特别的细腻。
- 就这样,我坚持又坚持,总算跑了下来。当我跑到七十五公里处,感觉似乎又什么东西攸地出窍了。除了“出窍”一词,我想不出还有什么好的表达。简直就像穿透了石壁一般,身体一下子钻了过去,来到了另外一面。
- 如此长时间地不停奔跑,不可能感觉不到肉体上的苦楚。但到了这个时候,疲劳已不是什么重大问题。这也许意味着疲劳作为一种常态,被身体自然而然地接纳了。一度沸沸扬扬的肌肉革命议会似乎也灰心丧气,不再逐一倾诉不满。已经无人敲桌子,无人扔杯子了。它们将这疲劳作为历史的必然,作为革命的成果,默默无言地接受下来。我便自动地、只管有规律地前后甩动手臂,将双腿一步一步向前递出去。什么都不思,什么都不想。待回过神来,连肉体的苦楚都似乎销声匿迹,或像因故无法处理的难看家具,被扔到了毫不起眼的角落。
- 我陷入了类似自动驾驶的状态。这么继续跑下去,只怕过了一百公里我还能跑。听上去颇有些怪异:跑到最后,不仅是肉体的苦痛,甚至连自己到底是谁、此刻在干什么之类,都已经从脑海中消失殆尽。这理当是十分可笑的心情,可是我连这份可笑都无法感受到了。这这里,跑步几乎达到了形而上学的领域。仿佛先有了行为,然后附带性地才有了我的存在。我跑,故我在。
- 在我的周遭,许多人只是默默向着终点奔去。身处其中,我拥抱着异常静谧的幸福感。吸气,再吐气,听不出呼吸中攸丝毫紊乱。空气非常平静地进入身体,再走出体外。我那寡言的心脏按照一定的速度重复着舒张与收缩,我的肺好像好似勤劳的风箱,规规矩矩将新鲜氧气摄入体内。我能够目睹它们工作的身影,听见它们发出的声响。一切都顺畅无误地运站着。沿途的人们对这我们大声呼唤“加油啊,马上就到终点站了“声音像透明的风,穿透我的身体逝去。我感觉人们的声音就这般穿透而过,直达身体的另一面。
- 我是我,又不是我。这是一种异常沉稳而寂静的心情
如何聪明的睡觉
本文要点摘自 《斯坦福睡眠法》《如何聪明的睡觉》。
睡眠占据了我们人生的1/3,而这1/3又决定了另外的2/3,所以睡个好觉是非常重要的。睡不好会导致一大堆心理和生理上的问题:焦虑、抑郁、长不高、肥胖等等。
入睡后,整个睡眠过程会经过好几个周期,每个周期大约90分钟,尽量不要打断这些周期。这些周期分为非REM和REM,REM时快速眼动的意思,顾名思义就是眼球在运动的睡眠。
- 非REM是深睡眠,这个时候如果被迫醒来的话,人会很懵,所以尽量避免这个时候醒来。这个时候做的梦多是抽象的,不符合逻辑的。
- REM 是浅睡眠,这个时候大脑时在活跃状态。这个时候的梦多是故事性的,接近于真实体验。
- 睡梦是人白天的情感的流露。
- 睡梦中大脑会整理记忆,把海马体的东西整理后搬到皮质层永久记忆。
- 梦中大脑可以把不好的记忆消除掉,前提是在梦中梦到这个不好的事情。
- 梦中可以继续思考,甚至有的人真可以预测未来。
第一个深睡眠周期比较长是非常重要的,决定了整个睡眠的质量。如果要熬夜的话,最好先睡完这个周期再去熬夜。
如何提高睡觉的效率:
- 卧室要黑,做到伸手不见五指。
- 睡觉前1个半小时不要接触电子产品
蓝光会影响褪黑激素的分泌
- 10点到11点是身体分泌褪黑激素的时间,这个时候必须尽快睡觉。
- 晚上大概有4~6个睡眠周期,每个周期是1个半小时,最好不要打断这些周期。
- 平时多晒太阳
- 用脚踩土地,吸收负电子。
- 坚持每天同一时间入睡,同一时间起床。
- 睡前一个小时沐浴或泡脚,利于身体降温
真正主导能量释放的是表面积较大且毛细血管丰富的手脚部位。
体温降下来才容易入睡,入睡时的体温比醒着时低2度,只有体温降下来了才容易入睡。
午休最好不要超过30分钟。
如何清醒
- 早上定两个相隔20分钟闹钟,闹钟时间最好在REM结束的时间,第一个闹钟声音轻柔些。
- 使劲儿细嚼慢咽有助于清醒。
- 开会时打瞌睡的话,就尽量主动发言提问。
- 午饭少吃,少吃淀粉含量高的食物,比较容易保持清醒。
给新任软件工程师的建议
- Run a marathon, not a sprint.
工作是一场马拉松,不是短跑。
- Be humble, not stupid.
保持谦逊,但别笨(并不是所有其他人都比你好)。
- Compare with yourself, not others.
跟自己比,不是别人。
- Respect people, not titles.
尊重人,而不是尊重头衔。
- Choose the challenge, not comfort.
迎接挑战,而不是固守舒坦。
- Jump on the whiteboard, not on the keyboard.
工作从白板开始,不是键盘。
- Deliver value, not code.
产出价值,不是代码。
nimble on ESP32
从好友Yufeng那里得知Nimble有在ESP32上落地,刚好手头有一片ESP-WRCOM-32,手痒痒就download了一份ESP32的IDF 玩下。
Getting Start 写的真心不错,简单明了,照着操作步骤一步一步跑就能跑起来Nimble的example project。不过ESP32只用了Nimble的Host,没有用Controller的部分,毕竟ESP32是Combo chip,Nimble Controller Scheduler没有考虑过Wifi的部分。
- ESP32文档很很赞,花了大力气做宣传,内容挺丰富,也很正规,YouTube也有很多教学视频。
- 还挺开放,放了不少源码出来,包括ble mesh等。
- 不知道为啥没有自己的Host,之前用bluedroid,footprint没啥优势。
1 | I (0) cpu_start: App cpu up. |
如何寻找一份适合你的职业
一篇有深度的好文How to Pick a Career,大约需要6小时读完。
作者Tim Urban以写长博客著称,讲话很幽默,这里有一个他在TED的关于拖延症的讲座,可以一睹他的真容,挺接地气的一个小伙。
先甩个锅
先声明的是这篇文章只算是一个路标,我们是路人,到底要不要按照路标去走,纯粹是个人的事情。
这个是混沌大学李善友老师用来给自己甩锅的一句话,哈哈。
李老师总是想给别人一些指导,压力巨大,怕给人指错了,后来他就用这个路标和路人的关系给自己甩锅。
做自己人生的CEO,为自己负责
我们生下来后就象是弱弱的小蝌蚪被放在既定好的河流上漂流(见下图),这个河流我们是没办法选的(就是说投胎投到哪儿没办法选),这个时候有父母师长管理我们的成长,做我们的CEO;但是到大学一毕业,我们两眼抹黑,啥也不会(skill-less and knowledge-less and a lot of other things-less),突然间要做我们自己人生的CEO,真的很难。这篇文章介绍了一个寻找真我(your real self),寻找适合自己工作的一个方法论(framework)。
- 我们中的有些人会发现自己是一只可爱的小狗,它最想做的事儿就是取悦它的主人,不能忍受主人对它的失望,很悲惨的是这个主人往往不是它自己,是那些心理上比你强大的人,如果你不小心,你几十年的的职业生涯只是去取悦他们使他们骄傲。这个他们很可能是你的父母。
- 作者回顾了一下自己的经历,觉得最让他烦恼的是:其他人掌控你的思想,压制了真实的你的声音。
“未来我的目标不是不犯错误,而是只犯我自己犯的错误”。
人的一生中真正做有意义事情的时间真的很少,所以请认真选择自己的工作
工作大致上可以比作两类:大厨(Chef)和厨子(cook)
- 大厨的思维:用各种食材、经历各种尝试,弄出一盘菜。
大厨要付出非常多的时间和精力,就像是带着眼罩,在一个诡异的森林里寻找出路,要经历非常多的失败、尝试。
做大厨大多数情况下非常耗时间,所以机会成本也高。 - 厨子的思维:照着大厨给的配方直接炒菜就好了,比较轻松,不用动太多脑子。适合不把工作当回事儿的人。
人的一生总共750000小时(=750000/24/365=85.6年,可能是美国人的平均寿命),那么这么多万个小时都是怎么度过的呢?
- 童年+青春期有 175000小时(=175000/24/365=20年)
- 吃喝玩乐+睡觉 325000小时(37年)
- 还剩下250000个小时(28.5年)是可以去做有意义的事情,其中20%~60%用在工作上,约50000到150000个小时,就是6年到17年的时间。
而你的工作时间又会极大的影响你的生活,你的影响力,你对自己的身份认同,所以一定要慎重选择自己的工作,别到老了才后悔(象苏大强那样儿)。
苏大强有个账本,记录了三个娃每个人从小到大的花销,在妻子去世后,他就靠这个账本跟孩子们要钱过活,过的相当滋润。
那么如何选择一份职业呢?
先看这个文尼图,用Want Box来记录你能想到的你想做的所有职业,用Reality Box来记录那些根据你潜力你应该能从事的职业,那么这两个Box的交集就是你要的职业,你要努力的方向。中间交集的地方每个点代表一份职业,这些个点还带个小箭头,如果你从事的很多份职业的方向是大致一致的,那么你就不得了,越积累越厉害。
先来看下如何填 Want Box
这个章鱼图,从5个纬度来把职业做了大致分类,你可以根据你自己的爱好,把你自己想做的职业分布到这几个维度里。
- Personal: 自我实现型
职业是为了自我实现,彰显个性,体现自我。那些很成功,但是不开心的人,往往会认为自己的成功是错误的。
很多人迫于生计或是其他原因从事的是其他几个类型的职业,过了很多年才发现不是自己所要的。 - Social: 社会型
这类职业是比较有社会地位那种:医生,律师,公务员。
这种职业是我们最基本的,动物性一面的体现,可以追溯到我们祖先的部落生活,在部落里要想生存,就得合群,相互照应,最好能有权力,掌握资源,给自己多分几口肉吃。 - Moral: 道德型
比如你一想到很多非洲儿童食不果腹,衣不蔽体,你就吃不下饭,你觉得自己是个好人,应该做点啥。
这类职业比如很多NGO组织,临终关怀组织等等。 - Practical: 实在型
工作就是为了买房买车,为了赡养家人,无他。
- Lifestyle: 安逸型
就是希望压力能少点,能有足够的自由时间可以让自己去吃喝玩乐。
但这又很矛盾,你当下轻松了,可能长远的看并不轻松,只是把问题留到了将来。
可能你想做的工作不是在一个种类里,那也正常,证明你有多面性,而且可能不同年龄段想做的职业也不一样。
下一步就是分析下到底哪些是真实的你想做的事情
你想做某个职业的想法,可能是其他人安插到你大脑里的(可能是父母,或是你看的某本书里的一个英雄)。这个一定要分析得透彻,非常重要,甚至你自己都挖不出来真实的你在想什么,可能被打压的过分,隐藏的太深了。
确定好你要做的职业后,就按照优先级排下序。
作者用一个书架来比喻,在书架上面放了一个碗,这里面装的是最高优先级的,书架里三个格子,从上到下优先级逐级降低,旁边是个垃圾桶。
- NN Bowl:这块是你认为最重要的,你愿意投入足够的时间、牺牲掉所有其它欲望去做的职业。这个碗很小,你最好只放一个东西在里面。
世界上很多牛人在某一方面做到最强,都是在内心中的NN bowl非常强烈,当然代价也很大,要牺牲的可能是朋友家人关系,甚至是自己的健康。
再来看下Reality Box
你要根据你了解的世界和你的潜力做一个评估,评估根据你的潜力去实现在某个职业中的成功所需要的难度。
- 潜力就是如果你有足够的时间,你在该职业内能做到足够好达到职业或行业内的成功吗?
下图中A代表你目前所处的位置,星表示成功点,他们之间的距离就是实现成功的难度。 - 要注意的是“星”并不单纯指的是技术修炼到最好,指的是在整个行业内玩的好。
— 比如你想做个好莱坞影星,并不是说你的演技跟摩根弗里曼一样好就行的,你需要有机会去有权力的人那里去表现获得赏识,你需要谦逊和有足够的耐力一直坚持等等,才能有可能成为一线影星。
如果你是个学计算机的学生,你的梦想是成为google公司的一个软件工程师,那难度可能不大。
如果你想弄个新google出来,那难度可能就非常大了
那么如何计算你达到“星”的机会呢,请看下面这个公式
Progress = Pace x Persistence.
机会 = 步长 * 坚持
步长
- 你做为大厨思维有多少决定了你进步有多快
工作就像个复杂的游戏,基本上每个人开头都很难,而大厨可以根据下图所示迅速进展。
- 你的工作精神
一周工作60小时,一年工作50周的人要比一周工作20小时,一年工作40周的人进展快。
选择工作生活平衡的人,要比一根筋儿的工作狂(workaholic)进展慢。
经常中断工作做白日梦或玩手机的人要比能集中精力工作的人进展慢。 - 你的天赋
在职业相关的领域有天赋的,进展更快。
比如你的职业是社会型的,那如果自己在人际关系处理上有天赋,对建立深入的社会关系有心得,那就做起来得心应手。
坚持
工作时马拉松,不是短跑。不只是几年的投入,可能要几十年。
那么接下来就开始填写你的Reality Box吧,总结起来是5个方面:
1) 尽力去了解整个职业的全貌,比如之前的例子,相当好莱坞影星,不仅仅是要演技好,还有其他方面要补,比如要认识哪些大佬,自己平时是不是要穿的拉风点。
2) 职业平台有多大?规则有哪些?
3) 评估你目前所处的位置,你掌握的技能,跟该职业是否有关系?
4) 你要做到在该职业内的成功是什么样儿?
5)评估你的步长。根据你现在的能力,你预计能跑多快。
你想去google当工程师,那你是不是先花4年读个计算机学位?还是你觉得自学要比去学校更快?
6)你愿意投入多少时间在这份职业上,是三年五年,还是10年
经过一番深入分析,你的optional pool里应该有了新的小圆点。
有些自我感觉良好的人可能经过这么一轮分析,觉得自己跌落神坛了,但是没关系,这轮分析至少可以让你对自己的职业选择做个聚焦。
那么接下来,你该在你的optional pool里选一个职业了,这个确实很难决定。
你可能会认为职业是需要40年的坚持的,直到退休,如下图。不过这个只是个传统的想法。
- 根据调查,现在的年轻人从事一份职业的平均时间是3年,年长一点的人的这个时间平均是10.4年。
- 如果你一定要这样看的话,你可能会有身份危机,不知道自己现在以及几十年后变成什么样子。
- 而且你可能不敢去换工作,即使是你的内心真的想这么做。
你应该把你的职业想象成一些列连起来的点
- 这些个点就象是在做科学实验,一步步逼近你要的东西。
关于坚持,不得不注意下,如果在一个错误的职业上坚持意义也不大,如果过早的退出一份职业也不是好事儿。
- 下图中最左端穿水泥鞋子的人,不敢换工作,在一个错误的职业得过且过。
- 最右端鞋子长羽毛的人换职业又太快。
据心理学家研究,人之将死的时候一般都会对自己的惰性有点遗憾“我希望我能早点退出”,“不要作自己不喜欢的工作”
最后你应该是如下图的一个状态,随着你认知的不断升级,你可能会不断发现自己喜欢的职业,并不断优化自己,直到达到自己心目中的成功。
人类群星闪耀时
1815年,拿破仑与威灵顿的军队在滑铁卢恶战几小时,已经到了关键时刻,被拿破仑命令追杀普鲁士部队的格鲁希元帅墨守成规,否决了副手热拉尔力求尽快支援拿破仑的请求,特鲁西决定继续被动等拿破仑的通知,最后导致拿破仑惨败。他不知道这一秒的决定彻底改变了拿破仑的命运,改变了人类历史。
那关键的一秒就这样进行了可怕的报复。在尘世的生活中,这样的一瞬间时很少降临的。当它无意之中降临到一个人身上时,他却不知掉如何利用它。在命运降临的伟大瞬间,市民的一切美德—小心、顺从、勤勉、谨慎、都无济于事,它始终只对天才人物提出要求,并且将他造就成不朽的形象。命运鄙视地把畏首畏尾的人拒之门外。命运—这世上的另一位神灵,只愿意用热烈的双臂把勇敢者高高举起,送上英雄们的天堂。
有时候—这是世界历史上最令人惊奇的时刻—命运之线会在某个瞬间掌握在一个窝囊废手中。英雄们的世界游戏象一阵风暴似的也把那些平庸之辈卷了进来。但是当重任突然降临到它们身上时,它们与其说感到庆幸,毋宁说感到害怕。他们几乎都是哆哆嗦嗦地把跑过来的命运又重新从手中放开。
《你当像鸟飞向你的山》
英文书名是《Educated》,翻译成中文后的书名搞的好复杂,看得出译者在非常努力的想表达这本书的内涵。
塔拉•韦斯特弗出生在美国爱达荷州山区的一个农民家庭,这本书是她的自传,记录了自己从一个乡村小姑娘成长为剑桥博士的心路历程。
作者
书中出场的所有重要角色主要为她的家庭成员,塔拉兄妹共8人:6个哥哥,1个姐姐。对整个家庭影响最大的就是父亲和哥哥肖恩。父亲独断专横,哥哥家暴,习惯性的殴打妹妹们,给小塔拉造成了极大的不安,塔拉在外出求学初期,几乎无法信任别人,过了很长时间才知道接受别人的帮助是正确的,之后她的人生就开挂了。塔拉最终通过教育重塑了自己,远离了家庭。在与家庭割裂的过程中,塔拉的心灵多次受到重创,深患抑郁症。她最终成为剑桥博士,而这个时候她已经完全回不去山区的老家了。
塔拉在自我觉醒的那刻写了这么段话来表明自己家庭的原罪:我已察觉出我们是如何被别人给予我们的传统塑造,而这个传统我们有意无意的忽略了。
Nimble Advertising Start time计算
参考文献:
在start advertising的时候,从Host角度看非常的简单,只是通过如下API送几个参数给Controller,然后等着event回来做相应的处理就好了,而Controller则要考虑很多细节来找到比较合适的真正的开始发送Adv data的时间,本文介绍下Nimble计算这个时间的一个流程。1
2
3
4
5int
ble_gap_adv_start(uint8_t own_addr_type, const ble_addr_t *direct_addr,
int32_t duration_ms,
const struct ble_gap_adv_params *adv_params,
ble_gap_event_fn *cb, void *cb_arg)
以下图为参考,总结下Nimbble controller处理adv start time的几个步骤:
图中横轴为时间,每个小格子为一个tick,30.5us。为了便于理解,假定Controller在收到Host的请求,执行到函数ble_ll_adv_sm_start() 开始计算Adv的start time时,tick刚好为100,后续的各个关键步骤以及相关的时间点如下:
- 依照Spec,一般会在Adv开始点加一个随机的AdvDelay(小于10ms)以避免adv event与Scan window 完美错开,导致对方怎么扫都扫不到。图中假定这个AdvDelay是15个tick,也就是adv_pdu_start_time 是115。
启动Radio开始发送数据,需要考虑Radio的settling time,以及为Radio准备要发送的数据耗费的时间,所以要想在115时把数据真正的发送出去,就要提前开始行动,这个提前开始行动的时间在nimble中定义如下:
1
2
3
4
5
6/*
* This is the offset from the start of the scheduled item until the actual
* tx/rx should occur, in ticks. We also "round up" to the nearest tick.
*/
g_ble_ll_sched_offset_ticks =
(uint8_t) os_cputime_usecs_to_ticks(XCVR_TX_SCHED_DELAY_USECS + 30);g_ble_ll_sched_offset_ticks,在不同的chip上是不同的,
- nRF51是 370us ,其中140us为Radio的settling time,230us为给Radio准备数据的时间。
- nRF52系列是 193us ,其中40us为Radio的settling time,153为给Radio准备数据的时间。
所以对于nRF51来说,这个offset ticks为 (370+30)/30.5 = 13 tick 。115提前13个tick,start_time就是102。
接着将这个预期的的start_time通过函数
1
ble_ll_sched_adv_new()
送给scheduler去确定是否能在这个时间点正式开始。假如很幸运,这个adv的sched没有跟已有的sched overlap,那就直接到到第#6步。
- 如果第#4步中有发现该sched跟其他的sched有overlap,那这个start time就只能由Scheduler来找个合适的位置了,假定找到的位置是122。
- 在122正式开始发送数据,由#2知,真正能开始发送数据的时间时g_ble_ll_sched_offset_ticks后,即13个tick后,也就是135才是Radio真正开始发送PDU的时候。
- 而要在135发送数据,就要提前140us(nRF51) 就把Radio开启,以保证在135时Radio能正常工作。这个工作主要是在如下这个函数执行。
1
ble_phy_set_start_time(uint32_t cputime, uint8_t rem_usecs)
函数使用RTC0和TIMER0两个定时器来定时完成,TIMER0时由1M clock驱动,精准度为1us。如下这段函数将精准表示Radio开启时间点(绿色旗帜),先用RTC0来定位到蓝色旗帜时间点最近的tick(cputime),之后用TIMER0来定位从这个tick开始再过多少个us到达蓝色旗帜的位置,要启动Radio。
1
2
3
4
5
6
7if (rem_usecs <= 18) {
cputime -= 5;
rem_usecs += 12;
} else {
cputime -= 4;
rem_usecs -= 18;
}后面这段是设定好RTC0 和TIMER0后再启动RTC0 和 TIMER0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25next_cc = cputime & 0xffffff;
cur_cc = NRF_RTC0->CC[0];
cntr = NRF_RTC0->COUNTER;
delta = (cur_cc - cntr) & 0xffffff;
if ((delta <= 3) && (delta != 0)) {
return -1;
}
delta = (next_cc - cntr) & 0xffffff;
if ((delta & 0x800000) || (delta < 3)) {
return -1;
}
/* Clear and set TIMER0 to fire off at proper time */
NRF_TIMER0->TASKS_CLEAR = 1;
NRF_TIMER0->CC[0] = rem_usecs;
NRF_TIMER0->EVENTS_COMPARE[0] = 0;
/* Set RTC compare to start TIMER0 */
NRF_RTC0->EVENTS_COMPARE[0] = 0;
NRF_RTC0->CC[0] = next_cc;
NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;
/* Enable PPI */
NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk;对于Nordic的系列chip,PPI(Programmable peripheral interconnect)得一定了解下,具体可参考Nordic的Datasheet。PPI是一种不通过CPU就可以让Periphral之间相互通信的一套机制,由一个16M的clock来驱动,如下图,可以通过config,将PPI的Channel m的EEP(Event End Point)和另外一个Channel n的TEP(Task End Point)建立联系,这样Channel m就与Channel n建立联系了。
对于上面一段code segment,RTC0,TIMER0及RADIO之间的关系是通过下面这段内置的config来建立的。 NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk 将Channel 31 enable,所以RTC0在COMPARE_EVENT[0]被trigger的时候就启动TIMER0,而TIMER0的COMPARE_EVENT[0]被trigger的时候,RADIO的TX就Enable了。
nimble Link layer 状态机
Link Layer总共有7个状态,这7个状态串起了整个Link layer的运作。
1 | #define BLE_LL_STATE_STANDBY (0) |
stateDiagram [*] --> STANDBY : reset STANDBY --> ADV STANDBY --> SCANNING STANDBY --> SYNC ADV --> STANDBY ADV --> SYNC ADV --> CONNECTION SCANNING --> STANDBY SCANNING --> INITIATING SCANNING --> SYNC INITIATING --> CONNECTION INITIATING --> STANDBY CONNECTION --> STANDBY CONNECTION --> DTM CONNECTION --> SYNC DTM --> STANDBY SYNC --> STANDBY