Coder Social home page Coder Social logo

mx2's Introduction

MX2

mx2's People

Contributors

resetzero avatar savent404 avatar

Stargazers

 avatar

Watchers

 avatar  avatar

mx2's Issues

Accent功能追加

功能说明

描述

  • 文件路径

    0:\bank*\Accent\目录下
    Standby.txt
    On.txt
    Lockup.txt
    Clash.txt

  • 控制文件位置如备注,若未读取到相关文件,则表示不执行

  • USR_CFG内需增加参数AccentLED=(0~8),用于设置可控LED的个数

  • USR_CFG内需增加参数LEDMASK, 用于设置哪些LED可以工作

    • 参数用16进制表示,每一位代表一个LED。
    • 16进制值的最低位对应LED1
    • 16进制->2进制后,每个1代表允许工作,0代表不工作
    • 实例: LEDMASK=0x000F //(LED 1~4工作, 其余不工作)
  • 每个文件的单行周期T均可独立设置,亮灭控制最大256行

    • 为了兼容UTF-8 with BOM or UTF-8 without BOM, 文件第一行空行或写上注释文字

Standby

待机状态下的小灯动作,若状态无变化则循环执行

On

开机状态下的小灯动作,若状态无变化则循环执行

Lockup

当'TriggerE'触发时同步执行,执行长同lockup(TriggerE),退回On时可抛弃未执行部分

Clash

当'TriggerC'触发时同步执行,执行结束后返回On

NGLSC

支持新的硬件“NGLSC”

  • 将目前软件混音的方案改为输出两路音频信号由硬件实现混音
  • 增加8M外部晶振

新的文件结构

  • 2字节Ascii码表示的两位数字,表示有效负载的字节偏移量
  • 有效负载之前为类似json键值对的配置信息

重写的结构

  • LED.c->mx-led.c,负责处理消息后调用函数指针,PWM-led, NEO-led分别为两个硬件不同的两套操作函数

NeoPixel

功能描述

支持neopixel器件

功能

驱动

使用SPI接口DMA方式输出

调用Demo

#include "neopixel.h"
uint8_t color[] = 
{
  0xFF, 0x00, 0x00,
  0x00, 0xFF, 0x00,
  0x00, 0x00, 0xFF,
};
NP_Handle_t neopixel;
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
  if (hspi->Instance == SPI1)
  {
    NP_DMA_CallbackHandle(&neopixel);
  }
}

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();

  neopixel.TransmitHandle = &hspi1;
  neopixel.MaxPixelInDMABuffer = 2;
  if (!NP_Init(&neopixel)) {
    while (1)
      ;
  }
  NP_Update(&neopixel, color, 3);

  while (1)
  {

  }

}

存在的问题

一帧数据不可 利用DMA中断利用较小的Buffer传送分多次传送完成。原因是DMA中断会有10us左右的延时,而Neopixel每位数据为2us左右,分多次传输会导致每次间隔处的led会有预计外的绿色分量
目前的解决方法是开很大的Buffer一次DMA传输完成,但将导致内存不足的问题
每一个neopixel将使用24x8 = 192字节,大量neopixel将无法分配如此大的内存空间

  • 解决办法:使用循环DMA传送模式, DMA不经过CPU操作循环发送Buffer中的内容,且一次DMA传输分为两个中断(传输一半时-Half Cplt、传输完毕时 Trans Cplt), 可以收到Half Cplt后更新buffer前一半的数据, 收到Trans Cplt后更新Buffer后半段内容,而不会造成上述DMA中断会有10us延时的问题。
    目前循环Buffer需要有很长的neopixel才可以测试,直接逻辑分析仪查看大量数据查找10us延时问题不太实际

降低保存trigger文件路径的内存开销

目前统一为每个文件路径分配30bytes大小空间
希望修改为为按需分配,并给予字节偏移量信息方便迅速查找

方案分析

现有的保存方式

目前USR_config.c中使用固定分配30字节的方式以满足最大文件长度的需求,但是普遍的文件名小于该长度

改进方案

struct {
  TCHAR **ppcPath; //指向每一个文件名的地址,加速文件名的访问
  TCHAR *pcTriggerName; //保存字符串数组,一个文件名结尾以'\0'界定与下一个文件名的边界
};

初始化需注意的问题

由于对某一中trigger进行统一管理,在为结构体分配内存时就需要知道总共有几个文件,所有文件名进行组合后需要的总内存。所以在分配内存前需要预先分析这两个参数

NGLSC 配置操作更新

配置信息追加

DriverMode(0/1)

确认是否使用PWM-LED(0)或NEO-LED(1),原始版本固定值为0

Direction(0/1)

方向识别模式(1)下,触发'In'以及'Out'需判断加速度轴方向(X/Y/Z)后出发相应Trigger目录下 如 '0:/Bank0/In/X/*.wav'

ShakeOutG, ShakeInG

值为0时不开启, 不为零时为 加速度阈值, 超过阈值则触发**'Out'** or 'In'

LockupHold

TriggerE的延时触发,单位毫秒。
值为0则功能关闭, 当计数器小于LockupHold时松开Aux即恢复运行态
大于LockupHold是,Aux松开仍保持TriggerE模式,直至下一次Aux被触发

Lowpower

报警电压

PowerSavingPerecnts

值为0,不开启
最大值为50, 触发电压报警后, LED亮度以及音量变为 “设定值x(100 - PowerSavingPerecnt)"

额外修改

  • Bank 的Color色将增加LBank
  • 音量设置从0-3增加到0-16
  • 需保存TriggerF文件名
  • Out, In 下有X\Y\Z三文件夹,搜索触发文件名时需排除掉,并且考虑为子文件夹保存文件名
  • 不再保存所有触发文件名, 而只保存当前的有效Bank的文件名
  • 将通用API移动到mx-file

test unity

  • DriverMode
  • Direction
  • ShakeOutG
  • ShakeInG
  • LockupHold
  • Lowpower
  • PowerSavingPerecnts
  • PowerSavingPerecnts
  • Bank 的Color色增加LBank
  • 音量设置从0-3增加到0-16
  • 保存TriggerF文件名
  • 保存Out下的X\Y\Y文件trigger
  • 保存In下的X\Y\Y文件trigger
  • 只保存当前trigger,切换bank自动更新

NGLSC 事件驱动更新

更新步骤

0.DriverMode

  • 修改获取驱动结构体函数

1.新的变量 Direction

  • 为Audio Message 添加x/y/z的传递消息
  • 添加audio驱动
  • 添加Lis3D检查当前加速度值的空函数
  • 添加事件驱动

2.新的变量 ShakeOutG, ShakeInG

  • 添加事件驱动

3.新的触发 TriggerF

  • 暂不更改

4.新的变量 LockpHold

  • 添加事件驱动

5.保存当前Bank位,上电恢复

  • bank值保存在"0:/System/.ini”中
  • 添加事件驱动

6.新的变量 PowerSavingPerecnts

  • 暂不更改

7.可连续触发Bankswitch

  • 在Audio中插入bankswitch标志
  • 添加事件驱动

8.播放器模式

  • 添加audio驱动
  • 添加audio运行标志
  • 添加事件驱动

neopixel特性更新

  • 在config中增加对neo trigger文件的文件路径保存
  • neo-led 驱动更新

test unity

0.DriverMode

  • 测试DriverMode 0 时返回PWM驱动
  • 测试DriverMode 1 时返回NEO驱动

1.新的变量 Dirction

  • Lis3D返回加速度值
  • MainTask触发 Direction 操作
  • Audio响应 IN/OUT 的 x/y/z trigger操作

2.新的变量 ShakeOutG, ShakeInG

  • 摇晃设备触发Out
  • 要换设备出发In

3.新的触发 TriggerF

  • MainTask触发TriggerF
  • Audio响应TriggerF

4.新的变量 LockpHold

  • LockHold可关闭
  • 触发LockHold
  • Audio相应正常

5.保存当前Bank位,上电恢复

  • 读操作正常
  • 写操作正常

6.新的变量 PowerSavingPerecnts

7.可连续触发Bankswitch

  • Audio BankSwitch标志工作正常
  • Maintask事件驱动正常

8.播放器模式

  • Maintask 触发Player Enter
  • System状态切换
  • Audio 响应 Enter
  • Maintask 触发Player Exit
  • Audio 相应 Exit
  • Maintask 触发Player Start
  • Audio 响应 Start
  • Maintask 触发Player Stop
  • Audio 响应 Stop
  • Maintask 触发Player Switch
  • Audio 响应 Switch

neopixel特性更新

  • 触发hum
  • 触发colorswitch
  • 触发triggerB
  • 触发triggerC
  • 触发triggerD
  • 触发triggerE
  • 触发triggerF
  • 触发Bankswitch
  • 触发charging
  • 触发charged

LBank 颜色触发

  • TriggerE读取LBank颜色

音量最大16档

  • 测试

Neopixel 软件改动

追加/改变特性说明

1.SETTING.txt中追加 DriverMode=0/1 (0=powerLED , 1=neopixel)

CONFIG中增加一条配置信息

2.Setting.txt色彩配置追加Lbank(TriggerE触发的色彩由Fbank变更为Lbank)

除开Bankcolor及Fbank,新增Lbank,并修改LED操作

3.Effect.txt中,音量设置vol从当前的4档继续细分至16档或百分比形式?

使用类浮点数乘法,乘以比例/2^n, 当比例==2^n时为最大音量

4.Effect.txt中追加Direction=0/1 (0=随机,1=方向识别) ,此项程序默认设置为0

待机转开机,检测Gsenser方向,若
0.7G<X<1.3G,则播放bank*\out\X.wav
0.7G<Y<1.3G,则播放bank*\out\Y.wav
0.7G<Z<1.3G,则播放bank*\out\Z.wav
开机转待机时,检测Gsenser方向,若
0.7G<X<1.3G,则播放bank*\in\X.wav
0.7G<Y<1.3G,则播放bank*\in\Y.wav
0.7G<Z<1.3G,则播放bank*\in\Z.wav
若对应文件不存在,或者G值落在其他范围,则随机播放Out/In 文件夹下任一文件

需固定XYZ物理轴向,增加相应lis3D驱动,目前只检测xyz加速度值最大的轴,然后触发最大值的轴

5.Effect.txt中追加ShakeOutG=0/? ShakeInG=0/? , 此两项程序默认设置为0

ShakeoutG=? (0=不开启,设参=开启) ,当开启时,待机状态下检测到G值大于shakeoutG 时,触发out进入运行态;
ShakeinG=? (0=不开启,设参=开启) ,当开启时,运行状态下,检测到G值大于shakeinG 时,触发in转入待机状态

需增加lis3D驱动

6.追加触发TriggerF,触发方式为按住aux同时挥动

对应文件为Bank*\Force*.wav 以及Bank*\Force*.neo
此项需同步追加灵敏度参数设置,以及与TriggerD触发的按钮动作协调,待审阅后协商确定

需增加Maintask事件驱动

7.Effect.txt内,TriggerE追加参数LockupHold (延时触发),单位毫秒

当TriggerE被触发时,aux重新开始计时
若LockupHold=0,此功能屏蔽
当0<t<Lockuphold时,Aux松开即恢复运行态
当LockupHold≤t时,Aux松开仍然保持TriggerE模式,直至下一次aux被触发(上升沿触发,此次仅为状态释放,不进行TriggerD/E/F的重复触发)

Config中增加参数、Maintask增加事件驱动

8.将当前使用的Bank位,写入到SETTING.txt或其他位置,断电再启动后,直接进入当前bank而非每次从Bank1开始,若此标记失效(标记位>实际存储套数或者无标记,则从Bank1开始)

写入flash更为妥当

9.Setting.txt内追加PowerSavingPerecnts=0(0=不开启,数值=开启,最大值50,默认设参为0)

此项为启动时检测,与原有的lowpower检测合并处理
用户自行设置报警提示电压Lowpower= ?(将其从USR_CFG中提出到SETTING.txt),到达报警线时, LED亮度以及音量由原来设定值缩减为 “设定值x (100 - PowerSaving perecent)”
特效音播放速率以及音量与G值联动,参数名未定,此项细节需商榷
样例: https://m.youtube.com/watch?v=LHpzbtBo-5w&feature=youtu.be

增加Config参数,变更电压检测函数

10.修改点, bankswitch音效/光效被触发时,out触发无效(已实现),但可继续触发下一个bankswitch(未实现)

增加Maintask事件驱动

增设播放器模式

11.进入方式为:待机状态下,1s内3次短按Main,进入后播放system\player.wav

此播放器用于顺次播放根目录下的Multimedia*.wav
操作逻辑:
Main上升沿触发,开始播放当前wav直至结束(此状态下自动关机无效),若未播放完成时再上升沿触发,停止播放(自动关机计时恢复工作)
Aux上升沿触发,单向循环切换当前播放的*.wav
此状态下,1s内3次短按Main,退出到正常待机态

增加Maintask事件驱动,audio相应触发

Neopixel部分说明,此部分仅对neopixel控制部分进行追加说明,并不包含常规动作变更

12.Hum.neo / bankswitch.neo / colorswitch.neo 位于Bank目录下

13.Out/In/Swing/Clash/Blaster/lockup对应的*.neo位于bank内对应的文件夹下,若触发则直接打断hum.neo进行相应文件的播放(需同步支持Out/In的方向识别,文件名规则同声音部分,若无特定文件,则随机播放文件夹下的*.neo),若对应文件夹下无文件则保持hum.neo的继续播放不进行变更,触发完成后回hum.neo(此处从首列开始?从打断处继续?跳过特效占用帧位继续存疑,可能要实际尝试过才行

软件层面可继续从循环处继续运行,但用于存储各类Triggerpath的内存开销将增倍,考虑动态存储当前Bank的trigger,而不是将所有bank都保存下来

14.进行colorswitch切换时,保持当前帧占位,下一bank的hum.neo从下到上逐次替换至数据喂完,或直接读下一bank的colorswitch.neo ,此项涉及文件位置变更,需商榷.

colorswitch直接中断当前hum.neo进行,colorswitch播放完毕后将从下一bank的hum.neo第一行开始运行

15.bankswitch时,播放bankswitch.neo

16.Charging.neo位于System目录下,若待机模式下充电,则播放此文件,若无TF卡或者无此文件,直接转静默充电(仅)

无charged.neo ?

存疑部分

17.TriggerB细分,是否能区分摇摆,劈砍或者滚转?

需相应算法

18.特定动作记忆触发实现的可能性?

需协同flash读写,相应记忆与识别算法,实现难度较高

feature实现说明

新的配置信息更改详见 #37
相应的事件驱动更改详见 #39

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.