Forum Discussion

DukeOfMarshall's avatar
11 years ago

Stack Not Working, Exits App

My attempt here is to create a player with a live video stream and confirm the viewer is still watching after a predetermined time. Currently I have the video playing and a confirmation dialog pop up. If a viewer confirms they are still watching then the timer loop resets and repeats as necessary.

The issue I'm running into is that if the viewer does not confirm they are still watching or clicks no, then the app completely exits back to the main Roku screen. From my understanding, since I am creating the paragraph screen before the video screen, then the screens are stacked and if the video screen is closed, then in theory it should return to the previous screen in the stack. But it's not doing this.

Am I misunderstanding the use of stacked screens or is there something wrong with my code?

Thanks.

Function Main()
Console_Log("Creating the global variables")
m.popup_time = 10000
m.close_time = 30000

m.port = CreateObject("roMessagePort")

Show_Main_Screen()

video = CreateObject("roVideoScreen")
video.SetContent({
Title: "Test Video For Timer Functionality"
StreamFormat: "mp4"
Stream: { URL: "http://video.mp4"}
})
video.Show()
Console_Log("Video Screen Shown")

Main_Timer()
End Function







Function Show_Main_Screen()
screen = CreateObject("roParagraphScreen")
screen.SetMessagePort(m.port) ' instruct screen to send events to port

screen.AddParagraph("Just a test screen for a timer function")

screen.Show()
Console_Log("Main Screen Shown")
End Function







Function Show_Popup() as Boolean
Console_Log("Starting Popup Function")
newport = CreateObject("roMessagePort")
popup = CreateObject("roMessageDialog")
popup.SetMessagePort(newport) ' instruct screen to send events to port

popup.SetTitle("Viewer")
popup.SetText("Are you still watching?")

popup.AddButton(0, "Yes")
popup.AddButton(1, "No")

popup.Show()
Console_Log("Popup Shown")

timer=createObject("rotimespan")
timer.Mark()

while true
msg = wait(5000, popup.GetMessagePort())
if type(msg) = "roMessageDialogEvent"
if msg.isButtonPressed()
if msg.GetIndex() = 0
popup.Close()
return true
exit while
else if msg.GetIndex() = 1
popup.Close()
exit while
end if
end if
end if
return false
end while

End Function







Function Main_Timer()
Console_Log("Main Timer Started")
timer=createObject("rotimespan")
port = CreateObject("roMessagePort")

timer.Mark()

while true
event = port.GetMessage()

if(event = invalid)
ticks = timer.TotalMilliseconds()

if(ticks > m.popup_time AND ticks < (m.popup_time+2000))
print Stri(m.popup_time+2000)
response = Show_Popup()
if (response = true)
Console_Log("Yes Button Was Pressed")
timer.Mark()
else if (response = false)
Console_Log("No Button Was Pressed")
exit while
end if
end if
end if
end while
End Function







Function Console_Log(Message)
print Message
End Function
  • Your screen in Show_Main_Screen() is locally scoped, so it's going to close automatically when that function exits. The easiest fix would probably be to return the screen from that function and keep it alive in Main().
  • I made some modifications based off your suggestion, but it's still not working. Here are the modifications I made

    Function Main()
    ....
    temp = Show_Main_Screen()
    temp.Show()
    ....
    End Function

    Function Show_Main_Screen() as Object
    ....
    return screen
    End Function


    Function Main()
    Console_Log("Creating the global variables")
    m.popup_time = 10000
    m.close_time = 30000

    m.port = CreateObject("roMessagePort")

    temp = Show_Main_Screen()
    temp.Show()

    video = CreateObject("roVideoScreen")
    video.SetContent({
    Title: "Test Video For Timer Functionality"
    StreamFormat: "mp4"
    Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")

    Main_Timer()
    End Function







    Function Show_Main_Screen() as Object
    screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    Console_Log("Main Screen Shown")
    return screen
    End Function
  • Hi DukeOfMarshall, You must show video screen first and then paragraph screen as bellow

    Show_Main_Screen()

    video = CreateObject("roVideoScreen")
    video.SetContent({
    Title: "Test Video For Timer Functionality"
    StreamFormat: "mp4"
    Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")


    or you can use event loop as following

    Function Main()
    Console_Log("Creating the global variables")
    m.popup_time = 10000
    m.close_time = 30000

    m.port = CreateObject("roMessagePort")

    temp = Show_Main_Screen()
    temp.Show()
    Show_Video_Screen()
    Main_Timer()
    while true
    msg = wait(0, temp.GetMessagePort())
    if type(msg) = "roParagraphScreenEvent"
    if msg.isScreenClosed()
    exit while
    'if you want to play again
    'else if msg.isButtonPressed()
    'Show_Video_Screen()
    end if
    end if
    end while
    End Function

    Function Show_Main_Screen() as Object
    screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    Console_Log("Main Screen Shown")
    return screen
    End Function

    Function Show_Video_Screen()
    video = CreateObject("roVideoScreen")
    video.SetContent({
    Title: "Test Video For Timer Functionality"
    StreamFormat: "mp4"
    Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")
    End Function
  • Thanks for the help and the suggestion, but that still didn't work for me. Your suggestion caused the app to exit from the video screen not long after the loading animation appeared and then the pop up would show up over the main screen instead of the playing video.

    However, I was able to keep playing around with it and below is the code that I now have working. I think I may be completely misunderstanding the stack concept, but I completely left that behind and took a more object oriented approach to the situation. Now I have a working model that I can build on.

    Thanks to everyone for their help and suggestions through this.

    Sub Main()
    Console_Log("Creating the global variables")
    m.popup_time = 10000
    m.close_time = 30000

    m.port = CreateObject("roMessagePort")

    temp = Show_Main_Screen()
    temp.Show()

    video = Show_Video_Screen()

    Main_Timer(video)

    while true
    msg = wait(0, temp.GetMessagePort())
    if type(msg) = "roParagraphScreenEvent"
    if msg.isScreenClosed()
    exit while
    'if you want to play again
    else if msg.isButtonPressed()
    if msg.GetIndex() = 0
    video = Show_Video_Screen()
    Main_Timer(video)
    else if msg.GetIndex() = 1
    temp.Close()
    exit while
    end if
    end if
    end if
    end while
    End Sub







    Function Show_Main_Screen() As Object
    screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    screen.AddButton(0, "Play Again")
    screen.AddButton(1, "Exit")

    Console_Log("Main Screen Shown")
    return screen
    End Function







    Function Show_Video_Screen() As Object
    video = CreateObject("roVideoScreen")
    video.SetContent({
    Title: "Test Video For Timer Functionality"
    StreamFormat: "mp4"
    Stream: {
    URL: "http://video.mp4"
    }
    })
    Console_Log("Video Screen Shown")
    return video
    End Function







    Function Show_Popup() as Boolean
    Console_Log("Starting Popup Function")
    newport = CreateObject("roMessagePort")
    popup = CreateObject("roMessageDialog")
    popup.SetMessagePort(newport) ' instruct screen to send events to port

    popup.SetTitle("Viewer")
    popup.SetText("Are you still watching?")

    popup.AddButton(0, "Yes")
    popup.AddButton(1, "No")

    popup.Show()
    Console_Log("Popup Shown")

    timer=createObject("rotimespan")
    timer.Mark()

    while true
    msg = wait(5000, popup.GetMessagePort())
    if type(msg) = "roMessageDialogEvent"
    if msg.isButtonPressed()
    if msg.GetIndex() = 0
    popup.Close()
    return true
    exit while
    else if msg.GetIndex() = 1
    popup.Close()
    exit while
    end if
    end if
    end if
    return false
    end while

    End Function







    Sub Main_Timer(video as object)
    Console_Log("Main Timer Started")
    timer=createObject("rotimespan")
    port = CreateObject("roMessagePort")

    timer.Mark()

    video.Show()

    while true
    event = port.GetMessage()

    if(event = invalid)
    ticks = timer.TotalMilliseconds()

    if(ticks > m.popup_time AND ticks < (m.popup_time+2000))
    print Stri(m.popup_time+2000)
    response = Show_Popup()
    if (response = true)
    Console_Log("The 'Yes' Button Was Pressed")
    timer.Mark()
    else if (response = false)
    Console_Log("The 'No' Button Was Pressed")
    video.Close()
    exit while
    end if
    end if
    end if
    end while
    End Sub







    Function Console_Log(Message)
    print Message
    End Function