Improved FrameIO support and proxy messaging

Specific changes:
- FrameIO support for Mac OS X (making testing easier)
- Message passing between root and child devices implemented
  (example use in simulated_olt and simulated_onu adapters
- Making FrameIOMgr accessible via registry so that modules
  can easily reach it
- Making "main" to be a registered component so that command
  line args and config file based info is accessible to all.
- Minor clean-ups and improvements

Change-Id: I6812dd5b198fef5cb19f17fc8d7948d3fba8b625
diff --git a/voltha/main.py b/voltha/main.py
index 44cd416..18ed7ad 100755
--- a/voltha/main.py
+++ b/voltha/main.py
@@ -22,6 +22,7 @@
 import time
 
 import yaml
+from simplejson import dumps
 from twisted.internet.defer import inlineCallbacks
 from zope.interface import implementer
 
@@ -37,6 +38,8 @@
 from voltha.northbound.rest.health_check import init_rest_service
 from voltha.protos.common_pb2 import LogLevel
 from voltha.registry import registry, IComponent
+from common.frameio.frameio import FrameIOManager
+
 
 VERSION = '0.9.0'
 
@@ -229,7 +232,7 @@
 
         if not args.no_heartbeat:
             self.start_heartbeat()
-            self.start_kafka_heartbeat()
+            self.start_kafka_heartbeat(args.instance_id)
 
     def start(self):
         self.start_reactor()  # will not return except Keyboard interrupt
@@ -285,6 +288,11 @@
             ).start()
 
             yield registry.register(
+                'frameio',
+                FrameIOManager()
+            ).start()
+
+            yield registry.register(
                 'adapter_loader',
                 AdapterLoader(config=self.config.get('adapter_loader', {}))
             ).start()
@@ -323,20 +331,26 @@
 
     # Temporary function to send a heartbeat message to the external kafka
     # broker
-    def start_kafka_heartbeat(self):
+    def start_kafka_heartbeat(self, instance_id):
         # For heartbeat we will send a message to a specific "voltha-heartbeat"
         #  topic.  The message is a protocol buf
         # message
-        message = 'Heartbeat message:{}'.format(get_my_primary_local_ipv4())
-        topic = "voltha-heartbeat"
+        message = dumps(dict(
+            type='heartbeat',
+            voltha_instance=instance_id,
+            ip=get_my_primary_local_ipv4()
+        ))
+        topic = "heartbeat.voltha"
 
         from twisted.internet.task import LoopingCall
         kafka_proxy = get_kafka_proxy()
         if kafka_proxy:
             lc = LoopingCall(kafka_proxy.send_message, topic, message)
             lc.start(10)
+            pass
         else:
             self.log.error('Kafka proxy has not been created!')
 
+
 if __name__ == '__main__':
     Main().start()