/* $Id$ * $URL$ * * generic driver helper for GPO's * * Copyright (C) 2005 Michael Reinelt * Copyright (C) 2005 The LCD4Linux Team * * This file is part of LCD4Linux. * * LCD4Linux is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * LCD4Linux is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /* * * exported variables: * * extern int GPIS, GPOS; number of Inputs and Outputs * * * these functions must be implemented by the real driver: * * int (*drv_generic_gpio_real_set) (const int num, const int val); * sets GPO num to val, returns the actual value * * int (*drv_generic_gpio_real_get) (const int num); * reads GPI num * * * exported fuctions: * * int drv_generic_gpio_init(const char *section, const char *driver) * initializes the generic GPIO driver * * int drv_generic_gpio_clear(void); * resets all GPO's * * int drv_generic_gpio_get (const int num) * returns value og GPI #num * * int drv_generic_gpio_draw(WIDGET * W) * 'draws' GPO widget * calls drv_generic_gpio_real_set() * * int drv_generic_gpio_quit(void) * closes the generic GPIO driver * */ #include "config.h" #include #include "debug.h" #include "plugin.h" #include "widget.h" #include "widget_gpo.h" #include "drv_generic_gpio.h" #ifdef WITH_DMALLOC #include #endif #define MAX_GPIS 32 #define MAX_GPOS 32 static char *Section = NULL; static char *Driver = NULL; static int GPI[MAX_GPIS]; static int GPO[MAX_GPOS]; int GPOS = 0; int GPIS = 0; int (*drv_generic_gpio_real_set) () = NULL; int (*drv_generic_gpio_real_get) () = NULL; static void drv_generic_gpio_plugin_gpi(RESULT * result, RESULT * arg1) { int num; double val; num = R2N(arg1); if (num <= 0 || num > GPIS) { error("%s::GPI(%d): GPI out of range (1..%d)", Driver, num, GPIS); SetResult(&result, R_STRING, ""); return; } val = drv_generic_gpio_get(num - 1); SetResult(&result, R_NUMBER, &val); } static void drv_generic_gpio_plugin_gpo(RESULT * result, const int argc, RESULT * argv[]) { int num, val; double gpo; switch (argc) { case 1: num = R2N(argv[0]); if (num <= 0 || num > GPOS) { error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS); SetResult(&result, R_STRING, ""); return; } gpo = GPO[num - 1]; SetResult(&result, R_NUMBER, &gpo); break; case 2: num = R2N(argv[0]); val = R2N(argv[1]); if (num <= 0 || num > GPOS) { error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS); SetResult(&result, R_STRING, ""); return; } if (GPO[num - 1] != val) { if (drv_generic_gpio_real_set) GPO[num - 1] = drv_generic_gpio_real_set(num - 1, val); } gpo = GPO[num - 1]; SetResult(&result, R_NUMBER, &gpo); break; default: error("%s::GPO(): wrong number of parameters", Driver); SetResult(&result, R_STRING, ""); } } int drv_generic_gpio_init(const char *section, const char *driver) { WIDGET_CLASS wc; Section = (char *) section; Driver = (char *) driver; info("%s: using %d GPI's and %d GPO's", Driver, GPIS, GPOS); /* reset all GPO's */ drv_generic_gpio_clear(); /* register gpo widget */ wc = Widget_GPO; wc.draw = drv_generic_gpio_draw; widget_register(&wc); /* register plugins */ AddFunction("LCD::GPI", 1, drv_generic_gpio_plugin_gpi); AddFunction("LCD::GPO", -1, drv_generic_gpio_plugin_gpo); return 0; } int drv_generic_gpio_clear(void) { int i; /* clear GPI buffer */ for (i = 0; i < MAX_GPIS; i++) { GPI[i] = 0; } /* clear GPO buffer */ for (i = 0; i < MAX_GPOS; i++) { GPO[i] = 0; } /* really clear GPO's */ for (i = 0; i < GPOS; i++) { if (drv_generic_gpio_real_set) GPO[i] = drv_generic_gpio_real_set(i, 0); } return 0; } int drv_generic_gpio_get(const int num) { int val = 0; if (num < 0 || num >= GPIS) { error("%s: gpio_get(%d): GPI out of range (0..%d)", Driver, num + 1, GPIS); return -1; } if (drv_generic_gpio_real_get) val = drv_generic_gpio_real_get(num); GPI[num] = val; return val; } int drv_generic_gpio_draw(WIDGET * W) { WIDGET_GPO *gpo = W->data; int num, val; num = W->row; val = P2N(&gpo->expression); if (num < 0 || num >= GPOS) { error("%s: gpio_draw(%d): GPO out of range (0..%d)", Driver, num + 1, GPOS); return -1; } if (GPO[num] != val) { if (drv_generic_gpio_real_set) GPO[num] = drv_generic_gpio_real_set(num, val); } return 0; } int drv_generic_gpio_quit(void) { info("%s: shutting down GPIO driver.", Driver); drv_generic_gpio_clear(); return 0; } ighlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Te Aroha, Waikato NZ
#
# Channel allocation details for NZ can be found at
# http://en.wikipedia.org/wiki/Freeview_(New_Zealand)
#
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy

T 674000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
T 690000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE
T 706000000 8MHz 3/4 NONE QAM64 8k 1/16 NONE