---by pongo---
MODEL.SET.lua.managespeedcam = BOOL_MODEL(false)
MODEL.SET.lua.WannaGiveFeedBack = BOOL_MODEL(true)
MODEL.SET.lua.SpeedCam_Pos = GCOOR_MODEL({lat = 0, lon = 0})
MODEL.SET.lua.SpeedCam_Type = INT_MODEL(0)
MODEL.SET.lua.SpeedCam_SpeedLimit = INT_MODEL(0)
MODEL.SET.lua.SpeedCam_Direction = INT_MODEL(0)
MODEL.SET.lua.SpeedCam_Direction_type = INT_MODEL(0)
MODEL.SET.lua.SpeedCam_Service = INT_MODEL(0)
MODEL.SET.lua.SpeedCam_ID = CSTRING_MODEL("")
MODEL.SET.lua.SpeedCam_Confidence = INT_MODEL(-1)
MODEL.SET.lua.Speedcam_FirstClick = BOOL_MODEL(true)
MODEL.SET.lua.AlertFilter = CSTRING_MODEL("")
MODEL.SETPERSISTENT.lua.HVA_Max_Lockahead = INT_MODEL(500)
MODEL.SET.lua.vOverspeedAlertDistance = INT_MODEL(350)
MODEL.SET.lua.vOverspeedTolerance = INT_MODEL(5)
MODEL.SETPERSISTENT.lua.gApproachBipSound = WSTRING_MODEL(L"!!!")
MODEL.SETPERSISTENT.lua.AudioSpeedcamOverspeed = WSTRING_MODEL(L"!!!")
MODEL.SETPERSISTENT.lua.AudioSpeedcamEnd = WSTRING_MODEL(L"!!!")
MODEL.SET.lua.Overspeed_OR_ZoneEnd = CSTRING_MODEL("")
MODEL.SET.lua.gjSpeedSound = INT_MODEL(0)
MODEL.SET.lua.gjSpRepDist = INT_MODEL(0)
MODEL.SETPERSISTENT.lua.SCaudio_path = WSTRING_MODEL(L"SC1063")
MODEL.SETPERSISTENT.lua.ApprochingBeepPionttoPoint = BOOL_MODEL(false)
MODEL.SETPERSISTENT.lua.TimeRepeateAverageSpeed = INT_MODEL(30)
MODEL.SET.lua.SCaudioSupported = BOOL_MODEL(true)
MODEL.SET.lua.LastSpeedcamSpeedLimit = INT_MODEL(0)
MODEL.SETPERSISTENT.lua.SpeedCamAverageSpeed = BOOL_MODEL(false)
MODEL.SETPERSISTENT.lua.SpeedcamAlarmInBackDist = INT_MODEL(180)
MODEL.SET.lua.SpeedcamAlarmInBackCount = INT_MODEL(0)
MODEL.SET.lua.LastSpeedcamCategory = INT_MODEL(0)
MODEL.SET.lua.LastSpeedcamSpeedLimit = INT_MODEL(0)
MODEL.SET.lua.DistanceInBack = INT_MODEL(0)
local Speedcam_On = false
local SpeedcamInBack_FirstClick = false
local SayReduce_trigger = false
local SpeedcamAlarm_ID = -1
local SpeedcamAlarmInBack_ID = -1
gLastSpeedcamCategory = -1
ESpeedcamPassedSentences = {}
gSpeedCamType = nil
gSpeedCamDir = nil
gSpeedCamDirType = nil
gSpeedCamSpeedLimit = nil
gSpeedCamSaved = false
gSpeedCamCatName = ""
gSpeedCamSoundName = ""
hook_StartInit:register(function()
MODEL.lua.SpeedCamAverageSpeed = false
end)
hook_SpeedCamInBack_Notification:register(function()
local speedcat = ""
for i, camType in var.iter(ui.lm_extendedSpeedCamList) do
if MODEL.navigation.curr_speedcam.category() == camType.id() then
speedcat = camType.text()
break
end
end
tNotifications["alert_point"]["speed_camera_back"].summary = sc_Create_Notification_Text(sc_GetSysEntry("notification.alert_point.speed_camera_back", "summary", ""), speedcat)
hook_Send_Notification:trigger("alert_point","speed_camera_back")
if MODEL.warning.is_spoken() and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() then
sc_Voice_TTS(translated_voice_format("Behind you %s", speedcat))
end
end)
createState("st_EditSpeedcam", {
extends = {st_CommonMap, st_Popover, st_FooterMenu},
useLayers = {"ui_EditSpeedcam"},
skipLayers = {"ui_MapControl"},
mapstate = "speedcam",
popover = "ui.lm_SpeedLimitPopover",
footermenu = "ui.lm_speedcam_footer",
localmenu = "ui.lm_speedcam_localmenu",
onmapclick = sc_EmptyMapClick,
change_mode = function()
local posx, posy
local mapLayer = MODEL.map.primary()
if MODEL.lua.IsLandscape() then
posx = 20
posy = 52
else
posx = 48
posy = 28
end
mapLayer.center_posx = posx
mapLayer.center_posy = posy
end,
enter = function()
sc_SaveOriginalSpeedcamParams()
if MODEL.lua.managespeedcam() then
MODEL.warning.manage.update_speedcam(MODEL.lua.SpeedCam_ID(), MODEL.lua.SpeedCam_Type(), MODEL.lua.SpeedCam_SpeedLimit(), MODEL.lua.SpeedCam_Direction(), MODEL.lua.SpeedCam_Direction_type())
MODEL.map.primary.use_small_exclusion_box = 3
elseif #MODEL.ui.lm_extendedSpeedCamList then
MODEL.lua.SpeedCam_Type = MODEL.ui.lm_extendedSpeedCamList[0].id()
end
end,
init = function()
MODEL.warning.speedcam_enabled = false
if MODEL.lua.managespeedcam() then
ui.ui_Header.title = m_i18n("Edit alert point")
else
ui.ui_Header.title = m_i18n("Add new alert point")
end
sc_setDefaultMapZoom()
doDelayed(1, function() MODEL.map.primary.center_noanim(MODEL.my.map.selected_item.position()) end)
MODEL.map.primary.show_tmc_icons = false
end,
done = function()
MODEL.warning.speedcam_enabled = true
MODEL.map.primary.show_tmc_icons = true
end,
exit = function()
if gSpeedCamSaved then
sc_SaveSpeedcamOK()
else
sc_RestoreOriginalSpeedcamParams()
end
MODEL.lua.managespeedcam = false
gSpeedCamSaved = false
end,
})
function sc_AddSpeedcam()
MODEL.lua.managespeedcam = false
sc_UpdateSpeedcamModels()
sc_NextStateAnim(st_EditSpeedcam, "fade", 1, "")
end
function sc_SaveOriginalSpeedcamParams()
gSpeedCamType = MODEL.lua.SpeedCam_Type()
gSpeedCamDir = MODEL.lua.SpeedCam_Direction()
gSpeedCamDirType = MODEL.lua.SpeedCam_Direction_type()
gSpeedCamSpeedLimit = MODEL.lua.SpeedCam_SpeedLimit()
end
function sc_RestoreOriginalSpeedcamParams()
MODEL.lua.SpeedCam_Type = gSpeedCamType
MODEL.lua.SpeedCam_Direction = gSpeedCamDir
MODEL.lua.SpeedCam_Direction_type = gSpeedCamDirType
MODEL.lua.SpeedCam_SpeedLimit = gSpeedCamSpeedLimit
end
tmpPrevSpeedcamType = -1
function sc_EditSpeedcameraType()
MODEL.warning.check_speedcam_functions()
sc_NextStateAnim(st_EditSpeedcam_Type, "fade", 1, "")
end
createState("st_EditSpeedcam_Type", {
extends = {st_Common},
title = m_i18n("Alert type"),
useLayers = {"ui_EditSpeedcam_Type"},
init = function()
local Type = MODEL.lua.SpeedCam_Type()
tmpPrevSpeedcamType = Type
for i = 0, #MODEL.ui.lm_extendedSpeedCamList - 1 do
if MODEL.ui.lm_extendedSpeedCamList[i].id() == Type then
MODEL.ui.lstSpeedcamType.first_visible_index = i
return
end
end
end,
done = function()
if tmpPrevSpeedcamType != MODEL.lua.SpeedCam_Type() then
if not sc_GetSpeedCamCatValue(MODEL.lua.SpeedCam_Type(), "useroadspeedlimit") then
MODEL.lua.SpeedCam_SpeedLimit = 0
else
local segmentSpeedLimit = sc_GetSegmentSpeedLimit()
MODEL.lua.SpeedCam_SpeedLimit = segmentSpeedLimit
end
end
sc_ConvertSpeedToCurrent(MODEL.lua.SpeedCam_SpeedLimit())
end
})
createState("st_SelectSpeedcam", {
extends = {st_Common},
useLayers = {"ui_SelectSpeedcam"},
title = m_i18n("Select a Camera")
})
function sc_SpeedcamSelectCameraType()
if vQuickAdd() then
ui.vQuickAdd = false
end
sc_back()
end
function sc_UpdateSpeedcamModels(Model)
local pos, type, speedlimit, direction, direction_type, service, id
if Model == nil then
speedlimit, direction, direction_type = MODEL.warning.manage.get_segment_params()
pos = MODEL.map.cursor.position()
if MODEL.warning.speedcam.allowed_in_the_country() then
type = 0
else
type = 6
end
id = ""
service = 3
else
pos = Model.position()
type = Model.category()
speedlimit = Model.speed_limit()
direction = Model.heading()
direction_type = Model.heading_type()
service = Model.service()
id = Model.id()
if Model.EXISTS.confidence() then
MODEL.lua.SpeedCam_Confidence = Model.confidence()
else
MODEL.lua.SpeedCam_Confidence = -1
end
end
MODEL.lua.SpeedCam_Pos = pos
MODEL.lua.SpeedCam_Type = type
MODEL.lua.SpeedCam_SpeedLimit = speedlimit
MODEL.lua.SpeedCam_Direction = direction
MODEL.lua.SpeedCam_Direction_type = direction_type
MODEL.lua.SpeedCam_Service = service
MODEL.lua.SpeedCam_ID = id
sc_ConvertSpeedToCurrent(speedlimit)
if not sc_GetSpeedCamCatValue(MODEL.lua.SpeedCam_Type(), "speedlimit") then
local segmentSpeedLimit = sc_GetSegmentSpeedLimit()
MODEL.lua.SpeedCam_SpeedLimit = segmentSpeedLimit
end
end
function sc_SaveSpeedcam()
gSpeedCamSaved = true
if not #MODEL.map.primary.clicked_speedcam_list then
CLEARTOSTATE(st_Cockpit)
else
sc_back()
end
end
function sc_SaveSpeedcamOK()
if not sc_GetSpeedCamCatValue(MODEL.lua.SpeedCam_Type(), "speedlimit") then
MODEL.lua.SpeedCam_SpeedLimit = 0
end
if MODEL.lua.managespeedcam() then
MODEL.warning.manage.update_speedcam(MODEL.lua.SpeedCam_ID(), MODEL.lua.SpeedCam_Type(), MODEL.lua.SpeedCam_SpeedLimit(), MODEL.lua.SpeedCam_Direction(), MODEL.lua.SpeedCam_Direction_type())
else
MODEL.warning.manage.add_speedcam(MODEL.lua.SpeedCam_Pos(), MODEL.lua.SpeedCam_Type(), MODEL.lua.SpeedCam_SpeedLimit(), MODEL.lua.SpeedCam_Direction(), MODEL.lua.SpeedCam_Direction_type())
end
sc_CopySpeedCamUserList()
end
function sc_CopySpeedCamUserList()
MODEL.ui.lm_clicked_SpeedCamList.clear()
for item, index in ModelList_iter(MODEL.map.primary.clicked_speedcam_list) do
if item.service() != 0 and item.service() != 2 then
ui.lm_clicked_SpeedCamList:add({category = item.category(), confidence = item.confidence(), heading = item.heading(), heading_type = item.heading_type(), icon_phase = item.icon_phase(), id = item.id(), position = item.position(), service = item.service(), speed_limit = item.speed_limit()})
end
end
end
function sc_EditSpeedcam()
MODEL.lua.managespeedcam = true
sc_CopySpeedCamUserList()
if #MODEL.map.primary.clicked_speedcam_list == 1 then
sc_UpdateSpeedcamModels(MODEL.map.primary.clicked_speedcam_list[0])
sc_NextStateAnim(st_EditSpeedcam, "fade", 1, "")
end
end
function sc_EditSpeedcamFromList()
sc_UpdateSpeedcamModels(MODEL["*"])
MODEL["*"]._list.setcurrent(index)
MODEL.lua.managespeedcam = true
sc_NextStateAnim(st_EditSpeedcam, "fade", 1, "")
end
function sc_DeleteSpeedcam()
if #MODEL.map.primary.clicked_speedcam_list == 1 then
sc_UpdateSpeedcamModels(MODEL.map.primary.clicked_speedcam_list[0])
end
MODEL.warning.manage.delete_speedcam(MODEL.lua.SpeedCam_ID())
MODEL.warning.manage.dismiss_speedcam(MODEL.lua.SpeedCam_ID())
MODEL.ui.lm_clicked_SpeedCamList.remove(MODEL.ui.lm_clicked_SpeedCamList.index())
if #MODEL.ui.lm_clicked_SpeedCamList == 0 then
uieffect:GRAB()
CLEARTOSTATE(st_Cockpit)
uieffect:DO_ANIM("fade", 1, "")
else
sc_back()
end
end
function sc_SetSpeedCamTextFooterButton()
if not MODEL.lua.managespeedcam() or not #MODEL.ui.lm_clicked_SpeedCamList then
return m_i18n("Save")
else
return m_i18n("Edit")
end
end
function sc_EditSelector()
MODEL.map.primary.update_clicked_speedcam_list()
MODEL.lua.managespeedcam = true
if #MODEL.map.primary.clicked_speedcam_list >= 2 then
sc_CopySpeedCamUserList()
sc_NextStateAnim(st_SelectSpeedcam, "fade", 1, "")
else
sc_EditSpeedcam()
end
end
function sc_ConvertSpeedToCurrent(speedlimit)
local units = MODEL.regional.units()
if units == 0 or units == 2 then
local convertedSpeedLimit = regional.units:convert("Speed", "miles/hour", speedlimit)
local roundedSpeedLimit = double.round(convertedSpeedLimit):toInt()
ui_EditSpeedcam.SpeedLimit = roundedSpeedLimit
else
ui_EditSpeedcam.SpeedLimit = speedlimit
end
end
function sc_GetSpeedCamCatValue(catID, name)
local model = MODEL.ui.lm_extendedSpeedCamList.unfiltered_list
local value
for item, index in ModelList_iter(model) do
if item.id() == catID then
value = item[name]()
break
end
end
return value
end
function sc_GetSegmentSpeedLimit()
local speedlimit, direction, direction_type
speedlimit, direction, direction_type = MODEL.warning.manage.get_segment_params()
return speedlimit
end
function sc_GetSpeedCamName()
for item, idx in ModelList_iter(MODEL.ui.lm_extendedSpeedCamList.unfiltered_list) do
if item.id() == MODEL.lua.SpeedCam_Type() then
return item.text()
end
end
end
function sc_SpeedcamSpeedOnchange(value)
ui_EditSpeedcam.SpeedLimit = value
sc_ConvertSpeedToMetric(ui_EditSpeedcam.prop.SpeedLimit(), MODEL.regional.units())
end
function sc_ConvertSpeedToMetric(SpeedLimit, units)
if units == 0 or units == 2 then
local convertedSpeedLimit = regional.units:convert("Speed", "km/h", SpeedLimit, "miles/hour")
local roundedSpeedLimit = double.round(convertedSpeedLimit):toInt()
MODEL.lua.SpeedCam_SpeedLimit = roundedSpeedLimit
else
MODEL.lua.SpeedCam_SpeedLimit = SpeedLimit
end
end
function sc_SpeedcameraUseRoadSpeedLimit( id )
return sc_GetSysEntry("speedcam_category:"..id, "use_road_speedlimit", true )
end
createState("st_AlertPointSettings", {
extends = {st_List, st_Popover, st_LocalMenu},
title = m_i18n("Alert Points"),
separator = {[1] = "",[3] = "",[6] = "",[9]="",[13]="",[14]=""},
listname = "ui.lm_alertpointsettings",
init = function()
if MODEL.lua.Overspeed_OR_ZoneEnd() == "bipsound" then
if MODEL.lua.SelectedAudioFile() != L"---" then
MODEL.lua.gApproachBipSound = MODEL.lua.SelectedAudioFile()
end
MODEL.lua.SelectedAudioFile = L"---"
elseif MODEL.lua.Overspeed_OR_ZoneEnd() == "Overspeed" then
if MODEL.lua.SelectedAudioFile() != L"---" then
MODEL.lua.AudioSpeedcamOverspeed = MODEL.lua.SelectedAudioFile()
end
MODEL.lua.SelectedAudioFile = L"---"
elseif MODEL.lua.Overspeed_OR_ZoneEnd() == "ZoneEnd" then
if MODEL.lua.SelectedAudioFile() != L"---" then
MODEL.lua.AudioSpeedcamEnd = MODEL.lua.SelectedAudioFile()
end
MODEL.lua.SelectedAudioFile = L"---"
end
end,
exit = function()
if not MODEL.warning.is_spoken() then
obs_gjmspcon:START("NO_TRIGGER")
else
obs_gjmspcon:STOP()
end
end,
})
function sc_SetMsgBox()
MODEL.warning.speedcam_warning = false
if MODEL.warning.speedcam_enabled() then
sc_SpeedCamOnMSGbox()
end
end
function sc_SpeedcamWarningEnabled()
MODEL.warning.speedcam_warning = true
MODEL.warning.speedcam_enabled = true
end
function sc_SpeedcamWarningDisabled()
MODEL.warning.speedcam_warning = false
MODEL.warning.speedcam_enabled = false
end
function sc_SpeedCamOnMSGbox()
local message = wstring.format(translate(m_i18n("Using this function may be prohibited by law in certain countries.")) .. translate(m_i18n("Are you sure you want to switch it on anyway?")))
MODEL.screen.msgbox.create_from({
line = {message},
button = {{"sc_SpeedcamWarningEnabled", m_i18n("Switch on"), "", "ico_done.svg"}, {"sc_SpeedcamWarningDisabled", m_i18n("Cancel"), "", "ico_cancel.svg"}}
})
if vReadOutSystemMessages() then
VW_LongTextToSay(message)
end
end
function sc_HVA_Set_Prewarn_Alert_Distance(set_index)
local t = sc_split(MODEL.warning.hva.prealert_distance_options(), ",")
if set_index then
for index, value in pairs(t) do
if value == tostring(MODEL.lua.HVA_Max_Lockahead()) then
MODEL.warning.hva.prealert_distance_index = index - 1
break
end
end
else
MODEL.lua.HVA_Max_Lockahead = tonumber(t[MODEL.warning.hva.prealert_distance_index() + 1])
end
end
function sc_IsInHVACountry(pos)
local hva_countries = sc_GetSysEntry("hva", "hva_countries", "fra")
local current_country = MODEL.other.get_country_by_position(pos):lower()
return in_set(current_country:match("%a+"), sc_split(hva_countries, ","))
end
function sc_AlertTypeFilter(filter)
MODEL.ui.lm_extendedSpeedCamList.setcurrent(ui.alerttypes[filter]:get_index(ui.alerttypes[filter][index]))
sc_NextStateAnim(st_ExtendedSpeedCamSettings, "fade", 1, "")
end
function sc_btnSpeedCam_OnRelease()
if sc_IsInHVACountry(MODEL.navigation.car.position()) then
sc_NextStateAnim(st_DangerZoneSettings, "fade", 1, "")
else
sc_NextStateAnim(st_ProximityAlertsSettings, "fade", 1, "")
end
end
createState("st_DangerZoneSettings", {
extends = {st_CommonList, st_Popover},
useLayers = {"ui_DangerZoneSettings"},
title = m_i18n("Dangerous Zone"),
})
createState("st_ProximityAlertsSettings", {
extends = {st_CommonList},
useLayers = {"ui_ProximityAlertsSettings"},
title = m_i18n("Select Alert Types"),
})
gPrevAudio = nil
createState("st_ExtendedSpeedCamSettings", {
extends = {st_CommonList, st_Popover, st_FooterMenu},
useLayers = {"ui_ExtendedSpeedCamSettings"},
title = m_i18n("Alert Points"),
footermenu = "ui.lm_extendedSpeedCamSettings_footermenu",
enter = function()
local settings = MODEL.warning()
local index = MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id()
local id = MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id()
gPrevAudio = settings["speedcam_soundtype_" .. tostring(id)]()
if not gPrevAudio then
gPrevAudio = 2
end
end,
})
function sc_SetSpeedCamAudioWarningType(audio)
local settings = MODEL.warning()
local index = MODEL.ui.lm_extendedSpeedCamList.index()
local id = MODEL.ui.lm_extendedSpeedCamList[index].id()
local sound = "speedcam_soundtype_" .. tostring(id)
gPrevAudio = audio
settings[sound] = audio
end
function sc_GetSpeedCamAudioWarningType(index)
local settings = MODEL.warning()
local index = MODEL.ui.lm_extendedSpeedCamList.index()
local id = MODEL.ui.lm_extendedSpeedCamList[index].id()
local audio = settings["speedcam_soundtype_" .. tostring(id)]()
if (gPrevAudio == 2) then
return m_i18n("When Approaching")
elseif (gPrevAudio == 1) then
return m_i18n("Only When Speeding")
end
end
function sc_SetSpeedCamVisualWarningType(audio, visual)
local settings = MODEL.warning()
local index = MODEL.ui.lm_extendedSpeedCamList.index()
local id = MODEL.ui.lm_extendedSpeedCamList[index].id()
local show = "speedcam_visualtype_" .. tostring(id)
local warn = "speedcam_soundtype_" .. tostring(id)
settings[show] = visual
if audio then
settings[warn] = gPrevAudio
else
settings[warn] = audio
end
end
function sc_GetSpeedCamVisualWarningType(index)
local settings = MODEL.warning()
local index = MODEL.ui.lm_extendedSpeedCamList.index()
local id = MODEL.ui.lm_extendedSpeedCamList[index].id()
local visual = settings["speedcam_visualtype_" .. tostring(id)]()
local audio = settings["speedcam_soundtype_" .. tostring(id)]()
if audio and visual then
return m_i18n("Audio and Visual")
elseif not audio and visual then
return m_i18n("Visual")
else
return m_i18n("Disabled")
end
end
createState("st_SelectSpeedcamForInfo", {
extends = {st_CommonList},
title = m_i18n("Select Alert Point"),
useLayers = {"ui_SelectSpeedcamForInfo"},
})
function sc_ShowSpeedcamInfo()
sc_UpdateSpeedcamModels(MODEL["*"])
MODEL["*"]._list.setcurrent(index)
sc_NextStateAnim(st_ShowSpeedcamInfo, "fade", 1, "")
end
createState("st_ShowSpeedcamInfo", {
extends = {st_CommonList, st_FooterMenu},
title = m_i18n("Alert Point Information"),
useLayers = {"ui_ShowSpeedcamInfo"},
enter = function()
if Plugin:isLoaded("weather") and MODEL.lua.QueryWeather() then
MODEL.services.weather.request_weather_at_location(MODEL.lua.SpeedCam_Pos())
end
end,
})
hook_SetMapHeader:register(function()
if #MODEL.map.primary.clicked_speedcam_list then
hook_SetMapHeader:prevent_default()
sc_UpdateMapHeader_Speedcam()
end
end)
hook_OnMapClickNoPoi:register(function()
if #MODEL.map.primary.clicked_speedcam_list then
hook_OnMapClickNoPoi:prevent_default()
MODEL.map.primary.cursor_icon = "cursor_speedcam"
doDelayed(1, function() sc_UpdateSpeedcamModels(MODEL.map.primary.clicked_speedcam_list[0]) end)
end
end)
hook_PoiMapInfo_NoPoi:register(function()
if #MODEL.map.primary.clicked_speedcam_list and MODEL.map.primary.cursor_icon() == "cursor_speedcam" then
hook_PoiMapInfo_NoPoi:prevent_default()
if #MODEL.map.primary.clicked_speedcam_list == 1 then
MODEL.map.primary.clicked_speedcam_list.setcurrent(0)
hook_DetailedInfo:trigger("speedcam")
sc_NextStateAnim(st_ShowSpeedcamInfo, "fade", 1, "")
else
hook_DetailedInfo:trigger("multispeedcam")
sc_NextStateAnim(st_SelectSpeedcamForInfo, "fade", 1, "")
end
end
end)
function sc_UpdateMapHeader_Speedcam()
ui_MapHeader_prop.mapheader_icon = "speedwarn_list.svg"
ui_MapHeader_prop.mapheader_icon_phase = MODEL.lua.SpeedCam_Type()
ui_MapHeader_prop.mapheader_text_top = sc_GetSpeedCamName()
if MODEL.lua.SpeedCam_Type() == 31 and sc_IsInHVACountry(MODEL.my.map.selected_item.position()) then
ui_MapHeader_prop.mapheader_text_top = m_i18n("High vigilance area. Watch your speed.")
end
ui_MapHeader_prop.mapheader_text_bottom = MODEL.my.map.selected_item.address.long_format()
end
gFirstClick = true
gSkippedID = ""
function sc_ToggleSpeedcamSound()
if gFirstClick and not MODEL.navigation.curr_speedcam.skipped() then
gFirstClick = false
if MODEL.navigation.curr_speedcam.speed_warning_sound_active() then
MODEL.navigation.curr_speedcam.speed_warning_sound_active = false
elseif MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() == 0 then
MODEL.navigation.curr_speedcam.skipped = true
end
gSkippedID = MODEL.navigation.curr_speedcam.id()
else
MODEL.navigation.curr_speedcam.speed_warning_sound_active = false
MODEL.navigation.curr_speedcam.skipped = true
MODEL.lua.Speedcam_FirstClick = false
gFirstClick = true
end
end
function sc_ResetFirstClick()
if MODEL.navigation.curr_speedcam.id() == gSkippedID then
MODEL.lua.Speedcam_FirstClick = false
else
gFirstClick = true
MODEL.lua.Speedcam_FirstClick = true
end
end
function sc_fill_hva_alert(idx)
local listModel = MODEL.ui.lm_hva_view.hva_alerts
local hva_array = {is_active = false, remaining_distance = 0}
if idx != nil and listModel != nil then
hva_array.is_active = listModel[idx].is_active()
hva_array.remaining_distance = listModel[idx].remaining_distance()
end
return hva_array
end
function sc_gjfirstplayspeedcam()
if MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() then
local spc_cat = MODEL.navigation.curr_speedcam.category()
gSpeedCamCatName = "speedcam_category:" .. spc_cat
gSpeedCamSoundName = sc_GetSysEntry(gSpeedCamCatName, "skin_first_sound", L"")
if gSpeedCamSoundName != L"" then
sc_gjspeedcam_playsound(gSpeedCamSoundName)
end
local gjSpeedSound = var.new()
gjSpeedSound = sc_GetSysEntry(gSpeedCamCatName, "skin_speed_sound_delay", 0)
if gjSpeedSound > 0 then
killDelayed(gjDel1)
gjDel1 = doDelayed(gjSpeedSound, function() sc_gjspeedcam_playsound(MODEL.navigation.curr_speedcam.speed_limit()) end)
end
MODEL.lua.gjSpRepDist = sc_GetSysEntry(gSpeedCamCatName, "skin_repeat_distance", 0)
if MODEL.lua.gjSpRepDist() > 0 then
obs_gjmspcrep:START("NO_TRIGGER")
end
end
end
function sc_gjrepeatplayspeedcam()
obs_gjmspcrep:STOP()
gSpeedCamSoundName = sc_GetSysEntry(gSpeedCamCatName, "skin_repeat_sound", L"")
if gSpeedCamSoundName != L"" and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() then
sc_gjspeedcam_playsound(gSpeedCamSoundName)
end
end
local function sc_GetSCAudioFolder()
if sc_FindInScanGivenFolderList(L"SC9999") then
local lcid = towstring(MODEL.regional.current_voice.lcid())
if sc_FindInScanGivenFolderList(L"SC" .. lcid) then
MODEL.lua.SCaudioSupported = true
MODEL.lua.SCaudio_path = L"SC" .. lcid
else
MODEL.lua.SCaudioSupported = false
MODEL.lua.SCaudio_path = L"SC9999"
end
doDelayed(10, sc_GetSCAudioFolder)
end
end
function sc_LiveSCAudioSettings()
sc_ScanGivenFolder(L"%app%/ui_nextgen/audio", L"fcategory:0")
sc_GetSCAudioFolder()
end
function sc_gjspeedcam_playsound(snd_nm)
if snd_nm == L"" then
return
end
local spc_audio_path = var.new()
spc_audio_path = MODEL.lua.SCaudio_path()
if spc_audio_path != L"" then
snd_nm = spc_audio_path .. L"/" .. snd_nm
end
MODEL.sound.playchanneltest("alarmeffect", snd_nm)
end
function sc_speedcamtest_audio()
local spc_cat = MODEL.INT.ui.lm_extendedSpeedCamList.current.id()
gSpeedCamCatName = "speedcam_category:" .. spc_cat
gSpeedCamSoundName = sc_GetSysEntry(gSpeedCamCatName, "skin_first_sound", L"")
if gSpeedCamSoundName != L"" then
sc_gjspeedcam_playsound(gSpeedCamSoundName)
end
local gjSpeedSound = var.new()
gjSpeedSound = sc_GetSysEntry(gSpeedCamCatName, "skin_speed_sound_delay", 0)
if gjSpeedSound > 0 then
killDelayed(gjDel1)
gjDel1 = doDelayed(gjSpeedSound, function() sc_gjspeedcam_playsound(50) end)
end
end
function sc_ReadoutAllSpeedcamInfo()
MODEL.ui.lm_extendedSpeedCamList.setcurrent(index)
sc_speedcamtest()
end
function sc_ReadoutSpeedcamInfo()
MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id()
sc_speedcamtest()
end
function sc_speedcamtest()
if MODEL.warning["speedcam_soundtype_" .. MODEL.ui.lm_extendedSpeedCamList[current].id()]() then
if MODEL.warning.is_spoken() then
local number, unit = Format_Speed_Voice(MODEL.warning.driveralert.speed_limit())
local scspeedunit = sc_GetSysEntry("voice", "announce_speed_unit", 0) and translate_voice(unit) or L""
local scspeed = sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "say_camera_speed_limit", 0) and translated_voice_format("The speed limit is %s!", string.match(tostring(70), "^%d+")) .. L" " .. scspeedunit or L""
local scoverspeed = sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "overspeed_min_speech_repeat_delay", 0) > 0 and translate_voice("Reduce your speed.") .. L" " .. scspeed or L""
local sccatnam = translate_voice(sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "activated_speech", "")) or L""
local distance = sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "say_camera_distance", 0) and translated_voice_format("After %s", sc_wVoiceFormat_search_distance(900)) or L""
local sccatpass = translate_voice(sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "passed_speech", "")) or L""
local avgspeedunit = vAVGPhraseUnit() and translate_voice(unit) or L""
local avgphrase = vSaynewAverageSpeed() and translated_voice_format("Your average speed is %s", string.match(tostring(98), "^%d+")) .. L" " .. avgspeedunit or L""
local avgtext = sc_GetSysEntry("speedcam_category:" .. MODEL.ui.lm_extendedSpeedCamList[MODEL.ui.lm_extendedSpeedCamList.index()].id(), "section_beep_distance", 0) and translate_voice("You are in an average speed check zone") .. L" " .. avgphrase or L""
sc_Voice_TTS(distance .. L" " .. sccatnam .. L" " .. scspeed .. L" " .. avgtext .. L" " .. scoverspeed .. L" " .. sccatpass)
else
sc_speedcamtest_audio()
end
elseif MODEL.warning["speedcam_visualtype_" .. MODEL.ui.lm_extendedSpeedCamList[current].id()]() then
sc_Voice_TTS(translate_voice("Visual warning only"))
end
end
createState("st_SCWarningSignSound", {
extends = {st_CommonList},
useLayers = {"ui_ProximityAlertsSettingstest"},
title = m_i18n("Speedcam Test"),
})
function sc_SetLastSpeedcamSpeedLimit()
if (MODEL.navigation.curr_speedcam.speed_limit() > 0) then
MODEL.lua.LastSpeedcamSpeedLimit = MODEL.navigation.curr_speedcam.speed_limit()
if MODEL.lua.LastSpeedcamCategory() == 3 and MODEL.lua.LastSpeedcamSpeedLimit() == 5 then
sc_ToggleSpeedcamSound()
doDelayed(3, sc_ToggleSpeedcamSound)
sc_OffSection()
end
end
end
function sc_SetLastSpeedcamCategory()
MODEL.lua.LastSpeedcamCategory = MODEL.navigation.curr_speedcam.category()
hook_SpeedCam_Notification()
if SpeedcamAlarmInBack_ID ~= -1 then
killDelayed(SpeedcamAlarmInBack_ID)
SpeedcamAlarmInBack_ID = -1
MODEL.lua.SpeedcamAlarmInBackCount = 0
MODEL.lua.DistanceInBack = 0
end
end
function sc_OnSpeedcam()
obs_speedcam:START()
Speedcam_On = true
SpeedcamAlarm()
end
function sc_ChekSpeedcamInBack(category)
return (category == 23)
end
function sc_OffSpeedcam()
obs_speedcam:STOP()
hook_Delete_Notification:trigger("alert_point","speed_camera_ahead")
if MODEL.warning.is_spoken() and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() then
local camerapassed = translate_voice(sc_GetSysEntry("speedcam_category:" .. MODEL.lua.LastSpeedcamCategory(), "passed_speech", ""))
VW_LongTextToSay(camerapassed)
end
if SpeedcamAlarm_ID ~= -1 then
killDelayed(SpeedcamAlarm_ID)
SpeedcamAlarm_ID = -1
end
if Speedcam_On and MODEL.navigation.curr_speedcam.distance() < 50 and not SpeedcamInBack_FirstClick and sc_ChekSpeedcamInBack(MODEL.lua.LastSpeedcamCategory()) then
hook_SpeedCamInBack_Notification()
SpeedcamAlarmInBack()
else
if Speedcam_On and MODEL.lua.LastSpeedcamCategory() ~= 3 then
MODEL.sound.playchanneltest("alarmeffect", MODEL.lua.AudioSpeedcamEnd())
end
end
if MODEL.lua.SpeedCamAverageSpeed() then
doDelayed(10, function()
hook_Send_Notification:trigger("alert_zone", "in_average_speed_zone")
SpeedcamAlarm()
end)
end
Speedcam_On = false
end
function sc_SpeedcamClick()
if SpeedcamAlarmInBack_ID ~= -1 then
hook_Delete_Notification:trigger("alert_point", "speed_camera_back")
killDelayed(SpeedcamAlarmInBack_ID)
SpeedcamAlarmInBack_ID = -1
MODEL.lua.SpeedcamAlarmInBackCount = 0
MODEL.lua.DistanceInBack = 0
SpeedcamInBack_FirstClick = false
else
killDelayed(SpeedcamAlarmInBack_ID)
SpeedcamAlarmInBack_ID = -1
SpeedcamInBack_FirstClick = true
end
sc_ToggleSpeedcamSound()
doDelayed(5, sc_ToggleSpeedcamSound)
MODEL.lua.SpeedCamAverageSpeed = false
hook_Delete_Notification:trigger("alert_zone", "in_average_speed_zone")
end
function SpeedcamAlarm()
if MODEL.lua.SpeedCamAverageSpeed() and MODEL.warning.speedcam_soundtype_3() and (MODEL.other.trips[0].speed_total_avg() > (MODEL.lua.LastSpeedcamSpeedLimit() + MODEL.lua.vOverspeedTolerance())) and MODEL.lua.LastSpeedcamSpeedLimit() ~= 5 and MODEL.lua.vOverspeedAlertDistance() > 0 then
MODEL.sound.playchanneltest("alarmeffect", MODEL.lua.AudioSpeedcamOverspeed())
end
if not MODEL.lua.SpeedCamAverageSpeed() and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() and MODEL.navigation.curr_speedcam.distance.valid() and MODEL.navigation.car.current_speed() >= (MODEL.lua.LastSpeedcamSpeedLimit() + MODEL.lua.vOverspeedTolerance()) and (MODEL.lua.vOverspeedAlertDistance() >= MODEL.navigation.curr_speedcam.distance()) and MODEL.lua.LastSpeedcamCategory() ~= 3 and MODEL.lua.LastSpeedcamCategory() ~= 12 then
MODEL.sound.playchanneltest("alarmeffect", MODEL.lua.AudioSpeedcamOverspeed())
end
SpeedcamAlarm_ID = doDelayed(150, SpeedcamAlarm)
end
function SpeedcamAlarmInBack()
if MODEL.warning.is_spoken() and MODEL.navigation.car.current_speed() >= MODEL.lua.LastSpeedcamSpeedLimit() and SayReduce_trigger and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() then
sc_Voice_TTS(translate_voice("Reduce your speed."))
SayReduce_trigger = false
end
if MODEL.navigation.car.current_speed() >= (MODEL.lua.LastSpeedcamSpeedLimit() + MODEL.lua.vOverspeedTolerance()) and MODEL.warning["speedcam_soundtype_" .. MODEL.navigation.curr_speedcam.category()]() and (MODEL.lua.vOverspeedAlertDistance() > (MODEL.lua.DistanceInBack() * 10 / 18)) then
MODEL.sound.play_effect("effects.ui.speedcam_alarm")
end
if MODEL.lua.DistanceInBack() < MODEL.lua.SpeedcamAlarmInBackDist() then
if MODEL.lua.SpeedcamAlarmInBackCount() > 0 then
MODEL.lua.DistanceInBack = MODEL.lua.DistanceInBack() + MODEL.navigation.car.current_speed()
end
MODEL.lua.SpeedcamAlarmInBackCount = MODEL.lua.SpeedcamAlarmInBackCount() + 1
if not (MODEL.lua.SpeedcamAlarmInBackCount() % 4) then
SayReduce_trigger = true
end
SpeedcamAlarmInBack_ID = doDelayed(150, SpeedcamAlarmInBack)
else
SpeedcamAlarmInBack_ID = -1
MODEL.lua.SpeedcamAlarmInBackCount = 0
MODEL.lua.DistanceInBack = 0
hook_Delete_Notification:trigger("alert_point","speed_camera_back")
if vEndSpeedcam() then
MODEL.sound.play_effect("effects.ui.speedcam_end")
end
end
end
function sc_ResetFirstSpeedcamClick_new()
SpeedcamInBack_FirstClick = false
sc_ResetFirstClick()
end
function sc_OnSection()
MODEL.lua.SpeedCamAverageSpeed = true
if MODEL.lua.LastSpeedcamSpeedLimit() ~= 5 then
MODEL.other.trips[0].reset()
--MODEL.other.trips[0].speed_total_avg = MODEL.navigation.car.current_speed()
doDelayed(150, function()
hook_Send_Notification:trigger("alert_zone", "in_average_speed_zone")
SpeedcamAlarm()
end)
end
if MODEL.warning.is_spoken() and MODEL.navigation.curr_speedcam.avg_speed.valid() and MODEL.warning.speedcam_soundtype_3() and MODEL.lua.LastSpeedcamSpeedLimit() ~= 5 then
doDelayed(300, function() sc_Voice_TTS(translate_voice("You are in an average speed check zone")) end)
doDelayed(600, sc_SayInfoAverageSpeed)
end
end
function sc_OffSection()
ui.RMOverSpeed = 0
sc_ToggleSpeedcamSound()
doDelayed(3, sc_ToggleSpeedcamSound)
doDelayed(5, function() MODEL.lua.SpeedCamAverageSpeed = false end)
MODEL.sound.playchanneltest("alarmeffect", MODEL.lua.AudioSpeedcamEnd())
if MODEL.warning.is_spoken() and MODEL.warning.speedcam_soundtype_3() then
sc_Voice_TTS(translate_voice("End Average Speedcam."))
end
end
function sc_SayInfoAverageSpeed()
if MODEL.lua.SpeedCamAverageSpeed() and vSaynewAverageSpeed() and not MODEL.navigation.car_in_tunnel() then
local number, unit = Format_Speed_Voice(MODEL.other.trips[0].speed_total_avg())
local avgspeedunit = vAVGPhraseUnit() and translate_voice(unit) or L""
local avgspeedphrase = translated_voice_format("Your average speed is %s", string.match(tostring(number), "^%d+")) .. L" " .. avgspeedunit
sc_Voice_TTS(avgspeedphrase)
doDelayed(MODEL.lua.TimeRepeateAverageSpeed() * 50, sc_SayInfoAverageSpeed)
end
end
createState("st_LiveSpeedcamInCockpit_OnRelease", {
extends = {st_CommonMap, st_FooterMenu},
useLayers = {"ui_LiveSpeedcamInCockpit"},
title = m_i18n("Live SpeedCam Settings"),
onmapclick = sc_EmptyMapClick,
init = function()
ui_Header:HIDE()
ui_MapControl:HIDE()
MODEL.lua.CockpitMapMode = eCockpitMapMode.Mode_3D
sc_SetCockpitMapMode()
end,
})
createState("st_EditSpeedcam_live", {
extends = {st_CommonMap, st_Popover, st_FooterMenu},
useLayers = {"ui_EditSpeedcam_live"},
skipLayers = {"ui_MapControl"},
mapstate = "speedcam",
popover = "ui.lm_SpeedLimitPopover",
footermenu = "ui.lm_speedcam_footer",
localmenu = "ui.lm_speedcam_localmenu",
onmapclick = sc_EmptyMapClick,
change_mode = function()
local posx, posy
local mapLayer = MODEL.map.primary()
if MODEL.lua.IsLandscape() then
posx = 20
posy = 52
else
posx = 48
posy = 28
end
mapLayer.center_posx = posx
mapLayer.center_posy = posy
end,
enter = function()
sc_SaveOriginalSpeedcamParams()
MODEL.warning.manage.update_speedcam(MODEL.lua.SpeedCam_ID(), MODEL.lua.SpeedCam_Type(), MODEL.lua.SpeedCam_SpeedLimit(), MODEL.lua.SpeedCam_Direction(), MODEL.lua.SpeedCam_Direction_type())
MODEL.map.primary.use_small_exclusion_box = 3
end,
init = function()
MODEL.warning.speedcam_enabled = false
ui.ui_Header.title = m_i18n("Add new alert point")
sc_setDefaultMapZoom()
doDelayed(1, function() MODEL.map.primary.center_noanim(MODEL.navigation.car.position()) end)
MODEL.map.primary.show_tmc_icons = false
end,
done = function()
MODEL.warning.speedcam_enabled = true
MODEL.map.primary.show_tmc_icons = true
end,
exit = function()
if gSpeedCamSaved then
sc_SaveSpeedcamOK()
else
sc_RestoreOriginalSpeedcamParams()
end
MODEL.lua.managespeedcam = false
gSpeedCamSaved = false
end
})
function sc_AddSpeedCamLive()
MODEL.lua.managespeedcam = false
sc_AddSpeedcamNew()
sc_NextStateAnim(st_EditSpeedcam_live, "fade", 1, "")
end
function sc_AddSpeedcamNew()
local type, speedlimit, direction, direction_type, service, id
speedlimit, direction, direction_type = MODEL.warning.manage.get_segment_params()
MODEL.map.cursor.position = MODEL.navigation.car.position()
type = 0
id = ""
service = 3
MODEL.lua.SpeedCam_Pos = MODEL.map.cursor.position()
MODEL.lua.SpeedCam_Type = type
MODEL.lua.SpeedCam_SpeedLimit = speedlimit
MODEL.lua.SpeedCam_Direction = direction
MODEL.lua.SpeedCam_Direction_type = direction_type
MODEL.lua.SpeedCam_Service = service
MODEL.lua.SpeedCam_ID = id
sc_ConvertSpeedToCurrent(speedlimit)
if not sc_GetSpeedCamCatValue(MODEL.lua.SpeedCam_Type(), "speedlimit") then
local segmentSpeedLimit = sc_GetSegmentSpeedLimit()
MODEL.lua.SpeedCam_SpeedLimit = segmentSpeedLimit
end
end
createState("st_PanicInCockpit_OnRelease", {
extends = {primary, tBackgroundLayers},
useLayers = {"primary", "ui_PanicInCockpit", "ui_Footer"},
})
createState("st_BigSpeedcamPosition", {
extends = {st_CommonMap, st_FooterMenu},
useLayers = {"ui_BigSpeedcamPosition"},
onmapclick = sc_EmptyMapClick,
init = function()
ui_Header:HIDE()
ui_MapControl:HIDE()
MODEL.lua.CockpitMapMode = eCockpitMapMode.Mode_3D
sc_SetCockpitMapMode()
end,
})