Just getting started, but projectors / displays won't register

Months and month later, I'm finally able to start working on RMS integration in my custom control program installations (lots of RPM-based implementations working). Complete newbie at this version of RMS programming. Running RMS Enterprise, current version is 4.5.6.

First thing I did was added what I needed for control system monitoring. Shows up in RMS just fine. Next, I added what I needed for source usage tracking; all those sources registered and show up in RMS OK, and once I added the appropriate source usage tracking hooks, I'm seeing source usage time count up in RMS just fine.

Next, I added what I needed to monitor 2 projectors and 4 TV's (this room's configuration). Nothing shows up or registers in RMS.

After running into that problem, I added the touchpanel monitor stuff, after doing that, the touchpanel shows up just fine in RMS. Still no displays registered though.

The docs say I've got to implement SNAPI code for the RMS module to pick up, but shouldn't it at least register the devices to RMS as soon as I've added the DEFINE_MODULE lines for each of them? Am I just missing the info on a line of code for registering the devices?

Sorry for the super-newbie questions, it's been a long time since I had to do any significant programming besides just forking and one-offing an existing working codebase. Everything was making sense until the ProjectorMonitor and TVMonitor modules don't seem to be doing what I expect.

Thanks,

Comments

  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    Here's some code snippets if that might help... I'm trying to build this all with Netlinx, not Duet programming.
    DEFINE_DEVICE //Physical Devices
    
    dvmaster = 0:1:0 //MASTER SET AS SYSTEM 1
    
    //for NX 3200 8 RS232 ports
    dvdisp3  = 5001:1:0 //Display 3
    dvdisp4  = 5001:2:0 //Display 4
    dvdisp5  = 5001:3:0 //Display 5
    dvdisp6  = 5001:4:0 //Display 6
    
    DEFINE_DEVICE //device control panels
    
    dvtp1_room = 10001:1:0 //Core Panel Port - GANG
    dvtp1_audio = 10001:6:0 //Audio
    
    dvtp1_RMS = 10001:7:0 //RMS Touchpanel Hook
    
    dvtp1_proj1 = 10001:11:0 //Proj 1 (east wall, south side)
    dvtp1_proj2 = 10001:12:0 //Proj 2 (east wall, north side)
    dvtp1_disp3 = 10001:13:0 //Disp 3 (north wall)
    dvtp1_disp4 = 10001:14:0 //Disp 4 (west wall, north side)
    dvtp1_disp5 = 10001:15:0 //Disp 5 (west wall, south side)
    dvtp1_disp6 = 10001:16:0 //Disp 6 (south wall)
    
    // NOTE: Display assignment identifies displays as 1-6 starting closest to equipment rack, going clockwise looking down on room
    
    DEFINE_DEVICE //IP Ports
    
    dvaudio  = 0:9:0 //audio - Tesira Forte
    dvproj1  = 0:11:0 //Projector 1
    dvproj2  = 0:12:0 //Projector 2
    
    
    DEFINE_DEVICE //Virtual Devices
    
    vdvaudio = 33006:1:0 //Tesira Forte
    
    vdvproj1 = 33011:1:0 //Proj 1
    vdvproj2 = 33012:1:0 //Proj 2
    vdvdisp3 = 33013:1:0 //Disp 3
    vdvdisp4 = 33014:1:0 //Disp 4
    vdvdisp5 = 33015:1:0 //Disp 5
    vdvdisp6 = 33016:1:0 //Disp 6
    
    
    vdvRMS              =  41001:1:0  // RMS Client Engine VDV      (Duet Module)
    vdvRMSGui           =  41002:1:0  // RMS User Interface VDV      (Duet Module)
    
    vdvRMSSourceUsage   =  33002:1:0  // RMS Source Usage Monitor
    
    vdvRoomCPU  =  33021:1:0  // NL Virtual Device for Source Usage Tracking
    vdvLaptopHDMI  =  33022:1:0  // NL Virtual Device for Source Usage Tracking
    vdvLaptopVGA  =  33023:1:0  // NL Virtual Device for Source Usage Tracking
    vdvDocCam  =  33024:1:0  // NL Virtual Device for Source Usage Tracking
    vdvAppleTV  =  33025:1:0  // NL Virtual Device for Source Usage Tracking
    vdvRoomHDMI  =  33026:1:0  // NL Virtual Device for Source Usage Tracking
    vdvLocalInput  =  33030:1:0  // NL Virtual Device for Source Usage Tracking
    vdvProjWhiteboard =  33031:1:0  // NL Virtual Device for Source Usage Tracking
    
    
    //Define varirables
    
    ....
    
    //Controller Monitor
    DEFINE_MODULE 'RmsControlSystemMonitor' mdlRmsControlSystemMonitorMod(vdvRMS,dvMaster);
    
    //Touchpanel Monitor
    DEFINE_MODULE 'RmsTouchPanelMonitor' mdlRmsTouchPanelMonitorMod_1(vdvRMS,dvtp1_room);
    
    // Video Projector RMS Monitors
    DEFINE_MODULE 'RmsNlVideoProjectorMonitor' mdlRmsVideoProjector1MonitorMod(vdvRMS, vdvproj1, dvproj1);
    DEFINE_MODULE 'RmsNlVideoProjectorMonitor' mdlRmsVideoProjector2MonitorMod(vdvRMS, vdvproj2, dvproj2);
    
    // TV RMS Monitors
    DEFINE_MODULE 'RmsNlTVMonitor' mdlRmsDisplay3MonitorMod(vdvRMS, vdvdisp3, dvdisp3);
    DEFINE_MODULE 'RmsNlTVMonitor' mdlRmsDisplay4MonitorMod(vdvRMS, vdvdisp4, dvdisp4);
    DEFINE_MODULE 'RmsNlTVMonitor' mdlRmsDisplay5MonitorMod(vdvRMS, vdvdisp5, dvdisp5);
    DEFINE_MODULE 'RmsNlTVMonitor' mdlRmsDisplay6MonitorMod(vdvRMS, vdvdisp6, dvdisp6);
    
    //Source usage RMS monitors
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsRoomCPUVdvMonitorMod(vdvRMS, vdvRoomCPU, ROOM_CPU_NAME, ROOM_CPU_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsLaptopHDMIVdvMonitorMod(vdvRMS, vdvLaptopHDMI, LAPTOP_HDMI_NAME, LAPTOP_HDMI_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsLaptopVGAVdvMonitorMod(vdvRMS, vdvLaptopVGA, LAPTOP_VGA_NAME, LAPTOP_VGA_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsDocCamVdvMonitorMod(vdvRMS, vdvDocCam, DOCCAM_NAME, DOCCAM_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsAppleTVVdvMonitorMod(vdvRMS, vdvAppleTV, APPLETV_NAME, APPLETV_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsRoomHDMIVdvMonitorMod(vdvRMS, vdvRoomHDMI, ROOM_HDMI_NAME, ROOM_HDMI_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsLocalInputVdvMonitorMod(vdvRMS, vdvLocalInput, LOCAL_INPUT_NAME, LOCAL_INPUT_DESCRIPTION);
    DEFINE_MODULE 'RmsVirtualDeviceMonitor' mdlRmsProjWBVdvMonitorMod(vdvRMS, vdvProjWhiteboard, PROJ_WB_NAME, PROJ_WB_DESCRIPTION);
    

    All the other monitors appear to be working OK; as soon as I uploaded the code with the Monitor lines included, it registered that device. Except, for the Video Projector and TV monitors.

    What am I missing here? I'll end up calling AMX here pretty soon, but I want to see if I can get some audio control monitors added and working first.

    Thanks,

  • javery1javery1 Junior Member Posts: 21
    In the RMS class a few weeks ago we ran into an issue with the latest SDK not registering assets if you gave them a custom asset type, but if you're using the standard monitor modules, that shouldn't matter.

    The super-obvious thing I always forget is virtual device channels 251 and 252 have to be on before it will register the asset, by default.
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    javery1 wrote: »
    In the RMS class a few weeks ago we ran into an issue with the latest SDK not registering assets if you gave them a custom asset type, but if you're using the standard monitor modules, that shouldn't matter.
    I DID just download and update to the latest version of SDK before starting this project, but yes, I am using the standard VideoProjector and TV monitor modules from the SDK.
    javery1 wrote: »
    IThe super-obvious thing I always forget is virtual device channels 251 and 252 have to be on before it will register the asset, by default.
    The documentation says 251 is "Client Registered", which I take to mean that the entire system is registered with RMS. It definitely is, the control system is registered, everything else is registered, just not the projectors and TVs. I don't even see any reference to channel 252 in the documentation.

    One other thing I suppose I need to ask: Do the devices actually need to be hooked up and communicating with the controller, before the monitor modules will register them? The physical devices are not hooked up yet. I don't have the TVs yet, but I could easily connect to a projector, to see if that changes anything.

    Thanks!
  • ericmedleyericmedley Senior Member - 3709 Posts Posts: 4,159
    I DID just download and update to the latest version of SDK before starting this project, but yes, I am using the standard VideoProjector and TV monitor modules from the SDK.


    The documentation says 251 is "Client Registered", which I take to mean that the entire system is registered with RMS. It definitely is, the control system is registered, everything else is registered, just not the projectors and TVs. I don't even see any reference to channel 252 in the documentation.

    One other thing I suppose I need to ask: Do the devices actually need to be hooked up and communicating with the controller, before the monitor modules will register them? The physical devices are not hooked up yet. I don't have the TVs yet, but I could easily connect to a projector, to see if that changes anything.

    Thanks!


    I do not use the AMX SDK. I wrote my own. (it's one module and one include for everything) I won't waste everyone's time here bagging on the AMX SDK. but I will say you might want to just get used to the idea of watching terminal with messages on when programming for RMS. I'd also watch whatever device you declared as the vdvRMS. (usually 41001) It is very chatting and even helpful when it comes to things like this.
  • NZRobNZRob Member Posts: 70
    I had the same issues - it was all around 251 and 252 not turning on
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    ericmedley wrote: »
    I do not use the AMX SDK. I wrote my own. (it's one module and one include for everything)

    Rolling my own is how I've always done it in the past, and I still have a strong inclination towards abandoning the canned SDK modules. The API itself is a fairly simple DOM. I was just hoping the canned stuff would work well enough that I would spend less time with it, than I would rolling my own. Heck, I rolled my own one-off, using a cheesy Filemaker database as the backend, a few years ago. But now, we've got more RPM-based Massio units than custom-programmed units on campus. So, I'm kinda stuck getting the custom programmed controllers connected to RPM.

    How much you want for a copy of your files, Eric?
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    NZRob wrote: »
    I had the same issues - it was all around 251 and 252 not turning on

    I'm confused about this; I see the references to 251 for the vdvRMS, but not for any other virtual devices. And, I can't find any reference to 252 in the RMS Netlinx Programmer's Guide doc. Is the channels 251/252 issue relevant for every virtual?
  • javery1javery1 Junior Member Posts: 21
    The device modules should set 252 On (on the virtual device) when it has finished initializing itself, and 251 when it is actually communicating with the device. The SDK monitor modules do look for these. If the device is not present, or if the device module doesn't set these channels to On, by default the monitor modules will not register the asset. Once registered, the SDK monitor modules will use channel 251 to flag the asset as online or offline.

    If you're using Duet modules to control the device, 251/252 should already be taken care of by the Duet module. As soon as the device is online it will register the asset with RMS.

    If, for instance, you're programming a projector, but don't have the projector currently physically connected to the system, use Control a Device, turn On 251 and 252 for the projector's virtual device, and you should see the projector asset register in RMS.
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    javery1 wrote: »
    If, for instance, you're programming a projector, but don't have the projector currently physically connected to the system, use Control a Device, turn On 251 and 252 for the projector's virtual device, and you should see the projector asset register in RMS.

    Aha! Thank you for the lightbulb!
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    Wait, no... that didn't work in my case. It makes sense, but it doesn't actually work. I want to blame Netlinx Studio's Control a Device though, I can't get it to control anything anywhere right now. It'll be easy enough to connect to a projector to test.
  • javery1javery1 Junior Member Posts: 21
    Control/Emulate always seem to be hit-and-miss for me. You could always add to the online event of the virtual device, on[vdvMyDevice,251], etc.

    I think eventually I'm going to take ericmedley's approach and write my own, but it's not the most straight-forward protocol and of course the documentation leaves much to be desired.
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    javery1 wrote: »
    Control/Emulate always seem to be hit-and-miss for me.

    Same here, thanks for the additional tips to get around that. I already have debug hooks in my code almost everywhere I would ever need to interact with RMS, so it might not be that hard to add the API commands right under my debug hooks. Almost always more than one way to skin that cat, as the expression goes.
  • fogled@mizzou[email protected] h4x354x0r Posts: 549
    Wait, no... that didn't work in my case.

    CORRECTION: Yes, it did! I didn't see any kind of chatter in the controller from toggling the states of 251 and 252, but my RMS server had burped again (whole different problem, keeps halting on a bogus license error, happens all the time, heavy sigh) and needed a reboot before I could get logged in and see the device registered in the RMS UI.

    So, I can confirm the channel 251/252 thing to force RMS registration of devices that are not actually hooked up yet. It seems a little curious that the 5001:x:0 RS232 ports come online, but I guess it still reads the "device connected" state for the wiring to tell if it's connected? Or does it just spark up any kind of chatter? I still don't quite understand that, but as long as it works, I'm willing to slap the blinders on and trot forward.

    Thanks everyone!
  • javery1javery1 Junior Member Posts: 21
    It is entirely dependent on the RMS monitor module. If you look at the include file RmsMonitorCommon (which is included by all of the SDK 3rd-party device monitor modules), you can see the code that checks the state of channel 251 before registering:
    DEFINE_FUNCTION RegisterAssetWrapper()
    {
      STACK_VAR RmsAsset asset;
    
      // first, make sure that the RMS client
      // is ready to accept asset registrations
      // or asset parameter updates
      IF([vdvRMS,RMS_CHANNEL_ASSETS_REGISTER])
      {
    #IF_DEFINED SNAPI_MONITOR_MODULE
        // if a SNAPI module is invoking this function, then we need to
        // make sure that the SNAPI device is DATA_INITIALIZED and ready
        // to register it's data with RMS
        IF(DEVICE_ID(vdvDeviceModule) && [vdvDeviceModule,DATA_INITIALIZED])
        {
    #END_IF
            // if this asset is ONLINE
            IF(DEVICE_ID(dvMonitoredDevice))
            {
              // set specific overriding asset name
              IF(MONITOR_ASSET_NAME != '')
              {
                asset.name = MONITOR_ASSET_NAME
              }
    
              // skip this callback invocation if this
              // precompiler variable is detected
              #IF_NOT_DEFINED RMS_EXCLUDE_ASSET_REGISTER_CALLBACK
    
                // perform registration of this asset
                RegisterAsset(asset);
    
              #END_IF
    
              // cache asset client key for later use
              assetClientKey = asset.clientKey;
            }
    
    #IF_DEFINED SNAPI_MONITOR_MODULE
        }
    #END_IF
      }
    }
    

    If you write your own monitor modules, you can write them to register the asset regardless of the state of 251/252 (look at RmsVirtualDeviceMonitor).

Sign In or Register to comment.