| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- local cacheTable = {}
- local rxCache = ""
- local vbackup = gpio.setup(24, 1)
- local gnssReset = gpio.setup(27, 1)
- local gnssEnvPower = gpio.setup(26, 1)
- local es8311Power = gpio.setup(25, 1)
- local gnssPower = gpio.setup(2, 1)
- local blueLed = gpio.setup(1, 0)
- local redLed = gpio.setup(16, 0, nil, nil, 4)
- local powerKeyTest = false
- pm.request(pm.IDLE)
- local transUartId = 1
- if not fskv.get("pcbaDone") then
- transUartId = 1
- else
- transUartId = uart.VUART_0
- end
- local gnssUartId = 2
- local gnssIsDownload = false
- local gnssIsTrans = false
- local gnssTransFlag = false
- uart.setup(transUartId, 115200)
- local Gsensori2cId = 1
- local da267Addr = 0x26
- local intPin = 39
- local ES8311i2cId = 0
- local function NMEA2UART1(id, len)
- local result
- while 1 do
- local data = uart.read(gnssUartId, len)
- if not data or #data == 0 then
- break
- end
- if gnssTransFlag then
- table.insert(cacheTable, data)
- sys.publish("UART1_SEND")
- end
- end
- end
- -- amr数据存放buffer,尽可能地给大一些
- local amr_buff = zbuff.create(20 * 1024)
- -- 创建一个amr的encoder
- local encoder = nil
- audio.on(0, function(id, event, buff)
- log.info("audio.on", id, event)
- -- 使用play来播放文件时只有播放完成回调
- if event == audio.RECORD_DATA then -- 录音数据
- codec.encode(encoder, buff, amr_buff)
- elseif event == audio.RECORD_DONE then -- 录音完成
- sys.publish("AUDIO_RECORD_DONE")
- else
- local succ, stop, file_cnt = audio.getError(0)
- if not succ then
- if stop then
- log.info("用户停止播放")
- else
- log.info("第", file_cnt, "个文件解码失败")
- end
- end
- log.info("播放完成一个音频")
- sys.publish("AUDIO_PLAY_DONE")
- end
- end)
- local recordPath = "/record.amr"
- sys.taskInit(function()
- mcu.altfun(mcu.I2C, Gsensori2cId, 23, 2, 0)
- mcu.altfun(mcu.I2C, Gsensori2cId, 24, 2, 0)
- mcu.altfun(mcu.I2C, ES8311i2cId, 13, 2, 0)
- mcu.altfun(mcu.I2C, ES8311i2cId, 14, 2, 0)
- local multimedia_id = 0
- local i2s_id = 0
- local i2s_mode = 0
- local i2s_sample_rate = 16000
- local i2s_bits_per_sample = 16
- local i2s_channel_format = i2s.MONO_R
- local i2s_communication_format = i2s.MODE_LSB
- local i2s_channel_bits = 16
- local pa_pin = 23
- local pa_on_level = 1
- local pa_delay = 100
- local power_pin = 255
- local power_on_level = 1
- local power_delay = 3
- local power_time_delay = 100
- local voice_vol = 100
- local mic_vol = 80
- local find_es8311 = false
- i2c.setup(Gsensori2cId, i2c.SLOW)
- i2c.setup(ES8311i2cId, i2c.FAST)
- if i2c.send(ES8311i2cId, 0x18, 0xfd) == true then
- find_es8311 = true
- end
- log.info("find_es8311?", find_es8311)
- i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format, i2s_channel_bits)
- audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
- audio.setBus(multimedia_id, audio.BUS_I2S, {
- chip = "es8311",
- i2cid = ES8311i2cId,
- i2sid = i2s_id,
- voltage = audio.VOLTAGE_1800
- }) -- 通道0的硬件输出通道设置为I2S
- audio.vol(multimedia_id, 80)
- audio.micVol(multimedia_id, 80)
- while true do
- local result, param1, param2, param3 = sys.waitUntil("CONTROL")
- log.info("CONTROL", param1, param2, param3)
- if param1 == "GNSS" then
- gnssReset(0)
- sys.wait(10)
- gnssReset(1)
- elseif param1 == "GSENSOR" then
- i2c.send(Gsensori2cId, da267Addr, 0x01, 1)
- local data = i2c.recv(Gsensori2cId, da267Addr, 1)
- if not data or data == "" or string.byte(data) ~= 0x13 then
- table.insert(cacheTable, "ERROR#")
- else
- table.insert(cacheTable, "OK#")
- end
- sys.publish("UART1_SEND")
- elseif param1 == "RECORD" then
- local err = audio.record(0, audio.AMR, 5, 7, recordPath)
- result = sys.waitUntil("AUDIO_RECORD_DONE", 10000)
- if result then
- table.insert(cacheTable, "OK#")
- else
- table.insert(cacheTable, "ERROR#")
- end
- sys.publish("UART1_SEND")
- elseif param1 == "PLAY" then
- local err = audio.play(0, recordPath)
- result = sys.waitUntil("AUDIO_PLAY_DONE", 10000)
- if result then
- table.insert(cacheTable, "OK#")
- else
- table.insert(cacheTable, "ERROR#")
- end
- sys.publish("UART1_SEND")
- end
- end
- end)
- local function powerOff()
- pm.shutdown()
- end
- local function powerKeyCb()
- if gpio.get(46) == 1 then
- if powerKeyTest then
- table.insert(cacheTable, "POWERKEY_RELEASE#")
- end
- if sys.timerIsActive(powerOff) then
- sys.timerStop(powerOff)
- end
- else
- if powerKeyTest then
- table.insert(cacheTable, "POWERKEY_PRESS#")
- end
- sys.timerStart(powerOff, 3000)
- end
- if powerKeyTest then
- sys.publish("UART1_SEND")
- end
- end
- gpio.debounce(46, 100)
- gpio.setup(46, powerKeyCb, gpio.PULLUP, gpio.BOTH)
- local function proc(data)
- local item = nil
- local find = true
- local needNowReply = true
- local h = string.find(data, "#")
- if h then
- local cmd = string.sub(data, 1, h - 1)
- if string.find(cmd, "VERSION") then
- item = PROJECT .. "_" .. VERSION
- elseif string.find(cmd, "LED") then
- local onoff = string.match(cmd, "LED,(%d)")
- item = "OK"
- if onoff == "0" then
- blueLed(0)
- redLed(0)
- elseif onoff == "1" then
- blueLed(1)
- redLed(1)
- else
- item = "ERROR"
- end
- elseif string.find(cmd, "IMEI") then
- item = mobile.imei()
- elseif string.find(cmd, "IMSI") then
- item = mobile.imsi()
- elseif string.find(cmd, "ICCID") then
- item = mobile.iccid()
- elseif string.find(cmd, "CSQ") then
- item = mobile.csq()
- elseif string.find(cmd, "MUID") then
- item = mobile.muid()
- elseif string.find(cmd, "GPSTEST") then
- local onoff = string.match(cmd, "GPSTEST,(%d)")
- log.info("flag", onoff)
- item = "OK"
- if onoff == "0" then
- gnssTransFlag = false
- uart.close(gnssUartId)
- elseif onoff == "1" then
- gnssTransFlag = true
- uart.on(gnssUartId, "receive", NMEA2UART1)
- uart.setup(gnssUartId, 115200)
- else
- item = "ERROR"
- end
- elseif string.find(cmd, "GPSDOWNLOAD") then
- local onoff = string.match(cmd, "GPSDOWNLOAD,(%d)")
- item = "OK"
- if onoff == "0" then
- gpio.close(12)
- gpio.close(13)
- elseif onoff == "1" then
- gpio.setup(12)
- gpio.setup(13)
- sys.publish("CONTROL", "GNSS")
- else
- item = "ERROR"
- end
- elseif string.find(cmd, "GS_STATE") then
- sys.publish("CONTROL", "GSENSOR")
- needNowReply = false
- elseif string.find(cmd, "RECORD") then
- sys.publish("CONTROL", "RECORD")
- needNowReply = false
- elseif string.find(cmd, "PLAY") then
- sys.publish("CONTROL", "PLAY")
- needNowReply = false
- elseif string.find(cmd, "POWERKEY") then
- local onoff = string.match(cmd, "POWERKEY,(%d)")
- item = "OK"
- if onoff == "0" then
- powerKeyTest = false
- elseif onoff == "1" then
- powerKeyTest = true
- else
- item = "ERROR"
- end
- elseif string.find(cmd, "ECNPICFG") then
- mobile.nstOnOff(true, transUartId)
- mobile.nstInput("AT+ECNPICFG?\r\n")
- mobile.nstInput(nil)
- mobile.nstOnOff(false, transUartId)
- needNowReply = false
- elseif string.find(cmd, "VBAT") then
- adc.open(adc.CH_VBAT)
- local vbat = adc.get(adc.CH_VBAT)
- adc.close(adc.CH_VBAT)
- item = tostring(vbat)
- elseif string.find(cmd, "PCBA_TEST_DONE") then
- item = "OK"
- fskv.set("pcbaDone", true)
- elseif string.find(cmd, "TEST_DONE") then
- item = "OK"
- fskv.set("allDone", true)
- sys.timerStart(pm.reboot, 3000)
- else
- find = false
- item = "ERROR"
- end
- if find then
- if not item then
- item = " "
- end
- end
- if needNowReply then
- item = item .. "#"
- table.insert(cacheTable, item)
- sys.publish("UART1_SEND")
- end
- return true, data:sub(h + 1)
- else
- return false, data
- end
- end
- uart.on(transUartId, "receive", function(id, len)
- local result
- while 1 do
- local data = uart.read(transUartId, 512)
- if not data or #data == 0 then
- break
- end
- rxCache = rxCache .. data
- while true do
- result, rxCache = proc(rxCache)
- if not result then
- break
- end
- end
- end
- end)
- uart.on(transUartId, "sent", function()
- sys.publish("SEND_DOWN")
- end)
- sys.taskInit(function()
- while true do
- while #cacheTable > 0 do
- uart.write(transUartId, table.remove(cacheTable, 1))
- sys.waitUntil("SEND_DOWN")
- end
- sys.waitUntil("UART1_SEND", 1000)
- end
- end)
- sys.taskInit(function()
- sys.wait(1000)
- while true do
- mobile.reqCellInfo(15)
- sys.waitUntil("CELL_INFO_UPDATE", 15000)
- sys.wait(1000)
- end
- end)
|