Data Server: How do I configure clock based triggers

Topic

This KB steps through the example of making triggering logic for ads to change every 30 seconds based on the All Sport clock in men’s basketball. Slight modifications on the quantity of periods or quantity of minutes values are needed for other sports such as football or women’s basketball.

 

Environment

  • Product Family: Sports Software and Controller
  • Product: Data Server
  • Components: Automated data triggers
  • Control System:

Steps

Triggering ads every minute (instead of every 30 seconds) is significantly more simple as you can remove all conditions and triggers that involve checking the Seconds values.

Additionally, repetition of ads each period/quarter or for various time slots could allow you to simplify the logic as well. This document, however, will not address those details.

There are 4 major areas of work to accomplish setting up new trigger logic based on an All Sport Clock:
  1. Custom DID Creation (modify an existing one)
  2. Trigger Condition Creation
  3. Trigger Logic Creation
  4. Actions Creation and Assignment
Lastly, trigger setup is tedious. You must click Save or your work will be lost. I recommend saving after creating conditions (close the conditions window then click Save in Triggering Window. Then go back and set up Triggers. Save again after Triggers have been set up and multiple times while setting actions.

1. CUSTOM DID CREATION


Modify the AS5_SportName.DID file to add new data fields (as seen above):
  • Main_Clock_Minutes
  • *Main_Clock_Seconds_Tens Digit
  • *Main_Clock_TenSecondTimer
*Only needed if ads change every 30 seconds. If ads change every minute only create Main_Clock_Minutes

Here are the fields if you want to copy and paste:
<Result name="Main_Clock_Minutes" description="mm" type="int" sampleData="88" offset="5" length="2" show="true" rtdColorField="" rtdFontField="" rtdEffectField="" rtdJustification="Right" />
<Result name="Main_Clock_Seconds_TensDigit" description="s" type="int" sampleData="8" offset="8" length="1" show="true" rtdColorField="" rtdFontField="" rtdEffectField="" rtdJustification="Right" />
<Result name="Main_Clock_TenSecondTimer" description=" mm:s" type="string" sampleData="88:8" offset="5" length="4" show="true" rtdColorField="" rtdFontField="" rtdEffectField="" rtdJustification="Right" />

Depending on your other triggers, additional fields may be added or have their type modified to be more specific (i.e. change from string to int) to make triggering logic simpler. For ad triggers every 30 seconds based on the All Sport clock the above changes are all that is needed.

This custom DID should replace the one that exists in C:\ProgramData\Daktronics\Data Server\DIDs
This custom DID should not be used by Content Studio, the Player, or anything else besides Data Server.

2. TRIGGER CONDITION CREATION
  1. To avoid evaluating triggers every second (10th of a second while under 1 minute), create a ‘Change’ condition for the Main_Clock_TenSecondTimer field. If ads change once per minute use the Main_Clock_Minutes field instead.
  2. Create an ‘=’ condition with the new Main_Clock_Minutes field for every minute value that the All Sport Clock may display (0 through 20 for college men’s basketball games).
*Tip: After creating the first condition, to avoid scrolling to the Main_Clock_Minutes field for the other 20, right click and select ‘Clone Condition’ to quickly create the rest and just modify numeric value.
  1. If ads change every 30 seconds, create an ‘=’ condition with Main_Clock_Seconds_TensDigit for:
    1. 5 (for xx:59.9 – xx:30.0) triggers when clock hits xx:5x.x (usually xx:59.9)
    2. 2 (for xx:29.9 – xx:00.0) triggers when clock hits xx:2x.x (usually xx:29.9)
    3. 0 (special case for when the clock resets to 15:00.0 or whatever the period duration is)
*Tip: After creating the first condition, to avoid scrolling to the Main_Clock_Seconds_TensDigit field for the other 2, right click and select ‘Clone Condition’ to quickly create the rest and just modify numeric value.
**Check the tens digit instead of full seconds value to help avoid risk of a dropped UDP packet. If the clock is at ‘12:00’ and the network dropped the ‘11:59’ we will recover by instead triggering on ‘11:58’.
***Skipping 1, 3 and 4 (and usually 0 as you’ll see in the next section) avoids triggering content again at xx:49, xx:39, xx:19 and xx:09 clock times. If content is neither video nor has entry effects then re-playing content every 10 seconds is not a problem and you may replace the ‘TensDigit=5’ and ‘TensDigit=2’ conditions with ‘TensDigit>2’ and ‘TensDigit<3’. This ensures proper triggers if the referees manually remove time from the clock causing an entire 10 second timeframe from xx:59-xx:50 or xx:29-xx:20 to be missed.
  1. To play different ads every period of a basketball game, create an ‘=’ condition against the existing Period field for 1 through 4. (this step may differ slightly from sport to sport)
*Tip: After creating the first condition, to avoid scrolling to the Period field for the other 3, right click and select ‘Clone Condition’ to quickly create the rest and just modify numeric value.
3. TRIGGER LOGIC CREATION
  1. Add a root level trigger using Clock TenSecondTimer Changed.
This ensures we only evaluate triggers once every ten seconds including resetting the clock from 0:00 to 20:00 between periods instead of once per second and ten times per second when under a minute.
  1. Add a sub-trigger to it for Period = “1” (or Quarter = “1”).
*Only necessary for different ads each period, otherwise go to step 3 and nest sub-triggers under Clock TenSecondTimer Changed.
Wait to add the other periods or quarters as we will just clone the Period = “1” condition three times in step 8.
  1. Add sub-triggers to Period = “1” for Seconds_TensDigit = 0 and Seconds_TensDigit = 5.
*Only necessary if ads change every 30 seconds. Otherwise go to step 4 & 5 and nest sub-triggers to the last trigger you created.
Wait to add the trigger for Seconds_TensDigit = 2 as we will simply clone the Seconds_TensDigit = 5 trigger in the step 6.

It may be more intuitive to check for Minutes first (steps 4 and 5) but logically you will write fewer total triggers if you check the seconds first (assuming there are more minutes checks than seconds checks in your scenario).
TensDigit = 0 is a special case for when the clock is initially set (to 15:00 for football or 10:00/20:00 for basketball). See Step 4.
TensDigit = 5 triggers when clock changes from xx:00.0 to xx:59.9 (or any xx:5x.x in case a packet skipped or clock was adjusted).
TensDigit = 2 triggers when clock changes from xx:30.0 to xx:29.9 (or any xx:2x.x in case a packet skipped or clock was adjusted).
  1. Add a sub-trigger to Clock Seconds_Tens = 0 for Clock Minutes = 20
This handles when the clock is reset to 20:00 after each period in NCAA men’s basketball. You’d use Clock Minutes = 10 for NCAA women’s basketball and Clock Minutes = 15 for football.
  1. Add sub-triggers Clock Seconds_Tens = 5 for the remaining minutes (Clock Minutes = 14 … 0)
These will trigger actions each time the clock passes below a full minute mark. ( 14:59, 13:59… 0:59)
  1. Right-Click the Clock Seconds_Tens = 5 trigger and select Clone Trigger.
    1. This creates a new sibling sub-trigger.
    2. Modify the condition of the newly generated trigger to Clock Seconds_Tens = 2.
These will trigger actions each time the clock passes below a 30 second mark. (14:29, 13:29… 0:29)
  1. Change every setting of the SubTriggers column from All to First
We know only one of these triggers will ever be true at a given time, so this allows us to be more performant and stop evaluating other triggers once we’ve found one to be true.
  1. Right Click the Period = “1” trigger and select Clone Trigger three times.
    1. This creates three sibling sub-triggers.
    2. Modify the conditions the newly generated triggers to Period = “2”, Period = “3” and Period = “4”
4. ACTION CREATION AND ASSIGNMENT

Now create and assign actions to various Clock Minutes = # triggers as explained in the manual.

Important things to remember:
  • After creating an action once you may re-use it in other Triggers by selecting Add Existing Action.
  • When creating similar actions select Add Cloned Action to create a new Action pre-filled with data from the cloned action. Then alter the information differs (i.e. Filename or Sign #) allowing you to avoid re-filling out the other fields such as Library, Drive, Display Mode or # of Times.
  • You may assign multiple actions to the same trigger (as seen in the Clock Minutes = 20 trigger.
  • Clone Trigger includes any assigned actions as well, so if actions are to be different it may save you time if you clone the trigger prior to assigning actions to avoid removing unwanted actions in the cloned trigger.

KB ID: 000019833


DISCLAIMER: Use of this content may void the equipment warranty, please read the disclaimer prior to performing any service of the equipment.

DAKTRONICS DOES NOT PROMISE THAT THE CONTENT PROVIDED HEREIN IS ERROR-FREE OR THAT ANY DEFECTS WILL BE CORRECTED, OR THAT YOUR USE OF THE CONTENT WILL PROVIDE SPECIFIC RESULTS. THE CONTENT IS DELIVERED ON AN "AS-IS" AND "AS-AVAILABLE" BASIS. ALL INFORMATION PROVIDED IN THIS ARTICLE IS SUBJECT TO CHANGE WITHOUT NOTICE. DAKTRONICS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF ACCURACY, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. DAKTRONICS DISCLAIMS ANY AND ALL LIABILITY FOR THE ACTS, OMISSIONS AND CONDUCT OF YOU OR ANY THIRD PARTIES IN CONNECTION WITH OR RELATED TO YOUR USE OF THE CONTENT. ADJUSTMENT, REPAIR, OR SERVICE OF THE EQUIPMENT BY ANYONE OTHER THAN DAKTRONICS OR ITS AUTHORIZED REPAIR AGENTS MAY VOID THE EQUIPMENT WARRANTY. YOU ASSUME TOTAL RESPONSIBILITY FOR YOUR USE OF THE CONTENT AND ANY LINKED CONTENT. YOUR SOLE REMEDY AGAINST DAKTRONICS FOR DISSATISFACTION WITH THE CONTENT IS TO STOP USING THE CONTENT. THIS LIMITATION OF RELIEF IS A PART OF THE BARGAIN BETWEEN THE PARTIES.

The above disclaimer applies to any property damage, equipment failure, liability, infringement, or personal injury claim arising out of or in any way related to your use or application of the content, whether such claim is for breach of contract, tort, negligence or any other cause of action.